X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=tt;h=32606b84b0840ac0a694347f3fbfcea0ddc932a2;hb=93ebe03e20275354c3c4111e5d77c74eca8a7166;hp=0a8d43cace01c25d4d741bf358df1491662f0633;hpb=8e475eb88cfcc81c8cde1cc7da5b59679d994610;p=tt.git diff --git a/tt b/tt index 0a8d43c..32606b8 100755 --- a/tt +++ b/tt @@ -1,6 +1,42 @@ #! /usr/bin/env racket ; vim: filetype=racket +; TODO write +; TODO caching (use cache by default, unless explicitly asked for update) +; TODO timeline limits +; TODO user-defined feed sets (a la twitter lists) +; TODO feed set operations +; TODO timeline as a result of a query (feed set op + filter expressions) +; TODO named timelines +; TODO CLI params +; TODO config files +; TODO parse mentions: +; - @ | @ +; TODO highlight mentions +; TODO filter on mentions +; TODO highlight hashtags +; TODO filter on hashtags +; TODO hashtags as channels? initial hashtag special? +; TODO query language +; TODO concurrency +; TODO console logger colors by level ('error) +; TODO file logger ('debug) +; TODO commands: +; - r | read +; - see timeline ops above +; - w | write +; - arg or stdin +; - nick expand to URI +; - q | query +; - see timeline ops above +; - see hashtag and channels above +; - d | download +; - u | upload +; - calls user-configured command to upload user's own feed file to their server +; TODO user-agent format: / (+; @) +; - requires configurability +; - ref: https://twtxt.readthedocs.io/en/latest/user/discoverability.html + #lang racket (require racket/date) @@ -66,35 +102,31 @@ [i (in-naturals)]) (msg-print (odd? i) msg))) +(define (feed->msgs feed) + (log-info "downloading feed nick:~a uri:~a" + (feed-nick feed) + (feed-uri feed)) + (with-handlers + ([exn:fail:network? + (λ (e) + (log-error "network error nick:~a uri:~a exn:~a" + (feed-nick feed) + (feed-uri feed) + e) + #f)] + [integer? + (λ (status) + (log-error "http error nick:~a uri:~a status:~a" + (feed-nick feed) + (feed-uri feed) + status) + #f)]) + (str->msgs [feed-nick feed] [uri-fetch (feed-uri feed)]))) + +; TODO timeline contract : time-sorted list of messages (define (timeline feeds) - (let* ([timelines - (filter-map - (λ (feed) - (log-info "processing feed nick:~a uri:~a" - (feed-nick feed) - (feed-uri feed)) - (with-handlers - ([exn:fail:network? - (λ (e) - (log-error "network error nick:~a uri:~a exn:~a" - (feed-nick feed) - (feed-uri feed) - e) - #f)] - [integer? - (λ (status) - (log-error "http error nick:~a uri:~a status:~a" - (feed-nick feed) - (feed-uri feed) - status) - #f)]) - (str->msgs [feed-nick feed] [uri-fetch (feed-uri feed)]))) - feeds)] - [timeline - (append* timelines)] - [timeline - (sort timeline (λ (a b) [< (msg-tm_epoch a) (msg-tm_epoch b)]))]) - timeline)) + (sort (append* (filter-map feed->msgs feeds)) + (λ (a b) [< (msg-tm_epoch a) (msg-tm_epoch b)]))) (define (we-are-twtxt) (let* ([uri @@ -105,6 +137,7 @@ (str->lines payload)] [feeds (map (λ (line) + ; TODO validation (define toks (string-split line)) (feed [list-ref toks 0]