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 : twitter-request ( request -- data )
63 set-request-twitter-auth
64 http-request nip ; inline
94 : <twitter-user> ( assoc -- user )
105 } twitter-user keys-boa ;
107 : <twitter-status> ( assoc -- tweet )
108 clone "user" over [ <twitter-user> ] change-at
115 "in_reply_to_status_id"
116 "in_reply_to_user_id"
119 } twitter-status keys-boa ;
121 : json>twitter-statuses ( json-array -- tweets )
122 json> [ <twitter-status> ] map ;
124 : json>twitter-status ( json-object -- tweet )
125 json> <twitter-status> ;
132 : update-post-data ( update -- assoc )
135 twitter-source get "source" ,,
138 : (tweet) ( string -- json )
139 update-post-data "update" status-url
140 <post-request> twitter-request ;
144 : tweet* ( string -- tweet )
145 (tweet) json>twitter-status ;
147 : tweet ( string -- ) (tweet) drop ;
152 : timeline ( url -- tweets )
153 status-url <get-request>
154 twitter-request json>twitter-statuses ;
158 : public-timeline ( -- tweets )
159 "public_timeline" timeline ;
161 : friends-timeline ( -- tweets )
162 "friends_timeline" timeline ;
164 : user-timeline ( username -- tweets )
165 "user_timeline/" prepend timeline ;