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