Compare commits
	
		
			No commits in common. "12e957fedda5e17fb7c00878a8124bcf35991c43" and "6facd2a2cca0b23365a72a9f7b7487fb1a119799" have entirely different histories.
		
	
	
		
			12e957fedd
			...
			6facd2a2cc
		
	
		
					 16 changed files with 122 additions and 382 deletions
				
			
		|  | @ -46,7 +46,6 @@ Features | ||||||
|   * computing member balance |   * computing member balance | ||||||
| * generating static web output for member pages in dokuwiki | * generating static web output for member pages in dokuwiki | ||||||
| * exporting brmdoor cards lists | * exporting brmdoor cards lists | ||||||
| * synchronization of mailinglist subscriptions with member files |  | ||||||
| 
 | 
 | ||||||
| Requirements | Requirements | ||||||
| ------------ | ------------ | ||||||
|  | @ -60,7 +59,6 @@ Build requirements: | ||||||
| * make (tested with GNU make) | * make (tested with GNU make) | ||||||
| * Chicken eggs (chicken-install) | * Chicken eggs (chicken-install) | ||||||
|   * sqlite3 |   * sqlite3 | ||||||
|   * srfi-1 |  | ||||||
| 
 | 
 | ||||||
| Runtime requirements: | Runtime requirements: | ||||||
| 
 | 
 | ||||||
|  | @ -72,10 +70,6 @@ Runtime requirements: | ||||||
| Building | Building | ||||||
| -------- | -------- | ||||||
| 
 | 
 | ||||||
| All the eggs used are installed in the source tree using: |  | ||||||
| 
 |  | ||||||
|     sh install-eggs.sh |  | ||||||
| 
 |  | ||||||
| Building static binary: | Building static binary: | ||||||
| 
 | 
 | ||||||
|     make static |     make static | ||||||
|  |  | ||||||
|  | @ -388,16 +388,6 @@ quoted-printable sequences. | ||||||
| Returns the ```str``` with all characters converted to upper case | Returns the ```str``` with all characters converted to upper case | ||||||
| using ```char-upcase```. Does not work with UTF-8. | using ```char-upcase```. Does not work with UTF-8. | ||||||
| 
 | 
 | ||||||
| ### string-capitalize [procedure] |  | ||||||
| 
 |  | ||||||
|     (string-capitalize str) |  | ||||||
| 
 |  | ||||||
| * ```str``` - arbitrary string |  | ||||||
| 
 |  | ||||||
| Returns the ```str``` with the first character converted to upper case |  | ||||||
| using ```char-upcase``` and the remainder converted to lower case |  | ||||||
| using ```char-downcase```. Does not work with UTF-8. |  | ||||||
| 
 |  | ||||||
| ## util-mail [module] | ## util-mail [module] | ||||||
| 
 | 
 | ||||||
|     (import util-mail) |     (import util-mail) | ||||||
|  |  | ||||||
							
								
								
									
										15
									
								
								src/Makefile
									
										
									
									
									
								
							
							
						
						
									
										15
									
								
								src/Makefile
									
										
									
									
									
								
							|  | @ -59,7 +59,7 @@ HACKERBASE-OBJS=hackerbase.o testing.o listing.o cal-month.o		\ | ||||||
| 	 template-list-expander.o box-drawing.o export-web-static.o	\
 | 	 template-list-expander.o box-drawing.o export-web-static.o	\
 | ||||||
| 	 util-dir.o dokuwiki.o racket-kwargs.o duck.o util-bst.o	\
 | 	 util-dir.o dokuwiki.o racket-kwargs.o duck.o util-bst.o	\
 | ||||||
| 	 util-bst-bdict.o util-bst-ldict.o util-bst-lset.o mailman2.o	\
 | 	 util-bst-bdict.o util-bst-ldict.o util-bst-lset.o mailman2.o	\
 | ||||||
| 	 mailman-common.o mailman3.o mailman3-sql.o tiocgwinsz.o | 	 mailman-common.o mailman3.o mailman3-sql.o | ||||||
| 
 | 
 | ||||||
| GENDOC-SOURCES=gendoc.scm duck-extract.import.scm			\
 | GENDOC-SOURCES=gendoc.scm duck-extract.import.scm			\
 | ||||||
| 	util-time.import.scm util-csv.import.scm util-git.import.scm	\
 | 	util-time.import.scm util-csv.import.scm util-git.import.scm	\
 | ||||||
|  | @ -68,15 +68,14 @@ GENDOC-SOURCES=gendoc.scm duck-extract.import.scm			\ | ||||||
| 	util-format.import.scm util-tag.import.scm			\
 | 	util-format.import.scm util-tag.import.scm			\
 | ||||||
| 	util-string.import.scm util-bst.import.scm			\
 | 	util-string.import.scm util-bst.import.scm			\
 | ||||||
| 	util-bst-bdict.import.scm util-bst-ldict.import.scm		\
 | 	util-bst-bdict.import.scm util-bst-ldict.import.scm		\
 | ||||||
| 	util-dir.import.scm util-utf8.import.scm util-mail.import.scm	\
 | 	util-dir.import.scm util-utf8.import.scm | ||||||
| 	util-bst-lset.import.scm |  | ||||||
| 
 | 
 | ||||||
| GENDOC-OBJS=gendoc.o duck-extract.o util-time.o util-csv.o util-io.o	\
 | GENDOC-OBJS=gendoc.o duck-extract.o util-time.o util-csv.o util-io.o	\
 | ||||||
| 	progress.o testing.o util-proc.o util-git.o util-io.o		\
 | 	progress.o testing.o util-proc.o util-git.o util-io.o		\
 | ||||||
| 	util-stdout.o util-parser.o util-proc.o util-format.o		\
 | 	util-stdout.o util-parser.o util-proc.o util-format.o		\
 | ||||||
| 	racket-kwargs.o util-bst-ldict.o util-tag.o duck.o		\
 | 	racket-kwargs.o util-bst-ldict.o util-tag.o duck.o		\
 | ||||||
| 	util-string.o util-bst.o util-bst-bdict.o util-bst-ldict.o	\
 | 	util-string.o util-bst.o util-bst-bdict.o util-bst-ldict.o	\
 | ||||||
| 	util-dir.o util-utf8.o util-bst-lset.o util-mail.o | 	util-dir.o util-utf8.o | ||||||
| 
 | 
 | ||||||
| .PHONY: imports | .PHONY: imports | ||||||
| imports: $(HACKERBASE-DEPS) | imports: $(HACKERBASE-DEPS) | ||||||
|  | @ -206,8 +205,7 @@ MEMBERS-PRINT-SOURCES=members-print.scm util-bst-ldict.import.scm	\ | ||||||
| 	bank-account.import.scm members-fees.import.scm			\
 | 	bank-account.import.scm members-fees.import.scm			\
 | ||||||
| 	members-payments.import.scm brmember-format.import.scm		\
 | 	members-payments.import.scm brmember-format.import.scm		\
 | ||||||
| 	specification.import.scm cal-format.import.scm			\
 | 	specification.import.scm cal-format.import.scm			\
 | ||||||
| 	util-git.import.scm racket-kwargs.import.scm			\
 | 	util-git.import.scm racket-kwargs.import.scm | ||||||
| 	tiocgwinsz.import.scm |  | ||||||
| 
 | 
 | ||||||
| members-print.o: members-print.import.scm | members-print.o: members-print.import.scm | ||||||
| members-print.import.scm: $(MEMBERS-PRINT-SOURCES) | members-print.import.scm: $(MEMBERS-PRINT-SOURCES) | ||||||
|  | @ -545,8 +543,3 @@ MAILMAN3-SQL-SOURCES=mailman3-sql.scm configuration.import.scm | ||||||
| 
 | 
 | ||||||
| mailman3-sql.o: mailman3-sql.import.scm | mailman3-sql.o: mailman3-sql.import.scm | ||||||
| mailman3-sql.import.scm: $(MAILMAN3-SQL-SOURCES) | mailman3-sql.import.scm: $(MAILMAN3-SQL-SOURCES) | ||||||
| 
 |  | ||||||
| TIOCGWINSZ-SOURCES=tiocgwinsz.scm duck.import.scm |  | ||||||
| 
 |  | ||||||
| tiocgwinsz.o: tiocgwinsz.import.scm |  | ||||||
| tiocgwinsz.import.scm: $(TIOCGWINSZ-SOURCES) |  | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| ;; | ;; | ||||||
| ;; configuration.scm | ;; configuraiton.scm | ||||||
| ;; | ;; | ||||||
| ;; Configuration parameters used by various modules. | ;; Configuration parameters used by various modules. | ||||||
| ;; | ;; | ||||||
|  |  | ||||||
|  | @ -1,27 +1,3 @@ | ||||||
| ;; |  | ||||||
| ;; gendoc.scm |  | ||||||
| ;; |  | ||||||
| ;; Generate documentation for all documented modules dynamically. |  | ||||||
| ;; |  | ||||||
| ;; 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 duck-extract) | (import duck-extract) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -62,7 +62,6 @@ | ||||||
| (define -web-dir- (make-parameter #f)) | (define -web-dir- (make-parameter #f)) | ||||||
| (define -normal-month- (make-parameter #t)) | (define -normal-month- (make-parameter #t)) | ||||||
| (define -show-destroyed- (make-parameter #f)) | (define -show-destroyed- (make-parameter #f)) | ||||||
| (define -show-only-active- (make-parameter #f)) |  | ||||||
| (define -notify-months- (make-parameter 1)) | (define -notify-months- (make-parameter 1)) | ||||||
| (define -send-emails- (make-parameter #f)) | (define -send-emails- (make-parameter #f)) | ||||||
| 
 | 
 | ||||||
|  | @ -138,8 +137,6 @@ | ||||||
|  "Misc options:" |  "Misc options:" | ||||||
|  (-destroyed () "Show destroyed members in -fees" |  (-destroyed () "Show destroyed members in -fees" | ||||||
| 	     (-show-destroyed- #t)) | 	     (-show-destroyed- #t)) | ||||||
|  (-only-active () "Show only active members in -fees" |  | ||||||
| 	       (-show-only-active- #t)) |  | ||||||
|  "" |  "" | ||||||
|  "Base Actions:" |  "Base Actions:" | ||||||
|  (-info () "Print information" |  (-info () "Print information" | ||||||
|  | @ -375,7 +372,7 @@ | ||||||
|    (newline) |    (newline) | ||||||
|    (if mr |    (if mr | ||||||
|        (print-member-balances-table mr) |        (print-member-balances-table mr) | ||||||
|        (print-members-fees-table MB (-show-destroyed-) (-show-only-active-)))) |        (print-members-fees-table MB (-show-destroyed-)))) | ||||||
|   ((repl) |   ((repl) | ||||||
|    (repl)) |    (repl)) | ||||||
|   ((genweb) |   ((genweb) | ||||||
|  | @ -409,7 +406,7 @@ | ||||||
|      (if (null? nmembers) |      (if (null? nmembers) | ||||||
| 	 (print "Everyone paid on time.") | 	 (print "Everyone paid on time.") | ||||||
| 	 (let () | 	 (let () | ||||||
| 	   (stdout-print "Notify" (-notify-months-)) | 	   (print "Notify" (-notify-months-)) | ||||||
| 	   (let loop ((lst nmembers)) | 	   (let loop ((lst nmembers)) | ||||||
| 	     (when (and (not (null? lst)) | 	     (when (and (not (null? lst)) | ||||||
| 			(or (not mr) | 			(or (not mr) | ||||||
|  |  | ||||||
|  | @ -45,11 +45,7 @@ | ||||||
|  ;; Returns (possibly cached) SQLite3 DB handle |  ;; Returns (possibly cached) SQLite3 DB handle | ||||||
|  (define (mailman3-db) |  (define (mailman3-db) | ||||||
|    (when (not (*cached-mailman3-db*)) |    (when (not (*cached-mailman3-db*)) | ||||||
|      (*cached-mailman3-db* |      (*cached-mailman3-db* (open-database (*mailman3-sql-path*)))) | ||||||
|       (let ((handler (make-busy-timeout 2000))) |  | ||||||
| 	(let ((db (open-database (*mailman3-sql-path*)))) |  | ||||||
| 	  (set-busy-handler! db handler) |  | ||||||
| 	  db)))) |  | ||||||
|    (*cached-mailman3-db*)) |    (*cached-mailman3-db*)) | ||||||
| 
 | 
 | ||||||
|  ;; Returns the list of mailman3 mailinglists by querying te |  ;; Returns the list of mailman3 mailinglists by querying te | ||||||
|  |  | ||||||
|  | @ -77,25 +77,13 @@ | ||||||
| 	       (string->number | 	       (string->number | ||||||
| 		(bank-transaction-varsym transaction))) | 		(bank-transaction-varsym transaction))) | ||||||
| 	      (varsym-id | 	      (varsym-id | ||||||
| 	       (if (and varsym-id0 | 	       (or varsym-id0 | ||||||
| 			(> varsym-id0 1000)) |  | ||||||
| 		   varsym-id0 |  | ||||||
| 		   (let* ((msg (bank-transaction-message transaction)) | 		   (let* ((msg (bank-transaction-message transaction)) | ||||||
| 			  (ci1 (substring-index "," msg)) | 			  (ci (substring-index "," msg)) | ||||||
| 			  (vs1 (if ci1 | 			  (vs (if ci | ||||||
| 				   (substring msg 0 ci1) | 				  (substring msg 0 ci) | ||||||
| 				   msg)) | 				  msg))) | ||||||
| 			  (ci2 (substring-index " " msg)) | 		     (string->number vs))))) | ||||||
| 			  (vs2 (if ci2 |  | ||||||
| 				   (substring msg 0 ci2) |  | ||||||
| 				   msg)) |  | ||||||
| 			  (ci3 (substring-index "NULL" msg)) |  | ||||||
| 			  (vs3 (if ci3 |  | ||||||
| 				   (substring msg (+ ci3 4) (+ ci3 4 4)) |  | ||||||
| 				   msg))) |  | ||||||
| 		     (or (string->number vs1) |  | ||||||
| 			 (string->number vs2) |  | ||||||
| 			 (string->number vs3)))))) |  | ||||||
| 	 varsym-id))) | 	 varsym-id))) | ||||||
| 
 | 
 | ||||||
|  ;; Special comparator (originally with JendaSAP hack) |  ;; Special comparator (originally with JendaSAP hack) | ||||||
|  |  | ||||||
|  | @ -67,8 +67,7 @@ | ||||||
| 	 cal-format | 	 cal-format | ||||||
| 	 util-git | 	 util-git | ||||||
| 	 cal-day | 	 cal-day | ||||||
| 	 racket-kwargs | 	 racket-kwargs) | ||||||
| 	 tiocgwinsz) |  | ||||||
| 
 | 
 | ||||||
|  (define *show-payments-count* (make-parameter 36)) |  (define *show-payments-count* (make-parameter 36)) | ||||||
| 
 | 
 | ||||||
|  | @ -268,9 +267,11 @@ | ||||||
|  (define (members-table-row a:? label mrs fmt) |  (define (members-table-row a:? label mrs fmt) | ||||||
|    (list (string-append "\t" a:? label) |    (list (string-append "\t" a:? label) | ||||||
| 	 (length mrs) | 	 (length mrs) | ||||||
| 	 (member-records->string | 	 (ansi-paragraph-format | ||||||
| 	  (sort mrs brmember<?) | 	  (member-records->string | ||||||
| 	  fmt))) | 	   (sort mrs brmember<?) | ||||||
|  | 	   fmt) | ||||||
|  | 	  60))) | ||||||
| 
 | 
 | ||||||
|  ;; Generic table of members attributes |  ;; Generic table of members attributes | ||||||
|  (define (members-attrs-table mrs fmt hdr row) |  (define (members-attrs-table mrs fmt hdr row) | ||||||
|  | @ -300,103 +301,102 @@ | ||||||
| 
 | 
 | ||||||
|  ;; Prints nicely aligned members base info |  ;; Prints nicely aligned members base info | ||||||
|  (define (print-members-base-table mb) |  (define (print-members-base-table mb) | ||||||
|    (let-values (((rows columns) (term-size))) |    (let* ((total-count (length | ||||||
|      (let* ((total-count (length | 			(find-members-by-predicate mb brmember-usable?))) | ||||||
| 			  (find-members-by-predicate mb brmember-usable?))) | 	  (invalid-mrs (find-members-by-predicate | ||||||
| 	    (invalid-mrs (find-members-by-predicate | 			mb | ||||||
| 			  mb | 			(compose not is-4digit-prime? brmember-id))) | ||||||
| 			  (compose not is-4digit-prime? brmember-id))) | 	  (suspended-mrs (find-members-by-predicate mb brmember-suspended?)) | ||||||
| 	    (suspended-mrs (find-members-by-predicate mb brmember-suspended?)) | 	  (debtor-mrs (sort | ||||||
| 	    (debtor-mrs (sort | 		       (members-to-notify mb 3) | ||||||
| 			 (members-to-notify mb 3) | 		       brmember<?)) | ||||||
| 			 brmember<?)) | 	  (soon-expire-mrs (sort | ||||||
| 	    (soon-expire-mrs (sort | 			    (find-members-by-predicate | ||||||
| 			      (find-members-by-predicate | 			     mb | ||||||
| 			       mb | 			     (brmember-suspended-for 21 24)) | ||||||
| 			       (brmember-suspended-for 21 24)) | 			    brmember<?))) | ||||||
| 			      brmember<?))) |      (print "Known members: " total-count) | ||||||
|        (print "Known members: " total-count) |      (newline) | ||||||
|        (newline) |      (print | ||||||
|        (print |       (table->string | ||||||
| 	(table->string |        (filter | ||||||
| 	 (filter | 	identity | ||||||
| 	  identity | 	(list (list "Type" "Count" "List") | ||||||
| 	  (list (list "Type" "Count" "List") | 	      (members-pred-table-row mb | ||||||
| 		(members-pred-table-row mb | 				      (ansi-string #:yellow "Chair:") | ||||||
| 					(ansi-string #:yellow "Chair:") | 				      brmember-chair? | ||||||
| 					brmember-chair? | 				      "~N") | ||||||
| 					"~N") | 	      (members-pred-table-row mb | ||||||
| 		(members-pred-table-row mb | 				      (ansi-string #:yellow "Council:") | ||||||
| 					(ansi-string #:yellow "Council:") | 				      brmember-council? | ||||||
| 					brmember-council? | 				      "~N") | ||||||
| 					"~N") | 	      (members-pred-table-row mb | ||||||
| 		(members-pred-table-row mb | 				      (ansi-string #:yellow "Revision:") | ||||||
| 					(ansi-string #:yellow "Revision:") | 				      brmember-revision? | ||||||
| 					brmember-revision? | 				      "~N") | ||||||
| 					"~N") | 	      (members-pred-table-row mb | ||||||
| 		(members-pred-table-row mb | 				      (ansi-string #:yellow "Grant:") | ||||||
| 					(ansi-string #:yellow "Grant:") | 				      brmember-grant? | ||||||
| 					brmember-grant? | 				      "~N") | ||||||
| 					"~N") | 	      (members-pred-table-row mb | ||||||
| 		(members-pred-table-row mb | 				      (string-append a:success "Active:") | ||||||
| 					(string-append a:success "Active:") | 				      brmember-active? | ||||||
| 					brmember-active? | 				      "~N~E") | ||||||
| 					"~N~E") | 	      (members-pred-table-row mb | ||||||
| 		(members-pred-table-row mb | 				      (string-append a:highlight "Students:") | ||||||
| 					(string-append a:highlight "Students:") | 				      brmember-student? | ||||||
| 					brmember-student? | 				      "~N~E") | ||||||
| 					"~N~E") | 	      (members-table-row a:warning "Suspended:" suspended-mrs "~N~E (~S)") | ||||||
| 		(members-table-row a:warning "Suspended:" suspended-mrs "~N~E (~S)") | 	      (members-pred-table-row mb | ||||||
| 		(members-pred-table-row mb | 				      (string-append a:warning "Destroyed:") | ||||||
| 					(string-append a:warning "Destroyed:") | 				      brmember-destroyed? | ||||||
| 					brmember-destroyed? | 				      "~N~E") | ||||||
| 					"~N~E") | 	      (let ((suspended2 (filter | ||||||
| 		(let ((suspended2 (filter | 				 (lambda (mr) | ||||||
| 				   (lambda (mr) | 				   (>= (brmember-suspended-months mr) | ||||||
| 				     (>= (brmember-suspended-months mr) | 				       member-suspend-max-months)) | ||||||
| 					 member-suspend-max-months)) | 				 suspended-mrs))) | ||||||
| 				   suspended-mrs))) | 		(if (null? suspended2) | ||||||
| 		  (if (null? suspended2) |  | ||||||
| 		      #f |  | ||||||
| 		      (members-table-row (ansi #:magenta) "Suspended (long):" suspended2 "~N (~S)"))) |  | ||||||
| 		(if (null? soon-expire-mrs) |  | ||||||
| 		    #f | 		    #f | ||||||
| 		    (members-table-row (ansi #:magenta #:bold) "Expire Soon:" | 		    (members-table-row (ansi #:magenta) "Suspended (long):" suspended2 "~N (~S)"))) | ||||||
| 				       soon-expire-mrs "~N (~S)")) | 	      (if (null? soon-expire-mrs) | ||||||
| 		(members-pred-table-row mb | 		  #f | ||||||
| 					(ansi-string #:red #:bold "Prolems:") | 		  (members-table-row (ansi #:magenta #:bold) "Expire Soon:" | ||||||
| 					brmember-has-problems? | 				     soon-expire-mrs "~N (~S)")) | ||||||
| 					"~N~E ~A") | 	      (members-pred-table-row mb | ||||||
| 		(if (null? debtor-mrs) | 				      (ansi-string #:red #:bold "Prolems:") | ||||||
| 		    #f | 				      brmember-has-problems? | ||||||
| 		    (list (ansi-string "\t" #:magenta #:bold "Debtors:") | 				      "~N~E ~A") | ||||||
| 			  (format "~A" (length debtor-mrs)) | 	      (if (null? debtor-mrs) | ||||||
| 			  (table->string | 		  #f | ||||||
| 			   (append | 		  (list (ansi-string "\t" #:magenta #:bold "Debtors:") | ||||||
| 			    (members-attrs-table debtor-mrs | 			(format "~A" (length debtor-mrs)) | ||||||
| 						 brmember-format | 			(table->string | ||||||
| 						 (list "Name" "Balance" "Last Payment") | 			 (append | ||||||
| 						 (list "~N" "\t~B" "~L")) | 			  (members-attrs-table debtor-mrs | ||||||
| 			    (list | 					       brmember-format | ||||||
| 			     (list | 					       (list "Name" "Balance" "Last Payment") | ||||||
| 			      "Total" | 					       (list "~N" "\t~B" "~L")) | ||||||
| 			      (format | 			  (list | ||||||
| 			       "\t~A" | 			   (list | ||||||
| 			       (foldr | 			    "Total" | ||||||
| 				(lambda (v a) | 			    (format | ||||||
| 				  (+ (member-total-balance v) a)) | 			     "\t~A" | ||||||
| 				0 | 			     (foldr | ||||||
| 				debtor-mrs))))) | 			      (lambda (v a) | ||||||
| 			   #:border '(((#:bottom #:right light) ... (#:bottom light)) | 				(+ (member-total-balance v) a)) | ||||||
| 				      ((#:right light) ... none) ... | 			      0 | ||||||
| 				      ((#:top #:right light) ... (#:top light))) | 			      debtor-mrs))))) | ||||||
| 			   #:ansi-reset? #t))) | 			 #:border '(((#:bottom #:right light) ... (#:bottom light)) | ||||||
| 		)) | 				    ((#:right light) ... none) ... | ||||||
| 	 #:border '(((#:bottom #:right light) ... (#:bottom light)) | 				    ((#:top #:right light) ... (#:top light))) | ||||||
| 		    ... | 			 #:ansi-reset? #t))) | ||||||
| 		    ((#:right light) ... none)) | 	      )) | ||||||
| 	 #:width (- columns 10) |        #:border '(((#:bottom #:right light) ... (#:bottom light)) | ||||||
| 	 #:ansi-reset? #t)))) | 		  ... | ||||||
|  | 		  ((#:right light) ... none)) | ||||||
|  |        #:width 70 | ||||||
|  |        #:ansi-reset? #t))) | ||||||
|    (let ((pmrs (find-members-by-predicate mb brmember-file-has-problems?))) |    (let ((pmrs (find-members-by-predicate mb brmember-file-has-problems?))) | ||||||
|      (when (not (null? pmrs)) |      (when (not (null? pmrs)) | ||||||
|        (newline) |        (newline) | ||||||
|  | @ -471,14 +471,10 @@ | ||||||
| 	      ")")))) | 	      ")")))) | ||||||
| 
 | 
 | ||||||
|  ;; Prints summary table of all fees and credits for all members |  ;; Prints summary table of all fees and credits for all members | ||||||
|  (define (print-members-fees-table MB . dsa) |  (define (print-members-fees-table MB . ds) | ||||||
|    (let ((destroyed? (if (null? dsa) |    (let ((destroyed? (if (null? ds) | ||||||
| 			 #f | 			 #f | ||||||
| 			 (car dsa))) | 			 (car ds)))) | ||||||
| 	 (only-active? (if (or (null? dsa) |  | ||||||
| 			       (null? (cdr dsa))) |  | ||||||
| 			   #f |  | ||||||
| 			   (cadr dsa)))) |  | ||||||
|      (let* ((members ;; Pass 1 |      (let* ((members ;; Pass 1 | ||||||
| 	     (map | 	     (map | ||||||
| 	      (lambda (mr) | 	      (lambda (mr) | ||||||
|  | @ -504,11 +500,8 @@ | ||||||
| 	      (sort | 	      (sort | ||||||
| 	       (if destroyed? | 	       (if destroyed? | ||||||
| 		   (find-members-by-predicate MB (lambda x #t)) | 		   (find-members-by-predicate MB (lambda x #t)) | ||||||
| 		   (if only-active? | 		   (find-members-by-predicate MB (lambda (mr) | ||||||
| 		       (find-members-by-predicate MB (lambda (mr) | 						   (not (brmember-destroyed? mr))))) | ||||||
| 						       (brmember-active? mr))) |  | ||||||
| 		       (find-members-by-predicate MB (lambda (mr) |  | ||||||
| 						       (not (brmember-destroyed? mr)))))) |  | ||||||
| 	       brmember<?))) | 	       brmember<?))) | ||||||
| 	    (balances (map (lambda (m) | 	    (balances (map (lambda (m) | ||||||
| 			     (list-ref m 6)) | 			     (list-ref m 6)) | ||||||
|  |  | ||||||
|  | @ -227,39 +227,11 @@ | ||||||
| 		 #:border '(((#:bottom #:right light) ... (#:bottom light)) | 		 #:border '(((#:bottom #:right light) ... (#:bottom light)) | ||||||
| 			    ((#:right light) ... none) | 			    ((#:right light) ... none) | ||||||
| 			    ...) | 			    ...) | ||||||
| 		 )))) | 		 ))))) | ||||||
| 	  (dwpu (filter (lambda (dwu) |  | ||||||
| 			  (or (member "member" (list-ref dwu 3)) |  | ||||||
| 			      (member "council" (list-ref dwu 3)) |  | ||||||
| 			      (member "admin" (list-ref dwu 3)))) |  | ||||||
| 			(ldict-ref mb 'dokuwiki))) |  | ||||||
| 	  (dw-lst |  | ||||||
| 	   (if (null? dwpu) |  | ||||||
| 	       '() |  | ||||||
| 	       (list "" |  | ||||||
| 		     "DokuWiki users (non-members) in wrong group(s):" |  | ||||||
| 		     (string-append |  | ||||||
| 		      "  " |  | ||||||
| 		      (string-intersperse |  | ||||||
| 		       (map car dwpu) |  | ||||||
| 		       ", "))))) |  | ||||||
| 	  (dwmu (find-members-by-predicate mb (compose not brmember-dokuwiki-groups-ok?))) |  | ||||||
| 	  (dw2-lst |  | ||||||
| 	   (if (null? dwmu) |  | ||||||
| 	       '() |  | ||||||
| 	       (list "" |  | ||||||
| 		     "Members in wrong dokuwiki group(s):" |  | ||||||
| 		     (string-append |  | ||||||
| 		      "  " |  | ||||||
| 		      (string-intersperse |  | ||||||
| 		       (map brmember-nick dwmu) |  | ||||||
| 		       ", ")))))) |  | ||||||
|      (append income-lst |      (append income-lst | ||||||
| 	     unpaired-lst | 	     unpaired-lst | ||||||
| 	     debtors-lst | 	     debtors-lst | ||||||
| 	     boring-lst | 	     boring-lst | ||||||
| 	     dw-lst |  | ||||||
| 	     dw2-lst |  | ||||||
| 	     (list "" | 	     (list "" | ||||||
| 		   "--" | 		   "--" | ||||||
| 		   "Brmlab Hackerspace Members Database" | 		   "Brmlab Hackerspace Members Database" | ||||||
|  |  | ||||||
|  | @ -39,7 +39,7 @@ | ||||||
| 	 (chicken format)) | 	 (chicken format)) | ||||||
| 
 | 
 | ||||||
|  ;; Short banner |  ;; Short banner | ||||||
|  (define banner-line "HackerBase 1.14 (c) 2023 Brmlab, z.s.") |  (define banner-line "HackerBase 1.12 (c) 2023 Brmlab, z.s.") | ||||||
| 
 | 
 | ||||||
|  ;; Banner source with numbers for ANSI CSI SGR |  ;; Banner source with numbers for ANSI CSI SGR | ||||||
|  (define banner-source " |  (define banner-source " | ||||||
|  |  | ||||||
|  | @ -1,63 +0,0 @@ | ||||||
| ;; |  | ||||||
| ;; tiocgwinsz.scm |  | ||||||
| ;; |  | ||||||
| ;; Get size of current terminal. |  | ||||||
| ;; |  | ||||||
| ;; 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. |  | ||||||
| ;; |  | ||||||
| 
 |  | ||||||
| (declare (unit tiocgwinsz)) |  | ||||||
| 
 |  | ||||||
| (import duck) |  | ||||||
| 
 |  | ||||||
| (foreign-declare "#include <sys/ioctl.h>") |  | ||||||
| 
 |  | ||||||
| (module* |  | ||||||
|  tiocgwinsz |  | ||||||
|  #:doc ("TTY terminal size support.") |  | ||||||
|  ( |  | ||||||
|   term-size |  | ||||||
|   ) |  | ||||||
| 
 |  | ||||||
|  (import scheme |  | ||||||
| 	 (chicken foreign) |  | ||||||
| 	 (chicken bitwise)) |  | ||||||
| 
 |  | ||||||
|  (define tiocgwinsz-ioctl |  | ||||||
|    (foreign-lambda* |  | ||||||
|     int () |  | ||||||
|     " |  | ||||||
| struct winsize wss; |  | ||||||
| if (ioctl(0, TIOCGWINSZ, &wss) == 0) { |  | ||||||
|   C_return(wss.ws_row*65536+wss.ws_col); |  | ||||||
| } else { |  | ||||||
|   C_return(0); |  | ||||||
| } |  | ||||||
| " |  | ||||||
|     )) |  | ||||||
| 
 |  | ||||||
|  (define/doc (term-size) |  | ||||||
|    ("Returns the number of terminal rows and columns.") |  | ||||||
|    (let ((res (tiocgwinsz-ioctl))) |  | ||||||
|      (values  |  | ||||||
|       (arithmetic-shift res -16) |  | ||||||
|       (bitwise-and res #xffff)))) |  | ||||||
| 
 |  | ||||||
|  ) |  | ||||||
|  | @ -1,27 +1,3 @@ | ||||||
| ;; |  | ||||||
| ;; util-bst-bdict.scm |  | ||||||
| ;; |  | ||||||
| ;; BST-based number dictionary. |  | ||||||
| ;; |  | ||||||
| ;; 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. |  | ||||||
| ;; |  | ||||||
| 
 | 
 | ||||||
| (declare (unit util-bst-bdict)) | (declare (unit util-bst-bdict)) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,27 +1,3 @@ | ||||||
| ;; |  | ||||||
| ;; util-bst-ldict.scm |  | ||||||
| ;; |  | ||||||
| ;; BST-based symbol dictionary. |  | ||||||
| ;; |  | ||||||
| ;; 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. |  | ||||||
| ;; |  | ||||||
| 
 | 
 | ||||||
| (declare (unit util-bst-ldict)) | (declare (unit util-bst-ldict)) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,27 +1,3 @@ | ||||||
| ;; |  | ||||||
| ;; util-bst-lset.scm |  | ||||||
| ;; |  | ||||||
| ;; BST-based set implementation. |  | ||||||
| ;; |  | ||||||
| ;; 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. |  | ||||||
| ;; |  | ||||||
| 
 | 
 | ||||||
| (declare (unit util-bst-lset)) | (declare (unit util-bst-lset)) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,27 +1,3 @@ | ||||||
| ;; |  | ||||||
| ;; util-bst.scm |  | ||||||
| ;; |  | ||||||
| ;; Underlying BST implementation for sets and dictionaries. |  | ||||||
| ;; |  | ||||||
| ;; 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. |  | ||||||
| ;; |  | ||||||
| 
 | 
 | ||||||
| (declare (unit util-bst)) | (declare (unit util-bst)) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue