1 ! Copyright (C) 2011-2012 John Benediktsson
2 ! See http://factorcode.org/license.txt for BSD license
4 USING: accessors assocs calendar calendar.format
5 colors.constants colors.hex combinators formatting fry
6 http.client io io.styles json json.reader kernel make math
13 TUPLE: page url data before after ;
15 : json-page ( url -- page )
16 >url dup http-get nip json> "data" of {
18 [ "before" of [ f ] when-json-null ]
19 [ "after" of [ f ] when-json-null ]
22 : get-user ( username -- page )
23 "http://api.reddit.com/user/%s" sprintf json-page ;
25 : get-user-info ( username -- user )
26 "http://api.reddit.com/user/%s/about" sprintf
29 : get-url-info ( url -- page )
30 "http://api.reddit.com/api/info?url=%s" sprintf json-page ;
32 : search-reddit ( query -- page )
33 "http://api.reddit.com/search?q=%s" sprintf json-page ;
35 : search-subreddits ( query -- page )
36 "http://api.reddit.com/reddits/search?q=%s" sprintf json-page ;
38 : get-domains ( query -- page )
39 "http://api.reddit.com/domain/%s" sprintf json-page ;
41 : get-subreddit ( subreddit -- page )
42 "http://api.reddit.com/r/%s" sprintf json-page ;
44 : next-page ( page -- page' )
45 [ url>> ] [ after>> "after" set-query-param ] bi json-page ;
47 : all-pages ( page -- data )
49 [ [ data>> , ] [ dup after>> ] bi ]
50 [ next-page ] while drop
55 : user-links ( username -- stories )
56 get-user data>> [ "kind" of "t3" = ] filter
57 [ "data" of "url" of ] map ;
59 : user-comments ( username -- comments )
60 get-user data>> [ "kind" of "t1" = ] filter
61 [ "data" of "body" of ] map ;
63 : user-karma ( username -- karma )
64 get-user-info "data" of "link_karma" of ;
66 : url-score ( url -- score )
67 get-url-info data>> [ "score" of ] map-sum ;
69 : subreddit-links ( subreddit -- links )
70 get-subreddit data>> [ "url" of ] map ;
72 : story>comments-url ( story -- url )
73 "permalink" of "http://reddit.com" prepend >url ;
75 : story>author-url ( story -- url )
76 "author" of "http://reddit.com/user/" prepend >url ;
80 : write-title ( title url -- )
83 COLOR: blue foreground ,,
86 : write-link ( title url -- )
89 HEXCOLOR: 888888 foreground ,,
92 : write-text ( str -- )
93 H{ { foreground HEXCOLOR: 888888 } } format ;
97 : subreddit. ( subreddit -- )
98 get-subreddit data>> [
99 1 + "%2d. " sprintf write-text "data" of {
100 [ [ "title" of ] [ "url" of ] bi write-title ]
101 [ "domain" of " (%s)\n" sprintf write-text ]
102 [ "score" of " %d points, " sprintf write-text ]
104 [ "num_comments" of "%d comments" sprintf ]
105 [ story>comments-url ] bi write-link
108 "created_utc" of unix-time>timestamp
109 relative-time ", posted " write-text write-text
111 [ " by " write-text [ "author" of ] [ story>author-url ] bi write-link nl nl ]
115 : domain-stats ( domain -- stats )
116 get-domains all-pages [
117 "created" of 1000 * millis>timestamp year>>
118 ] collect-by [ [ "score" of ] map-sum ] assoc-map ;