! Copyright (C) 2009, 2010 Joe Groff, Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: accessors assocs combinators http.client io.sockets.secure json.reader kernel make namespaces oauth1 sequences urls ; IN: twitter ! Configuration SYMBOLS: twitter-source twitter-consumer-token twitter-access-token ; twitter-source [ "factor" ] initialize url ; PRIVATE> : obtain-twitter-request-token ( -- request-token ) [ "oauth/request_token" twitter-url obtain-request-token ] with-twitter-oauth ; : twitter-authorize-url ( token -- url ) "oauth/authorize" twitter-url swap key>> "oauth_token" set-query-param ; : obtain-twitter-access-token ( request-token verifier -- access-token ) [ [ "oauth/access_token" twitter-url ] 2dip swap >>verifier swap >>request-token obtain-access-token ] with-twitter-oauth ; set-oauth ] with-twitter-oauth ; : http-twitter-request ( request -- data ) set-request-twitter-auth http-request nip ; inline PRIVATE> ! Data types TUPLE: twitter-status created-at id text source truncated? in-reply-to-status-id in-reply-to-user-id favorited? user ; TUPLE: twitter-user id name screen-name description location profile-image-url url protected? followers-count ; ( assoc -- user ) { "id" "name" "screen_name" "description" "location" "profile_image_url" "url" "protected" "followers_count" } twitter-user keys-boa ; : ( assoc -- tweet ) clone "user" over [ ] change-at { "created_at" "id" "text" "source" "truncated" "in_reply_to_status_id" "in_reply_to_user_id" "favorited" "user" } twitter-status keys-boa ; : json>twitter-statuses ( json-array -- tweets ) json> [ ] map ; : json>twitter-status ( json-object -- tweet ) json> ; PRIVATE> ! Updates http-twitter-request ; PRIVATE> : tweet* ( string -- tweet ) (tweet) json>twitter-status ; : tweet ( string -- ) (tweet) drop ; : twitter-request ( string -- obj ) twitter-url http-twitter-request json> ; : verify-credentials ( -- foo ) "1.1/account/verify_credentials.json" twitter-request ; ! Timelines http-twitter-request json>twitter-statuses ; PRIVATE> : user-profile ( user -- json ) "1.1/users/show.json?screen_name=" prepend twitter-request ; : public-timeline ( -- tweets ) "public_timeline" timeline ; : friends-timeline ( -- tweets ) "friends_timeline" timeline ; : user-timeline ( username -- tweets ) "user_timeline/" prepend timeline ; : home-timeline ( -- tweets ) "home_timeline" timeline ; : mentions-timeline ( -- tweets ) "mentions_timeline" timeline ;