1 ! Copyright (C) 2009, 2010 Joe Groff, Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs combinators hashtables http
4 http.client json.reader kernel macros make namespaces sequences
5 io.sockets.secure fry oauth urls ;
6 FROM: assocs => change-at ;
10 SYMBOLS: twitter-source twitter-consumer-token twitter-access-token ;
12 twitter-source [ "factor" ] initialize
16 : with-twitter-oauth ( quot -- )
18 twitter-consumer-token get consumer-token set
19 twitter-access-token get access-token set
23 : twitter-url ( string -- string' )
25 "https://api.twitter.com/" "http://api.twitter.com/" ? prepend ;
29 : obtain-twitter-request-token ( -- request-token )
31 "oauth/request_token" twitter-url
32 <request-token-params>
34 ] with-twitter-oauth ;
36 : twitter-authorize-url ( token -- url )
37 "oauth/authorize" twitter-url >url
38 swap key>> "oauth_token" set-query-param ;
40 : obtain-twitter-access-token ( request-token verifier -- access-token )
42 [ "oauth/access_token" twitter-url ] 2dip
47 ] with-twitter-oauth ;
52 MACRO: keys-boa ( keys class -- )
53 [ [ '[ _ of ] ] map ] dip '[ _ cleave _ boa ] ;
56 : status-url ( string -- url )
57 "1.1/statuses/" ".json" surround twitter-url ;
59 : set-request-twitter-auth ( request -- request )
60 [ <oauth-request-params> set-oauth ] with-twitter-oauth ;
62 : http-twitter-request ( request -- data )
63 set-request-twitter-auth http-request nip ; inline
93 : <twitter-user> ( assoc -- user )
104 } twitter-user keys-boa ;
106 : <twitter-status> ( assoc -- tweet )
107 clone "user" over [ <twitter-user> ] change-at
114 "in_reply_to_status_id"
115 "in_reply_to_user_id"
118 } twitter-status keys-boa ;
120 : json>twitter-statuses ( json-array -- tweets )
121 json> [ <twitter-status> ] map ;
123 : json>twitter-status ( json-object -- tweet )
124 json> <twitter-status> ;
131 : update-post-data ( update -- assoc )
134 twitter-source get "source" ,,
137 : (tweet) ( string -- json )
138 update-post-data "update" status-url
139 <post-request> http-twitter-request ;
143 : tweet* ( string -- tweet )
144 (tweet) json>twitter-status ;
146 : tweet ( string -- ) (tweet) drop ;
148 : twitter-request ( string -- obj )
149 twitter-url <get-request> http-twitter-request json> ;
151 : verify-credentials ( -- foo )
152 "1.1/account/verify_credentials.json" twitter-request ;
157 : timeline ( url -- tweets )
158 status-url <get-request>
159 http-twitter-request json>twitter-statuses ;
163 : user-profile ( user -- json )
164 "1.1/users/show.json?screen_name=" prepend twitter-request ;
166 : public-timeline ( -- tweets )
167 "public_timeline" timeline ;
169 : friends-timeline ( -- tweets )
170 "friends_timeline" timeline ;
172 : user-timeline ( username -- tweets )
173 "user_timeline/" prepend timeline ;
175 : home-timeline ( -- tweets )
176 "home_timeline" timeline ;
178 : mentions-timeline ( -- tweets )
179 "mentions_timeline" timeline ;