packages feed

murmur-0.0.0.1: src/Web/Twitter/Murmur.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleContexts #-}
module Web.Twitter.Murmur where
import Control.Lens
import System.IO
import Data.Conduit
import qualified Data.Conduit.List as CL
import Data.Conduit.Binary (sinkHandle)
import Data.Default
import Web.Authenticate.OAuth
import Web.Twitter.Conduit
import Web.Twitter.Types.Lens
import Network.HTTP.Conduit as NC
import Control.Monad.Trans.Resource
import Control.Monad.IO.Class
import Control.Applicative
import qualified Data.Text as T
import qualified Data.Text.IO as T
import qualified Data.ByteString.Char8 as B8

data MurmurAuth = MurmurAuth
  { murConsumerKey :: String
  , murConsumerSecret :: String
  , murGetPINAction :: String -> IO String
  }

mur2OAuth :: MurmurAuth -> OAuth
mur2OAuth mur = twitterOAuth
  { oauthConsumerKey = B8.pack $ murConsumerKey mur
  , oauthConsumerSecret = B8.pack $ murConsumerSecret mur
  }

----

getTWInfo :: MurmurAuth -> IO TWInfo
getTWInfo mur = do
  mgr <- newManager tlsManagerSettings
  let oauth = mur2OAuth mur
  -- ** 権限取得処理 ** --
  accTkn <- runResourceT $ do
    -- リクエストトークン取得
    tempCred <- getTemporaryCredential oauth mgr
    let url = authorizeUrl oauth tempCred
    -- PINコードの取得
    pin <- B8.pack <$> liftIO (murGetPINAction mur url)
    -- リクエストトークン認可、アクセストークン取得
    getAccessToken oauth (insert "oauth_verifier" pin tempCred) mgr
  -- twInfoの取得
  return $ setCredential oauth accTkn def

-------- -- Post
postTweet :: TWInfo -> String -> IO ()
postTweet twInfo tweet = post twInfo (update $ T.pack tweet)

postWithReplyId :: TWInfo -> String -> Integer -> IO ()
postWithReplyId twInfo tweet id = 
  let req = (update $ T.pack tweet) & inReplyToStatusId ?~ id
  in post twInfo req

post :: TWInfo -> APIRequest n Status -> IO ()
post twInfo req = do
  mgr <- newManager tlsManagerSettings
  runResourceT $ call twInfo mgr req
  return ()

-- GetTimeline
showMentionsTimeline :: TWInfo -> IO ()
showMentionsTimeline = showTimeline mentionsTimeline

showHomeTimeline :: TWInfo -> IO ()
showHomeTimeline = showTimeline homeTimeline

showTimeline :: HasMaxIdParam (APIRequest a [Status]) => APIRequest a [Status] -> TWInfo -> IO ()
showTimeline status twInfo = do
  mgr <- newManager tlsManagerSettings
  runResourceT $ do
    let src = sourceWithMaxId twInfo mgr status
    src $= CL.isolate 20 $$ CL.mapM_ putTweetLn

putTweetLn :: MonadIO m => Status -> m ()
putTweetLn st = liftIO . T.putStrLn . T.concat $ 
  [ T.pack . show $ st^.statusId
  , "【"
  , st^.statusUser.userName
  , "("
  , st^.statusUser.userScreenName
  , ")】"
  , st^.statusText
  ]