]> gitweb.factorcode.org Git - factor.git/blob - extra/twitter/twitter.factor
fbdeee4e200258e4b68e33bb25c401389878bac8
[factor.git] / extra / twitter / twitter.factor
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 ;
7 IN: twitter
8
9 ! Configuration
10 SYMBOLS: twitter-source twitter-consumer-token twitter-access-token ;
11
12 twitter-source [ "factor" ] initialize
13
14 <PRIVATE
15
16 : with-twitter-oauth ( quot -- )
17     [
18         twitter-consumer-token get consumer-token set
19         twitter-access-token get access-token set
20         call
21     ] with-scope ; inline
22
23 : twitter-url ( string -- string' )
24     ssl-supported?
25     "https://api.twitter.com/" "http://api.twitter.com/" ? prepend ;
26
27 PRIVATE>
28
29 : obtain-twitter-request-token ( -- request-token )
30     [
31         "oauth/request_token" twitter-url
32         <request-token-params>
33         obtain-request-token
34     ] with-twitter-oauth ;
35
36 : twitter-authorize-url ( token -- url )
37     "oauth/authorize" twitter-url >url
38         swap key>> "oauth_token" set-query-param ;
39
40 : obtain-twitter-access-token ( request-token verifier -- access-token )
41     [
42         [ "oauth/access_token" twitter-url ] 2dip
43         <access-token-params>
44             swap >>verifier
45             swap >>request-token
46         obtain-access-token
47     ] with-twitter-oauth ;
48
49 <PRIVATE
50
51 ! Utilities
52 MACRO: keys-boa ( keys class -- )
53     [ [ '[ _ of ] ] map ] dip '[ _ cleave _ boa ] ;
54
55 ! Twitter requests
56 : status-url ( string -- url )
57     "1.1/statuses/" ".json" surround twitter-url ;
58
59 : set-request-twitter-auth ( request -- request )
60     [ <oauth-request-params> set-oauth ] with-twitter-oauth ;
61
62 : http-twitter-request ( request -- data )
63     set-request-twitter-auth http-request nip ; inline
64
65 PRIVATE>
66
67 ! Data types
68
69 TUPLE: twitter-status
70     created-at
71     id
72     text
73     source
74     truncated?
75     in-reply-to-status-id
76     in-reply-to-user-id
77     favorited?
78     user ;
79
80 TUPLE: twitter-user
81     id
82     name
83     screen-name
84     description
85     location
86     profile-image-url 
87     url
88     protected?
89     followers-count ;
90
91 <PRIVATE
92
93 : <twitter-user> ( assoc -- user )
94     {
95         "id"
96         "name"
97         "screen_name"
98         "description"
99         "location"
100         "profile_image_url"
101         "url"
102         "protected"
103         "followers_count"
104     } twitter-user keys-boa ;
105
106 : <twitter-status> ( assoc -- tweet )
107     clone "user" over [ <twitter-user> ] change-at 
108     {
109         "created_at"
110         "id"
111         "text"
112         "source"
113         "truncated"
114         "in_reply_to_status_id"
115         "in_reply_to_user_id"
116         "favorited"
117         "user"
118     } twitter-status keys-boa ;
119
120 : json>twitter-statuses ( json-array -- tweets )
121     json> [ <twitter-status> ] map ;
122
123 : json>twitter-status ( json-object -- tweet )
124     json> <twitter-status> ;
125
126 PRIVATE>
127
128 ! Updates
129 <PRIVATE
130
131 : update-post-data ( update -- assoc )
132     [
133         "status" ,,
134         twitter-source get "source" ,,
135     ] H{ } make ;
136
137 : (tweet) ( string -- json )
138     update-post-data "update" status-url
139     <post-request> http-twitter-request ;
140
141 PRIVATE>
142
143 : tweet* ( string -- tweet )
144     (tweet) json>twitter-status ;
145
146 : tweet ( string -- ) (tweet) drop ;
147
148 : twitter-request ( string -- obj )
149     twitter-url <get-request> http-twitter-request json> ;
150
151 : verify-credentials ( -- foo )
152     "1.1/account/verify_credentials.json" twitter-request ;
153
154 ! Timelines
155 <PRIVATE
156
157 : timeline ( url -- tweets )
158     status-url <get-request>
159     http-twitter-request json>twitter-statuses ;
160
161 PRIVATE>
162
163 : user-profile ( user -- json )
164     "1.1/users/show.json?screen_name=" prepend twitter-request ;
165
166 : public-timeline ( -- tweets )
167     "public_timeline" timeline ;
168
169 : friends-timeline ( -- tweets )
170     "friends_timeline" timeline ;
171
172 : user-timeline ( username -- tweets )
173     "user_timeline/" prepend timeline ;
174
175 : home-timeline ( -- tweets )
176     "home_timeline" timeline ;
177
178 : mentions-timeline ( -- tweets )
179     "mentions_timeline" timeline ;