From 2d0ff00ffb9926d51b027d2d8a61e643bd8b9023 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pant=C5=AF=C4=8Dek?= Date: Sat, 25 Mar 2023 21:37:17 +0100 Subject: [PATCH] Add the print module. --- Makefile | 4 +- bbstool.scm | 1 - member-parser.scm | 2 + member-print.scm | 119 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 member-print.scm diff --git a/Makefile b/Makefile index f841d8c..a67d7a0 100644 --- a/Makefile +++ b/Makefile @@ -196,7 +196,9 @@ member-parser.so: member-parser.o member-parser.o: member-parser.import.scm member-parser.import.scm: $(MEMBER-PARSER-SOURCES) -MEMBER-PRINT-SOURCES=member-print.scm +MEMBER-PRINT-SOURCES=member-print.scm dictionary.import.scm \ + member-record.import.scm month.import.scm utils.import.scm \ + table.import.scm member-print.so: member-print.o member-print.o: member-print.import.scm diff --git a/bbstool.scm b/bbstool.scm index e5893d4..517a7c3 100644 --- a/bbstool.scm +++ b/bbstool.scm @@ -131,7 +131,6 @@ CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. (newline) (print "Current month: " (month->string (*current-month*))) (newline) - (print mr) (if mr (print-member-table mr) (print-members-base-table MB)) diff --git a/member-parser.scm b/member-parser.scm index d44f458..c767d83 100644 --- a/member-parser.scm +++ b/member-parser.scm @@ -86,6 +86,8 @@ (if ok? mr1 (member-record-add-highlight mr1 line-number msg 3 'error)))) + ((joined) + (member-record-sub-set mr output key (string->month (car value)))) (else (member-record-sub-set mr output key (car value)))))))) diff --git a/member-print.scm b/member-print.scm new file mode 100644 index 0000000..4ce06e2 --- /dev/null +++ b/member-print.scm @@ -0,0 +1,119 @@ +;; +;; member-print.scm +;; +;; Procedures working with complete member record (as loaded by the +;; members-base). +;; +;; ISC License +;; +;; Copyright 2023 Brmlab, z.s. +;; Dominik Pantůček +;; +;; Permission to use, copy, modify, and/or distribute this software +;; for any purpose with or without fee is hereby granted, provided +;; that the above copyright notice and this permission notice appear +;; in all copies. +;; +;; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +;; WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +;; WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +;; AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +;; CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +;; OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +;; NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +;; CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +;; + +(declare (unit member-print)) + +(module + member-print + ( + print-member-info + print-member-table + ) + + (import scheme + (chicken base) + (chicken string) + (chicken sort) + (chicken format) + dictionary + member-record + month + utils + table) + + ;; Prints human-readable information + (define (print-member-info mr) + (let* ((id (dict-ref mr 'id)) + (aliases (dict-ref mr 'symlinks)) + (info (dict-ref mr 'info)) + (sinfo (sort info + (lambda (a b) + (stringstring (car a)) + (symbol->string (car b))))))) + (print "User " id " alias(es): " + (string-intersperse + (map symbol->string aliases) + ", ")) + (when (member-suspended? mr) + (print " Suspended for " (member-suspended-months mr) " months.")) + (newline) + (let loop ((sinfo sinfo)) + (when (not (null? sinfo)) + (let* ((kv (car sinfo)) + (k (car kv)) + (v (cdr kv))) + (loop (cdr sinfo))))))) + + ;; Prints nicely formatted table + (define (print-member-table mr) + (let* ((aliases (dict-ref mr 'symlinks)) + (head (list (list "ID:" (member-id mr)) + (list (sprintf "Alias~A:" (if (> (length aliases) 1) "es" "")) + (string-intersperse (map symbol->string aliases) ", ")) + (if (member-suspended? mr) + (list "Suspended for:" + (let ((msm (member-suspended-months mr))) + (sprintf "~A month~A" msm + (if (> msm 1) "s" "")))) + #f))) + (info (dict-ref mr 'info)) + (sikeys (sort (dict-keys info) + (lambda (a b) + (stringstring a) + (symbol->string b))))) + (body (map (lambda (k) + (let ((v (dict-ref info k))) + (case k + ((joined) + (list k (month->string v))) + ((card desfire credit) + (list k "xxx" + #;(table->string + (map + (lambda (c) + (list (car c) (cdr c))) + v) + #:col-border #t))) + ((suspend student) + (list k + (table->string + (cons (list "Since" "Until") + (map + (lambda (p) + (list + (month->string (car p)) + (month->string (cdr p)))) + v)) + #:col-border #t))) + (else + (list k v))))) + sikeys)) + (result (filter identity (append head body)))) + (print (table->string result #:table-border #t #:row-border #t #:col-border #t)))) + + )