module Reddit.Actions.Post
( getPosts
, getPosts'
, getPostComments
, getPostSubComments
, getComments
, getPostInfo
, getPostsInfo
, submitLink
, submitLinkWithCaptcha
, submitSelfPost
, submitSelfPostWithCaptcha
, setInboxReplies
, savePost
, unsavePost
, editPost
, deletePost
, setPostFlair
, removePost
, markPostSpam
, stickyPost
, unstickyPost
, setContestMode ) where
import qualified Reddit.Routes as Route
import Reddit.Types
import Reddit.Types.Captcha
import Reddit.Types.Comment
import Reddit.Types.Empty
import Reddit.Types.Listing
import Reddit.Types.Reddit
import Data.Default.Class
import Data.Text (Text)
import Network.API.Builder.Error (APIError(..))
import qualified Data.Char as Char
import qualified Data.Text as Text
getPostInfo :: Monad m => PostID -> RedditT m Post
getPostInfo p = do
res <- getPostsInfo [p]
case res of
Listing _ _ [post] -> return post
_ -> failWith $ APIError InvalidResponseError
getPostsInfo :: Monad m => [PostID] -> RedditT m PostListing
getPostsInfo ps =
if null $ drop 100 ps
then do
res <- runRoute $ Route.aboutPosts ps
case res of
Listing _ _ posts | sameLength posts ps ->
return res
_ -> failWith $ APIError InvalidResponseError
else failWith $ APIError TooManyRequests
where
sameLength (_:xs) (_:ys) = sameLength xs ys
sameLength [] [] = True
sameLength _ _ = False
getPosts :: Monad m => RedditT m PostListing
getPosts = getPosts' def Hot Nothing
getPosts' :: Monad m => Options PostID -> ListingType -> Maybe SubredditName -> RedditT m PostListing
getPosts' o l r = runRoute $ Route.postsListing o r (Text.pack $ lower $ show l)
where lower = map Char.toLower
savePost :: Monad m => PostID -> RedditT m ()
savePost = nothing . runRoute . Route.savePost
unsavePost :: Monad m => PostID -> RedditT m ()
unsavePost = nothing . runRoute . Route.unsavePost
submitLink :: Monad m
=> SubredditName
-> Text
-> Text
-> RedditT m PostID
submitLink r title url = do
POSTWrapped res <- runRoute $ Route.submitLink r title url
return res
submitLinkWithCaptcha :: Monad m
=> SubredditName
-> Text
-> Text
-> CaptchaID
-> Text
-> RedditT m PostID
submitLinkWithCaptcha r title url iden captcha = do
POSTWrapped res <- runRoute $ Route.submitLink r title url `withCaptcha` (iden, captcha)
return res
submitSelfPost :: Monad m
=> SubredditName
-> Text
-> Text
-> RedditT m PostID
submitSelfPost r title postBody = do
POSTWrapped res <- runRoute $ Route.submitSelfPost r title postBody
return res
submitSelfPostWithCaptcha :: Monad m
=> SubredditName
-> Text
-> Text
-> CaptchaID
-> Text
-> RedditT m PostID
submitSelfPostWithCaptcha r title postBody iden captcha = do
POSTWrapped res <- runRoute $ Route.submitSelfPost r title postBody `withCaptcha` (iden, captcha)
return res
deletePost :: Monad m => PostID -> RedditT m ()
deletePost = nothing . runRoute . Route.delete
setPostFlair :: Monad m
=> SubredditName
-> PostID
-> Text
-> Text
-> RedditT m ()
setPostFlair r p text css = nothing $ runRoute $ Route.postFlair r p text css
editPost :: Monad m => PostID -> Text -> RedditT m ()
editPost thing text = nothing $ runRoute $ Route.edit thing text
getPostComments :: Monad m => PostID -> RedditT m PostComments
getPostComments p = runRoute $ Route.getComments p Nothing
getPostSubComments :: Monad m => PostID -> CommentID -> RedditT m PostComments
getPostSubComments p c = runRoute $ Route.getComments p (Just c)
getComments :: Monad m => PostID -> RedditT m [CommentReference]
getComments p = do
PostComments _ c <- getPostComments p
return c
setInboxReplies :: Monad m => Bool -> PostID -> RedditT m ()
setInboxReplies enabled = nothing . runRoute . Route.sendReplies enabled
setContestMode :: Monad m => Bool -> PostID -> RedditT m ()
setContestMode enabled = nothing . runRoute . Route.setContestMode enabled
removePost :: Monad m => PostID -> RedditT m ()
removePost = nothing . runRoute . Route.removePost False
markPostSpam :: Monad m => PostID -> RedditT m ()
markPostSpam = nothing . runRoute . Route.removePost True
stickyPost :: Monad m
=> PostID
-> Maybe Integer
-> RedditT m ()
stickyPost p n = nothing $ runRoute $ Route.stickyPost True p n
unstickyPost :: Monad m
=> PostID
-> Maybe Integer
-> RedditT m ()
unstickyPost p n = nothing $ runRoute $ Route.stickyPost False p n