Support selecting time ranges
[tt.git] / tt.rkt
diff --git a/tt.rkt b/tt.rkt
index bc8e8bc..9a38136 100644 (file)
--- a/tt.rkt
+++ b/tt.rkt
          [nick     "foo"]
          [uri      "bar"]
          [actual   (str->msg nick uri (string-append ts tab text))]
-         [expected (Msg 1605756129 ts nick uri text)])
+         [expected (Msg 1605756129 ts nick uri text '())])
     (check-equal?
       (Msg-ts-epoch actual)
       (Msg-ts-epoch expected)
   ; TODO No need for map - can just iter
   (void (concurrent-filter-map num-workers peer-download peers)))
 
+(: uniq (∀ (α) (-> (Listof α) (Listof α))))
 (define (uniq xs)
   (set->list (list->set xs)))
 
                     (map string->path paths)])]
          [peers (append* (map file->peers paths))])
     (log-info "Read-in ~a peers." (length peers))
-    peers))
+    (uniq peers)))
 
 (: log-writer-stop (-> Thread Void))
 (define (log-writer-stop log-writer)
                (exit 1)))]
         [(or "r" "read")
          (let ([out-format 'multi-line]
-               [order      'old->new])
+               [order      'old->new]
+               [ts-min     #f]
+               [ts-max     #f])
            (command-line
              #:program
              "tt read"
              [("-r" "--rev")
               "Reverse displayed timeline order."
               (set! order 'new->old)]
+             [("-m" "--min")
+              m "Earliest time to display (ignore anything before it)."
+              (set! ts-min (rfc3339->epoch m))]
+             [("-x" "--max")
+              x "Latest time to display (ignore anything after it)."
+              (set! ts-max (rfc3339->epoch x))]
              #:once-any
              [("-s" "--short")
               "Short output format"
              (let* ([peers
                       (paths->peers file-paths)]
                     [timeline
-                      (timeline-sort (peers->timeline peers) order)])
+                      (timeline-sort (peers->timeline peers) order)]
+                    [timeline
+                      (filter (λ (m) (and (if ts-min (>= (Msg-ts-epoch m)
+                                                         ts-min)
+                                              #t)
+                                          (if ts-max (<= (Msg-ts-epoch m)
+                                                         ts-max)
+                                              #t)))
+                              timeline)])
                (timeline-print out-format timeline))))]
         [(or "c" "crawl")
          (command-line
            #:program
            "tt crawl"
            #:args file-paths
-           (let* ([peers-all-file
+           (let* ([peers-sort
+                    (λ (peers) (sort peers (match-lambda**
+                                             [((Peer n1 _) (Peer n2 _))
+                                              (string<? (if n1 n1 "")
+                                                        (if n2 n2 ""))])))]
+                  [peers-all-file
                     (build-path tt-home-dir "peers-all")]
                   [peers-mentioned-file
                     (build-path tt-home-dir "peers-mentioned")]
                   [peers-mentioned-prev
                     (file->peers peers-mentioned-file)]
                   [peers-mentioned
-                    (uniq (append peers-mentioned-prev
-                                  peers-mentioned-curr))]
+                    (peers-sort (uniq (append peers-mentioned-prev
+                                              peers-mentioned-curr)))]
                   [peers-all-prev
                     (file->peers peers-all-file)]
                   [peers-all
-                    (uniq (append peers
-                                  peers-mentioned
-                                  peers-all-prev))])
+                    (list->set (append peers
+                                       peers-mentioned
+                                       peers-all-prev))]
+                  [n-peers-discovered
+                    (set-count (set-subtract peers-all
+                                             (list->set peers-all-prev)))]
+                  [peers-all
+                    (peers-sort (set->list peers-all))])
+             (log-info "Discovered ~a new peers." n-peers-discovered)
              (peers->file peers-mentioned
                           peers-mentioned-file)
              (peers->file peers-all
This page took 0.032117 seconds and 4 git commands to generate.