Working user post-count
authorKyle Spaans <kspaans@student.math.uwaterloo.ca>
Thu, 9 Apr 2009 02:41:32 +0000 (22:41 -0400)
committerKyle Spaans <kspaans@student.math.uwaterloo.ca>
Thu, 9 Apr 2009 02:41:32 +0000 (22:41 -0400)
Need to figure out more things though, see line 175

connect.ss
ref-helper.ss

index 9695b8f..95f8595 100644 (file)
 (define dotfile (open-output-file "cs136-trial.dot" #:exists 'truncate))
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(hash-set! users 'kspaans@csclub.uwaterloo.ca '())
-(hash-set! users 'kspaans@csclub.uwaterloo.ca
-                       (cons 'nosane@user.com
-                            (hash-ref users 'kspaans@csclub.uwaterloo.ca)))
-
 (fprintf dotfile "digraph cs136 {\n")
 (fprintf dotfile "// Trial run starting at: ~a\n" (current-seconds))
-;; ^^^^ This is kind of tricky? Because I'll have to search the hashtable for each
-;;   value _while_ inserting it and adding to it... This seems indeal.
-;; Since hastables are mutable, maybe I can integrate getting they key into the
-;; whole process? I.E. search to make sure it's already there, and meanwhile
-;; save the value. If it's not already there, revert to adding the user.
-
-
-;(hash-for-each users (lambda (x y) (printf "~a~n" y)))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
           (thread-hash (+ first 1) last newsd)]))
 
 ;(thread-print first (+ first 20) uwnews)
-(thread-hash first (+ first 100) uwnews)
+;(thread-hash first (+ first 100) uwnews)
 ;; Want better threading now. Use the second pair in the references line
 
 
+;; userrel: User relations: who talked to whom on the newsgroup?
+;; Store usernames (email addressses) and their message-ids in a hash table
+;; for retreival and matching later.
+(define (userrel first last newsd)
+  (cond
+    [(= first last) (void)]
+    [else
+     (local [(define mesg-from
+                     (message-getter uwnews first
+                                     (list from-regexp  ; Ugh, the order coming out of this function
+                                          mid-regexp ; depends on what's in the headers, not the
+                                          ref-regexp)))  ; order I have here. Usually From, Subj, MID, Refs
+             (define node-id (make-dot-id))]
+       (cond
+         [(and (not (boolean? mesg-from)) (= (length mesg-from) 3))
+          ;; There are references, which we need to check against a list of things
+          ;; crap! I'm pretty sure this means that I'll need to have a hash table of
+          ;; MID -> user as well... Or maybe use only a hash like that?
+          (printf "Larp!~n~n")
+          (userrel (+ 1 first) last newsd)]
+         [(and (not (boolean? mesg-from)) (= (length mesg-from) 2))
+          ;; Only From and MID? It's a first post.
+          (printf "--> New Post:~n")
+          (printf " `-> From: ~a~n" (car mesg-from))
+          (printf " `-> MID:  ~a~n~n" (cadr mesg-from))
+          (ins-user-id users (car mesg-from) (cadr mesg-from))
+          (userrel (+ 1 first) last newsd)]
+         [else (userrel (+ 1 first) last newsd)]))]))
+
+(userrel first (+ 100 first) uwnews)
+
+(begin
+  (hash-map users (lambda (x y) (printf "~a: ~a~n~n" x (hash-count y))))
+  "_ _ _")
+
 ;(read-all first last uwnews)
 ;(read-all first (+ first 1000) uwnews)
 (fprintf dotfile "// Trial run finished at: ~a\n}\n" (current-seconds))
index 4b55387..c7e87fd 100644 (file)
@@ -1,5 +1,5 @@
 #lang scheme
-(provide get-refs make-dot-id)
+(provide get-refs make-dot-id ins-user-id)
 ;; get-refs: string -> (listof string)
 ;; Given an NNTP "References:" header line, will extract all Message-IDs in it
 (define references-regexp #rx"<[^>]*>")
       (begin
         (set! counter (+ 1 counter))
         (num2letters counter true))))
+
+;; ins-user-id: hash-table string string -> void
+;; Inserts user information into a hash table. Takes the table, the username
+;; (email address) and a message-id. user is used as the key and MID the
+;; value. Each user can post multiple messages, therefore MIDs are stored
+;; in another hash table along with the (date/time/order/count?) of the post
+(define (ins-user-id htable user mid)
+  (let [(uresult (hash-ref htable user #f))]
+    (if (boolean? uresult)
+        ;; New user, create hash with MID
+        (local [(define new-user-htable (make-hash))]
+          (hash-set! new-user-htable mid 0) ; user date instead?
+          (hash-set! htable user new-user-htable))
+        ;; Add MID to hash table (MIDs are assumed to be unique
+       (hash-set! uresult mid (hash-count uresult)))))