{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleContexts #-}
module Main where
import Web.Twitter.Conduit
import Web.Twitter.Types.Lens
import Control.Lens
import Control.Monad.IO.Class
import Control.Monad.Trans.Control
import Control.Monad.Trans.Resource
import qualified Data.ByteString.Char8 as B8
import qualified Data.Conduit as C
import qualified Data.Conduit.List as CL
import Data.Default
import qualified Data.Text as T
import qualified Data.Text.IO as T
import Network.HTTP.Conduit
import System.IO (hFlush, stdout)
import Web.Authenticate.OAuth (OAuth(..), Credential(..))
import qualified Web.Authenticate.OAuth as OA
tokens :: OAuth
tokens = twitterOAuth
{ oauthConsumerKey = error "You MUST specify oauthConsumerKey parameter."
, oauthConsumerSecret = error "You MUST specify oauthConsumerSecret parameter."
}
authorize :: (MonadBaseControl IO m, MonadResource m)
=> OAuth -- ^ OAuth Consumer key and secret
-> (String -> m String) -- ^ PIN prompt
-> Manager
-> m Credential
authorize oauth getPIN mgr = do
cred <- OA.getTemporaryCredential oauth mgr
let url = OA.authorizeUrl oauth cred
pin <- getPIN url
OA.getAccessToken oauth (OA.insert "oauth_verifier" (B8.pack pin) cred) mgr
getTWInfo :: IO TWInfo
getTWInfo = do
cred <- withManager $ \mgr -> authorize tokens getPIN mgr
return $ setCredential tokens cred def
where
getPIN url = liftIO $ do
putStrLn $ "browse URL: " ++ url
putStr "> what was the PIN twitter provided you with? "
hFlush stdout
getLine
main :: IO ()
main = do
twInfo <- getTWInfo
putStrLn $ "# your home timeline (up to 100 tweets):"
withManager $ \mgr -> do
sourceWithMaxId twInfo mgr homeTimeline
C.$= CL.isolate 100
C.$$ CL.mapM_ $ \status -> liftIO $ do
T.putStrLn $ T.concat [ T.pack . show $ status ^. statusId
, ": "
, status ^. statusUser . userScreenName
, ": "
, status ^. statusText
]