hackerbase/brmsaptool.scm

140 lines
3.7 KiB
Scheme

;;
;; brmsaptool.scm
;;
;; Brmlab members management tool.
;;
;; ISC License
;;
;; Copyright 2023 Brmlab, z.s.
;; Dominik Pantůček <dominik.pantucek@trustica.cz>
;;
;; 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.
;;
(import testing
listing
dictionary
month
period
member-file
command-line
utils
ansi
members-base
primes)
;; Print banner
(print "brmsaptool 0.2 (c) 2023 Brmlab, z.s.")
(newline)
;; Run tests
(listing-tests!)
(dictionary-tests!)
(month-tests!)
(period-tests!)
(utils-tests!)
(ansi-tests!)
(member-file-tests!)
(command-line-tests!)
(members-base-tests!)
(primes-tests!)
(newline)
;; Command-line options and configurable parameters
(define *members-directory* (make-parameter "members"))
(define -member-id- (make-parameter #f))
(define -member-nick- (make-parameter #f))
(define -action- (make-parameter #f))
;; Arguments parsing
(command-line
print-help
(-h () "This help"
(print "Command-line options:")
(newline)
(print-help)
(newline)
(exit 0))
(-MB (dir) "Members base directory" (*members-directory* dir))
(-mfkw () "Member-File invalid Key Warning" (*member-file-check-syntax* 'warning))
(-mfkq () "Member-File invalid Key Quiet" (*member-file-check-syntax* 'quiet))
(-mfec (n) "Member-File parser Error Context (lines)" (*member-file-context* (string->number n)))
(-mi (id) "Specify member by id" (-member-id- (string->number id)))
(-mn (nick) "Specify member by nick" (-member-nick- nick))
(-pi () "Print information" (-action- 'print-info))
)
;; Load the members database (required for everything anyway)
(define MB (load-members (*members-directory*) #t))
;; If a member is specified by either id or nick, get its record
(define mr (if (-member-id-)
(find-member-by-id MB (-member-id-))
(if (-member-nick-)
(find-member-by-nick MB (-member-nick-))
#f)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
(import (chicken string)
(chicken sort))
(define (print-members-base-info mb)
(let ((nicks (list-members-nicks mb)))
(print "Members ("
(length nicks)
"): "
(string-intersperse
(sort
nicks
string<?)
", "))))
(define (print-member-record-info mr)
(let* ((id (dict-ref mr 'id))
(aliases (dict-ref mr 'symlinks))
(info (dict-ref mr 'info))
(sinfo (sort info
(lambda (a b)
(string<?
(symbol->string (car a))
(symbol->string (car b)))))))
(print "User " id " alias(es): "
(string-intersperse
(map symbol->string aliases)
", "))
(newline)
(let loop ((sinfo sinfo))
(when (not (null? sinfo))
(let* ((kv (car sinfo))
(k (car kv))
(v (cdr kv)))
(print " " k ":\t"
(if (member k '(student suspend))
(periods->string v)
v))
(loop (cdr sinfo)))))))
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Perform requested action
(case (-action-)
((print-info)
(newline)
(if mr
(print-member-record-info mr)
(print-members-base-info MB))
(newline)))