first steps of user stats functions
[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 user)
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   ...)
31
32 ;; count-users: int int newsgroup -> void
33 ;; build a hash table with each user from the group collecting stats:
34 ;; - number of posts
35 ;; - first/last post
36 ;; So if "last" post is empty, then user has only 1 post - veryify this?
37 (define (count-users first last newsd)
38   (cond
39     [(= first last) (print-stats)]
40     [else (letrec [(message (message-getter uwnews first (list from-regexp date-regexp)))
41                    (mesg-from (car message))
42                    (mesg-date (cadr message))]
43                         ;; Fudge, should factor out date-getting code from ppd
44             (cond
45               [(boolean? message) (void)]
46               [else
47                (let [(result (hash-ref users mesg-from #f))]
48                  (cond
49                    [(boolean? result)
50                     (hash-set! users mesg-from (make-ustats mesg-from 1 mesg-date '()))]
51                    [else
52                     (hash-set! users mesg-from (make-ustats
53                                                  mesg-from
54                                                  (+ 1 (ustats-nump result))
55                                                  (ustats-firstp result)
56                                                  'poop))]))]))
57           (read-all (+ first 1) last newsd)]))