forgot to change copypasta'd code to use newsd instead of uwnews
[kspaans/nntp-to-dot] / userstats.ss
1 ;; Copyright (C) 2009  Kyle Spaans
2 ;;  this program is distributed under the GPL v2 or (at your option)
3 ;;  any later version.
4
5 ;; Calculate a bunch of user statistics:
6 ;; - Number of users
7 ;; - Post counts of users
8 ;; - Average number of posts
9 ;; - posts per day...
10 ;; - new users versus time...
11
12 #lang scheme
13
14 (require "common.ss")
15
16 (provide count-users)
17
18 ;; User Statistics Struct
19 ;; String, int, date, date...
20 (define-struct ustats (user nump firstp lastp))
21
22 ;; Collect stats in the form of '(USERNAME ustats)
23 (define users (make-hash))
24
25 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
26
27 ;; print-stats: void -> void
28 ;; Pretty print the contents of the user statistics table to stdout
29 (define (print-stats)
30   (hash-for-each
31     users
32     (lambda (k v)
33       (printf "User: ~a~nUser: ~a~nCount: ~a~nLast: ~a~nFirst: ~a~n~n"
34               k
35               (ustats-user v)
36               (ustats-nump v)
37               (ustats-lastp v)
38               (ustats-firstp v)))))
39
40 ;; count-users: int int newsgroup -> void
41 ;; build a hash table with each user from the group collecting stats:
42 ;; - number of posts
43 ;; - first/last post
44 ;; So if "last" post is empty, then user has only 1 post - veryify this?
45 (define (count-users first last newsd)
46   (cond
47     [(= first last) (print-stats)]
48     [else (letrec [(message (message-getter newsd first (list from-regexp date-regexp)))
49                    (mesg-from (car message))
50                    (mesg-date (cadr message))]
51                         ;; Fudge, should factor out date-getting code from ppd
52             (cond
53               [(boolean? message) (void)]
54               [else
55                (let [(result (hash-ref users mesg-from #f))]
56                  (cond
57                    [(boolean? result)
58                     (hash-set! users mesg-from (make-ustats mesg-from 1 mesg-date '()))]
59                    [else
60                     (hash-set! users mesg-from (make-ustats
61                                                  mesg-from
62                                                  (+ 1 (ustats-nump result))
63                                                  (ustats-firstp result)
64                                                  mesg-date))]))]))
65           (read-all (+ first 1) last newsd)]))