{-# OPTIONS -Wall -fsimpl-tick-factor=1024 #-} {-# LANGUAGE OverloadedStrings #-} import qualified Web.Twitter.Conduit as WTC import qualified Web.Authenticate.OAuth as WAO import qualified Control.Monad.Logger as CML import qualified System.Environment as SE import qualified Control.Lens as CL import qualified Control.Monad.IO.Class as CMIC import qualified Data.Conduit as DC import qualified Data.Conduit.List as DCL import qualified Data.ByteString.Char8 as DBC import qualified Data.Text as DT import qualified Data.Monoid as DM tokens :: String -> String -> WAO.OAuth tokens ck cs = WTC.twitterOAuth { WAO.oauthConsumerKey = DBC.pack ck , WAO.oauthConsumerSecret = DBC.pack cs } credential :: String -> String -> WAO.Credential credential t ts = WAO.Credential [ ( "oauth_token" , DBC.pack t ) , ( "oauth_token_secret" , DBC.pack ts ) ] twInfo :: String -> String -> String -> String -> WTC.TWInfo twInfo ck cs t ts = WTC.setCredential ( tokens ck cs ) ( credential t ts ) WAO.def mirroring sn ( WTC.SStatus status ) = do if status CL.^. WTC.statusUser CL.^. WTC.userScreenName == DT.pack sn then do _ <- WTC.call $ WTC.update $ status CL.^. WTC.statusText return ( ) else return ( ) mirroring _ _ = return ( ) main :: IO ( ) main = do ck <- SE.getEnv "YOUR_CONSUMER_KEY" cs <- SE.getEnv "YOUR_CONSUMER_SECRET" at <- SE.getEnv "YOUR_ACCESS_TOKEN" ats <- SE.getEnv "YOUR_ACCESS_TOKEN_SECRET" sn <- SE.getEnv "MIRRORING_ACCOUNT_SCREEN_NAME" CML.runNoLoggingT . WTC.runTW ( twInfo ck cs at ats ) $ do userId <- WTC.call $ WTC.usersShow $ WTC.ScreenNameParam sn src <- WTC.stream $ WTC.statusesFilterByFollow [ userId CL.^. WTC.userId ] src DC.$$+- DCL.mapM_ ( CL.^! CL.act ( mirroring sn ) )