Work on data, threading and printing of threads
[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 (fprintf dotfile "digraph cs136__ {\n")
34 (fprintf dotfile "// Run starting at: ~a\n" (current-seconds))
35 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
36
37 (define uwnews (connect-to-server "news.uwaterloo.ca"))
38 (define-values (total first last) (open-news-group uwnews "uw.cs.cs136"))
39
40 ;; read-all: int int newsgroup -> void
41 ;; recurse over all possible message "numbers" from the newsgroup
42 (define (read-all first last newsd)
43   (cond
44     [(= first last) (printf "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n")]
45     [else (let [(message (message-getter newsd first (list from-regexp subj-regexp mid-regexp ref-regexp date-regexp)))]
46             (cond
47               [(boolean? message) (void)]
48               [else (for-each (lambda (header) (printf "~a~n" header))
49                               message)])
50             (newline))
51           (read-all (+ first 1) last newsd)]))
52
53 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
54 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
55 ;; nntp-map: operation newsgroup (listof header-regexp) -> void
56 ;; maps some operation across each newsgroup post
57 ;;;(define (nntp-map op newsd hregexps)
58 ;;;  (let-values ([(total first-id last-id) (open-news-group newsd "uw.cs.cs136")])
59 ;;;    (op newsd
60 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
61 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
62
63 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
64 ;;(read-all first (+ 100 first) uwnews)
65 ;;(userrel first (+ 800 first) uwnews dotfile)
66
67 ;;(begin
68 ;;  (hash-map users (lambda (x y) (printf "~a]]] ~a~n~n" x y)))
69 ;;  "_ _ _")
70 ;;(begin
71 ;;  (hash-map mids (lambda (x y) (printf "~a]]] ~a~n~n" x y)))
72 ;;  "_ _ _")
73
74 ;;(read-all first last uwnews)
75 ;;(read-all first (+ first 1000) uwnews)
76
77 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
78 ;; CODE TO EXECUTE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
79 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
80 ;(thread-print first last uwnews)
81 (thread-hash first (+ 100 first) uwnews dotfile)
82 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
83
84 (fprintf dotfile "// Run finished at: ~a\n}\n" (current-seconds))
85 (close-output-port dotfile)
86 (disconnect-from-server uwnews)