working new users per day
[kspaans/nntp-to-dot] / nntp-to-dot.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 ;; NNTP-TO-DOT - perform various analyses of a newsgroup, generate some
6 ;;               DOT code for plotting with graphviz
7 ;;  FEATURES:
8 ;; - Generate a graph depicting all interactions between users on the group
9 ;; - Count the number of posts made per day
10
11 #lang scheme
12
13 (require net/nntp)
14 (require "common.ss")
15 (require "userrel.ss")
16 (require "thread.ss")
17 (require "ppd.ss")
18 (require "userstats.ss")
19
20 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
21
22 ;; Data structure to capture interactions on the newsgroup.
23 ;;  Want to have FROM and TO fields. Ideally TO should be a list of
24 ;;   people who the from has interacted with. Or perhaps use a hash table?
25 ;;   Yes, want constant insert time for new users (read: node), and then
26 ;;   value can be a list of other users that this user has interacted with.
27 ;;  Should I differentiate between interactions in FROM and TO?
28 ;;  ^^^^^^^^^ I don't think I can. Especailly since I can make it an
29 ;;   undirected graph.
30
31 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32 (define dotfile (open-output-file "data/cs136-trial.dot" #:exists 'truncate))
33 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
34
35 (define uwnews (connect-to-server "news.uwaterloo.ca"))
36 (define-values (total first last) (open-news-group uwnews "uw.cs.cs136"))
37
38 ;; read-all: int int newsgroup -> void
39 ;; recurse over all possible message "numbers" from the newsgroup
40 (define (read-all first last newsd)
41   (cond
42     [(= first last) (printf "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n")]
43     [else (let [(message (message-getter newsd first (list from-regexp subj-regexp mid-regexp ref-regexp date-regexp)))]
44             (cond
45               [(boolean? message) (void)]
46               [else (for-each (lambda (header) (printf "~a~n" header))
47                               message)])
48             (newline))
49           (read-all (+ first 1) last newsd)]))
50
51 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
52 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
53 ;; nntp-map: operation newsgroup (listof header-regexp) -> void
54 ;; maps some operation across each newsgroup post
55 ;;;(define (nntp-map op newsd hregexps)
56 ;;;  (let-values ([(total first-id last-id) (open-news-group newsd "uw.cs.cs136")])
57 ;;;    (op newsd
58 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
59 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
60
61 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
62 ;;(read-all first (+ 100 first) uwnews)
63 ;;(userrel first (+ 800 first) uwnews dotfile)
64
65 ;;(begin
66 ;;  (hash-map users (lambda (x y) (printf "~a]]] ~a~n~n" x y)))
67 ;;  "_ _ _")
68 ;;(begin
69 ;;  (hash-map mids (lambda (x y) (printf "~a]]] ~a~n~n" x y)))
70 ;;  "_ _ _")
71
72 ;;(read-all first last uwnews)
73 ;;(read-all first (+ first 1000) uwnews)
74
75 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
76 ;; CODE TO EXECUTE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
77 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
78 ;(posts-per-day first last uwnews)
79 (count-users first last uwnews)
80 (new-u-vs-time)
81 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
82
83 (close-output-port dotfile)
84 (disconnect-from-server uwnews)