twitter-conduit-0.6.0: Web/Twitter/Conduit/Status.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeOperators #-}
module Web.Twitter.Conduit.Status (
-- * Timelines
StatusesMentionsTimeline,
mentionsTimeline,
StatusesUserTimeline,
userTimeline,
StatusesHomeTimeline,
homeTimeline,
StatusesRetweetsOfMe,
retweetsOfMe,
-- * Tweets
StatusesRetweetsId,
retweetsId,
StatusesShowId,
showId,
StatusesDestroyId,
destroyId,
StatusesUpdate,
update,
StatusesRetweetId,
retweetId,
MediaData (..),
StatusesUpdateWithMedia,
updateWithMedia,
-- , oembed
-- , retweetersIds
StatusesLookup,
lookup,
) where
import Web.Twitter.Conduit.Base
import Web.Twitter.Conduit.Parameters
import Web.Twitter.Conduit.Request
import Web.Twitter.Conduit.Request.Internal
import Web.Twitter.Types
import Prelude hiding (lookup)
import Data.Default
import qualified Data.Text as T
import Network.HTTP.Client.MultipartFormData
-- $setup
-- >>> :set -XOverloadedStrings -XOverloadedLabels
-- >>> import Control.Lens
-- * Timelines
-- | Returns query data asks the most recent mentions for the authenticating user.
--
-- You can perform a query using 'call':
--
-- @
-- res <- 'call' 'mentionsTimeline'
-- @
--
-- >>> mentionsTimeline
-- APIRequest "GET" "https://api.twitter.com/1.1/statuses/mentions_timeline.json" []
mentionsTimeline :: APIRequest StatusesMentionsTimeline [Status]
mentionsTimeline = APIRequest "GET" (endpoint ++ "statuses/mentions_timeline.json") def
type StatusesMentionsTimeline =
'[ "count" ':= Integer
, "since_id" ':= Integer
, "max_id" ':= Integer
, "trim_user" ':= Bool
, "contributor_details" ':= Bool
, "include_entities" ':= Bool
, "tweet_mode" ':= TweetMode
]
-- | Returns query data asks a collection of the most recent Tweets posted by the user indicated by the screen_name or user_id parameters.
--
-- You can perform a search query using 'call':
--
-- @
-- res <- 'call' $ 'userTimeline' ('ScreenNameParam' \"thimura\")
-- @
--
-- >>> userTimeline (ScreenNameParam "thimura")
-- APIRequest "GET" "https://api.twitter.com/1.1/statuses/user_timeline.json" [("screen_name","thimura")]
-- >>> userTimeline (ScreenNameParam "thimura") & #include_rts ?~ True & #count ?~ 200
-- APIRequest "GET" "https://api.twitter.com/1.1/statuses/user_timeline.json" [("count","200"),("include_rts","true"),("screen_name","thimura")]
userTimeline :: UserParam -> APIRequest StatusesUserTimeline [Status]
userTimeline q = APIRequest "GET" (endpoint ++ "statuses/user_timeline.json") (mkUserParam q)
type StatusesUserTimeline =
'[ "count" ':= Integer
, "since_id" ':= Integer
, "max_id" ':= Integer
, "trim_user" ':= Bool
, "exclude_replies" ':= Bool
, "contributor_details" ':= Bool
, "include_rts" ':= Bool
, "tweet_mode" ':= TweetMode
]
-- | Returns query data asks a collection of the most recentTweets and retweets posted by the authenticating user and the users they follow.
--
-- You can perform a search query using 'call':
--
-- @
-- res <- 'call' 'homeTimeline'
-- @
--
-- >>> homeTimeline
-- APIRequest "GET" "https://api.twitter.com/1.1/statuses/home_timeline.json" []
-- >>> homeTimeline & #count ?~ 200
-- APIRequest "GET" "https://api.twitter.com/1.1/statuses/home_timeline.json" [("count","200")]
homeTimeline :: APIRequest StatusesHomeTimeline [Status]
homeTimeline = APIRequest "GET" (endpoint ++ "statuses/home_timeline.json") def
type StatusesHomeTimeline =
'[ "count" ':= Integer
, "since_id" ':= Integer
, "max_id" ':= Integer
, "trim_user" ':= Bool
, "exclude_replies" ':= Bool
, "contributor_details" ':= Bool
, "include_entities" ':= Bool
, "tweet_mode" ':= TweetMode
]
-- | Returns query data asks the most recent tweets authored by the authenticating user that have been retweeted by others.
--
-- You can perform a search query using 'call':
--
-- @
-- res <- 'call' 'retweetsOfMe'
-- @
--
-- >>> retweetsOfMe
-- APIRequest "GET" "https://api.twitter.com/1.1/statuses/retweets_of_me.json" []
-- >>> retweetsOfMe & #count ?~ 100
-- APIRequest "GET" "https://api.twitter.com/1.1/statuses/retweets_of_me.json" [("count","100")]
retweetsOfMe :: APIRequest StatusesRetweetsOfMe [Status]
retweetsOfMe = APIRequest "GET" (endpoint ++ "statuses/retweets_of_me.json") def
type StatusesRetweetsOfMe =
'[ "count" ':= Integer
, "since_id" ':= Integer
, "max_id" ':= Integer
, "trim_user" ':= Bool
, "include_entities" ':= Bool
, "include_user_entities" ':= Bool
, "tweet_mode" ':= TweetMode
]
-- * Tweets
-- | Returns query data that asks for the most recent retweets of the specified tweet
--
-- You can perform a search query using 'call':
--
-- @
-- res <- 'call' twInfo mgr '$' 'retweetsId' 1234567890
-- @
--
-- >>> retweetsId 1234567890
-- APIRequest "GET" "https://api.twitter.com/1.1/statuses/retweets/1234567890.json" []
-- >>> retweetsId 1234567890 & #count ?~ 100
-- APIRequest "GET" "https://api.twitter.com/1.1/statuses/retweets/1234567890.json" [("count","100")]
retweetsId :: StatusId -> APIRequest StatusesRetweetsId [RetweetedStatus]
retweetsId status_id = APIRequest "GET" uri def
where
uri = endpoint ++ "statuses/retweets/" ++ show status_id ++ ".json"
type StatusesRetweetsId =
'[ "count" ':= Integer
, "trim_user" ':= Bool
, "tweet_mode" ':= TweetMode
]
-- | Returns query data asks a single Tweet, specified by the id parameter.
--
-- You can perform a search query using 'call':
--
-- @
-- res <- 'call' twInfo mgr '$' 'showId' 1234567890
-- @
--
-- >>> showId 1234567890
-- APIRequest "GET" "https://api.twitter.com/1.1/statuses/show/1234567890.json" []
-- >>> showId 1234567890 & #include_my_retweet ?~ True
-- APIRequest "GET" "https://api.twitter.com/1.1/statuses/show/1234567890.json" [("include_my_retweet","true")]
showId :: StatusId -> APIRequest StatusesShowId Status
showId status_id = APIRequest "GET" uri def
where
uri = endpoint ++ "statuses/show/" ++ show status_id ++ ".json"
type StatusesShowId =
'[ "trim_user" ':= Bool
, "include_my_retweet" ':= Bool
, "include_entities" ':= Bool
, "include_ext_alt_text" ':= Bool
, "tweet_mode" ':= TweetMode
]
-- | Returns post data which destroys the status specified by the require ID parameter.
--
-- You can perform a search query using 'call':
--
-- @
-- res <- 'call' twInfo mgr '$' 'destroyId' 1234567890
-- @
--
-- >>> destroyId 1234567890
-- APIRequest "POST" "https://api.twitter.com/1.1/statuses/destroy/1234567890.json" []
destroyId :: StatusId -> APIRequest StatusesDestroyId Status
destroyId status_id = APIRequest "POST" uri def
where
uri = endpoint ++ "statuses/destroy/" ++ show status_id ++ ".json"
type StatusesDestroyId =
'[ "trim_user" ':= Bool
, "tweet_mode" ':= TweetMode
]
-- | Returns post data which updates the authenticating user's current status.
-- To upload an image to accompany the tweet, use 'updateWithMedia'.
--
-- You can perform a search query using 'call':
--
-- @
-- res <- 'call' twInfo mgr '$' 'update' \"Hello World\"
-- @
--
-- >>> update "Hello World"
-- APIRequest "POST" "https://api.twitter.com/1.1/statuses/update.json" [("status","Hello World")]
-- >>> update "Hello World" & #in_reply_to_status_id ?~ 1234567890
-- APIRequest "POST" "https://api.twitter.com/1.1/statuses/update.json" [("in_reply_to_status_id","1234567890"),("status","Hello World")]
update :: T.Text -> APIRequest StatusesUpdate Status
update status = APIRequest "POST" uri [("status", PVString status)]
where
uri = endpoint ++ "statuses/update.json"
type StatusesUpdate =
'[ "in_reply_to_status_id" ':= Integer
, -- , "lat_long"
-- , "place_id"
"display_coordinates" ':= Bool
, "trim_user" ':= Bool
, "media_ids" ':= [Integer]
, "tweet_mode" ':= TweetMode
]
-- | Returns post data which retweets a tweet, specified by ID.
--
-- You can perform a search query using 'call':
--
-- @
-- res <- 'call' twInfo mgr '$' 'retweetId' 1234567890
-- @
--
-- >>> retweetId 1234567890
-- APIRequest "POST" "https://api.twitter.com/1.1/statuses/retweet/1234567890.json" []
retweetId :: StatusId -> APIRequest StatusesRetweetId RetweetedStatus
retweetId status_id = APIRequest "POST" uri def
where
uri = endpoint ++ "statuses/retweet/" ++ show status_id ++ ".json"
type StatusesRetweetId =
'[ "trim_user" ':= Bool
, "tweet_mode" ':= TweetMode
]
-- | Returns post data which updates the authenticating user's current status and attaches media for upload.
--
-- You can perform a search query using 'call':
--
-- @
-- res <- 'call' twInfo mgr '$' 'updateWithMedia' \"Hello World\" ('MediaFromFile' \"/home/thimura/test.jpeg\")
-- @
--
-- >>> updateWithMedia "Hello World" (MediaFromFile "/home/fuga/test.jpeg")
-- APIRequestMultipart "POST" "https://api.twitter.com/1.1/statuses/update_with_media.json" [("status","Hello World")]
updateWithMedia ::
T.Text ->
MediaData ->
APIRequest StatusesUpdateWithMedia Status
updateWithMedia tweet mediaData =
APIRequestMultipart "POST" uri [("status", PVString tweet)] [mediaBody mediaData]
where
uri = endpoint ++ "statuses/update_with_media.json"
mediaBody (MediaFromFile fp) = partFileSource "media[]" fp
mediaBody (MediaRequestBody filename filebody) = partFileRequestBody "media[]" filename filebody
type StatusesUpdateWithMedia =
'[ "possibly_sensitive" ':= Bool
, "in_reply_to_status_id" ':= Integer
, -- , "lat_long"
-- , "place_id"
"display_coordinates" ':= Bool
, "tweet_mode" ':= TweetMode
]
-- | Returns fully-hydrated tweet objects for up to 100 tweets per request, as specified by comma-separated values passed to the id parameter.
--
-- You can perform a request using 'call':
--
-- @
-- res <- 'call' twInfo mgr '$' 'lookup' [20, 432656548536401920]
-- @
--
-- >>> lookup [10]
-- APIRequest "GET" "https://api.twitter.com/1.1/statuses/lookup.json" [("id","10")]
-- >>> lookup [10, 432656548536401920]
-- APIRequest "GET" "https://api.twitter.com/1.1/statuses/lookup.json" [("id","10,432656548536401920")]
-- >>> lookup [10, 432656548536401920] & #include_entities ?~ True
-- APIRequest "GET" "https://api.twitter.com/1.1/statuses/lookup.json" [("include_entities","true"),("id","10,432656548536401920")]
lookup :: [StatusId] -> APIRequest StatusesLookup [Status]
lookup ids = APIRequest "GET" (endpoint ++ "statuses/lookup.json") [("id", PVIntegerArray ids)]
type StatusesLookup =
'[ "include_entities" ':= Bool
, "trim_user" ':= Bool
, "map" ':= Bool
, "tweet_mode" ':= TweetMode
]