1 ! Copyright (C) 2009, 2010 Joe Groff, Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs combinators http.client
4 io.sockets.secure json.reader kernel make namespaces oauth1
9 SYMBOLS: twitter-source twitter-consumer-token twitter-access-token ;
11 twitter-source [ "factor" ] initialize
15 : with-twitter-oauth ( quot -- )
17 twitter-consumer-token get consumer-token set
18 twitter-access-token get access-token set
22 : twitter-url ( string -- url )
24 "https://api.twitter.com/" "http://api.twitter.com/" ? prepend >url ;
28 : obtain-twitter-request-token ( -- request-token )
30 "oauth/request_token" twitter-url
31 <request-token-params>
33 ] with-twitter-oauth ;
35 : twitter-authorize-url ( token -- url )
36 "oauth/authorize" twitter-url
37 swap key>> "oauth_token" set-query-param ;
39 : obtain-twitter-access-token ( request-token verifier -- access-token )
41 [ "oauth/access_token" twitter-url ] 2dip
46 ] with-twitter-oauth ;
51 MACRO: keys-boa ( keys class -- quot )
52 [ [ '[ _ of ] ] map ] dip '[ _ cleave _ boa ] ;
55 : status-url ( string -- url )
56 "1.1/statuses/" ".json" surround twitter-url ;
58 : set-request-twitter-auth ( request -- request )
59 [ <oauth-request-params> set-oauth ] with-twitter-oauth ;
61 : http-twitter-request ( request -- data )
62 set-request-twitter-auth http-request nip ; inline
92 : <twitter-user> ( assoc -- user )
103 } twitter-user keys-boa ;
105 : <twitter-status> ( assoc -- tweet )
106 clone "user" over [ <twitter-user> ] change-at
113 "in_reply_to_status_id"
114 "in_reply_to_user_id"
117 } twitter-status keys-boa ;
119 : json>twitter-statuses ( json-array -- tweets )
120 json> [ <twitter-status> ] map ;
122 : json>twitter-status ( json-object -- tweet )
123 json> <twitter-status> ;
130 : update-post-data ( update -- assoc )
133 twitter-source get "source" ,,
136 : (tweet) ( string -- json )
137 update-post-data "update" status-url
138 <post-request> http-twitter-request ;
142 : tweet* ( string -- tweet )
143 (tweet) json>twitter-status ;
145 : tweet ( string -- ) (tweet) drop ;
147 : twitter-request ( string -- obj )
148 twitter-url <get-request> http-twitter-request json> ;
150 : verify-credentials ( -- foo )
151 "1.1/account/verify_credentials.json" twitter-request ;
156 : timeline ( url -- tweets )
157 status-url <get-request>
158 http-twitter-request json>twitter-statuses ;
162 : user-profile ( user -- json )
163 "1.1/users/show.json?screen_name=" prepend twitter-request ;
165 : public-timeline ( -- tweets )
166 "public_timeline" timeline ;
168 : friends-timeline ( -- tweets )
169 "friends_timeline" timeline ;
171 : user-timeline ( username -- tweets )
172 "user_timeline/" prepend timeline ;
174 : home-timeline ( -- tweets )
175 "home_timeline" timeline ;
177 : mentions-timeline ( -- tweets )
178 "mentions_timeline" timeline ;