-module Twitter.Http
+module Twitter.Http (
+ get_user_new_statuses,
+ get_user_timeline,
+ http_get )
where
-import qualified Data.ByteString.Lazy as B
-import qualified Data.ByteString.Char8 as BC
-import qualified Data.Conduit as C
-import Data.Conduit.Binary (sinkLbs)
-import Network.HTTP.Conduit
+import qualified Data.ByteString.Lazy as B ( ByteString )
+import qualified Data.ByteString.Char8 as BC ( pack )
+import Network.HTTP.Client (
+ httpLbs,
+ newManager,
+ parseUrl,
+ responseBody )
+import Network.HTTP.Client.TLS ( tlsManagerSettings )
import Web.Authenticate.OAuth (
OAuth(..),
Credential,
newCredential,
newOAuth,
- signOAuth)
+ signOAuth )
--- |The API URL of username's timeline.
+import Configuration ( Cfg(..) )
+
+
+-- | The API URL of username's timeline.
--
-- See,
--
"&include_rts=true&",
"count=10" ]
-status_url :: Integer -> String
-status_url status_id =
- concat [ "https://api.twitter.com/",
- "1.1/",
- "statuses/",
- "show.json?id=",
- (show status_id) ]
-- | Given username's last status id, constructs the API URL for
-- username's new statuses. Essentially, 'user_timeline_url' with a
--- "since_id" parameter tacked on.
+-- \"since_id\" parameter tacked on.
+--
+-- Examples:
+--
+-- >>> user_new_statuses_url "someuser" 8675309
+-- "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=someuser&include_rts=true&count=10&since_id=8675309"
+--
user_new_statuses_url :: String -> Integer -> String
user_new_statuses_url username last_status_id =
- concat [ user_timeline_url username,
- "&since_id=" ++ (show last_status_id) ]
-
-
-get_status :: Integer -> IO B.ByteString
-get_status status_id = do
- let uri = status_url status_id
- http_get uri
+ url ++ "&since_id=" ++ since_id
+ where
+ url = user_timeline_url username
+ since_id = show last_status_id
-- | Return's username's timeline.
-get_user_timeline :: String -> IO B.ByteString
-get_user_timeline username = do
+--
+get_user_timeline :: Cfg -> String -> IO B.ByteString
+get_user_timeline cfg username = do
let uri = user_timeline_url username
- http_get uri
+ http_get cfg uri
-- | Returns the JSON representing all of username's statuses that are
--- newer than last_status_id.
-get_user_new_statuses :: String -> Integer -> IO B.ByteString
-get_user_new_statuses username last_status_id = do
+-- newer than @last_status_id@.
+--
+get_user_new_statuses :: Cfg -> String -> Integer -> IO B.ByteString
+get_user_new_statuses cfg username last_status_id = do
let uri = user_new_statuses_url username last_status_id
- http_get uri
+ http_get cfg uri
--- | Retrieve a URL, or crash.
-http_get :: String -> IO B.ByteString
-http_get url = do
- manager <- newManager def
+-- | Retrieve a URL, or crash. The request is signed using all of the
+-- OAuth junk contained in the configuration.
+--
+http_get :: Cfg -> String -> IO B.ByteString
+http_get cfg url = do
+ manager <- newManager tlsManagerSettings
request <- parseUrl url
-
- C.runResourceT $ do
- signed_request <- signOAuth oauth credential request
- response <- http signed_request manager
- responseBody response C.$$+- sinkLbs
+ signed_request <- signOAuth oauth credential request
+ response <- httpLbs signed_request manager
+ return $ responseBody response
where
- consumer_key = BC.pack ""
- consumer_secret = BC.pack ""
- access_token = BC.pack ""
- access_secret = BC.pack ""
+ consumer_key' = BC.pack (consumer_key cfg)
+ consumer_secret' = BC.pack (consumer_secret cfg)
+ access_token' = BC.pack (access_token cfg)
+ access_secret' = BC.pack (access_secret cfg)
oauth :: OAuth
oauth = newOAuth {
- oauthConsumerKey = consumer_key,
- oauthConsumerSecret = consumer_secret
- }
+ oauthConsumerKey = consumer_key',
+ oauthConsumerSecret = consumer_secret' }
credential :: Credential
- credential = newCredential access_token access_secret
+ credential = newCredential access_token' access_secret'