module Reddit.Actions.Moderation where

import Reddit.Routes.Moderation
import Reddit.Types.Error
import Reddit.Types.Listing
import Reddit.Types.Message
import Reddit.Types.Moderation
import Reddit.Types.Options
import Reddit.Types.Reddit
import Reddit.Types.Subreddit
import Reddit.Types.User

import Network.API.Builder.Error

-- | Get a list of existing bans on a subreddit.
--   User must be a moderator of the subreddit.
bans :: Monad m => Options BanID -> SubredditName -> RedditT m (Listing BanID Ban)
bans :: Options BanID -> SubredditName -> RedditT m (Listing BanID Ban)
bans Options BanID
opts SubredditName
r = Route -> RedditT m (Listing BanID Ban)
forall a (m :: * -> *).
(FromJSON a, Monad m) =>
Route -> RedditT m a
runRoute (Route -> RedditT m (Listing BanID Ban))
-> Route -> RedditT m (Listing BanID Ban)
forall a b. (a -> b) -> a -> b
$ Options BanID -> SubredditName -> Route
bansListing Options BanID
opts SubredditName
r

-- | Check to see if a user is banned from a subreddit. Logged-in user must
--   be a moderator of the subreddit
lookupBan :: Monad m => Username -> SubredditName -> RedditT m (Maybe Ban)
lookupBan :: Username -> SubredditName -> RedditT m (Maybe Ban)
lookupBan Username
u SubredditName
r = do
  Listing BanID Ban
res <- Route -> RedditT m (Listing BanID Ban)
forall a (m :: * -> *).
(FromJSON a, Monad m) =>
Route -> RedditT m a
runRoute (Route -> RedditT m (Listing BanID Ban))
-> Route -> RedditT m (Listing BanID Ban)
forall a b. (a -> b) -> a -> b
$ Username -> SubredditName -> Route
banLookup Username
u SubredditName
r
  case Listing BanID Ban
res :: Listing BanID Ban of
    Listing Maybe BanID
_ Maybe BanID
_ [Ban]
bs ->
      case [Ban]
bs of
        [Ban
b] -> Maybe Ban -> RedditT m (Maybe Ban)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe Ban -> RedditT m (Maybe Ban))
-> Maybe Ban -> RedditT m (Maybe Ban)
forall a b. (a -> b) -> a -> b
$ Ban -> Maybe Ban
forall a. a -> Maybe a
Just Ban
b
        [] -> Maybe Ban -> RedditT m (Maybe Ban)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe Ban
forall a. Maybe a
Nothing
        [Ban]
_-> APIError RedditError -> RedditT m (Maybe Ban)
forall (m :: * -> *) a.
Monad m =>
APIError RedditError -> RedditT m a
failWith (RedditError -> APIError RedditError
forall a. a -> APIError a
APIError RedditError
InvalidResponseError)

getModmail :: Monad m => RedditT m (Listing MessageID Message)
getModmail :: RedditT m (Listing MessageID Message)
getModmail = Route -> RedditT m (Listing MessageID Message)
forall a (m :: * -> *).
(FromJSON a, Monad m) =>
Route -> RedditT m a
runRoute (Route -> RedditT m (Listing MessageID Message))
-> Route -> RedditT m (Listing MessageID Message)
forall a b. (a -> b) -> a -> b
$ Options MessageID -> Route
modmail (Options MessageID -> Route) -> Options MessageID -> Route
forall a b. (a -> b) -> a -> b
$ Maybe (PaginationOption MessageID)
-> Maybe Int -> Options MessageID
forall a. Maybe (PaginationOption a) -> Maybe Int -> Options a
Options Maybe (PaginationOption MessageID)
forall a. Maybe a
Nothing Maybe Int
forall a. Maybe a
Nothing

getModmail' :: Monad m => Options MessageID -> RedditT m (Listing MessageID Message)
getModmail' :: Options MessageID -> RedditT m (Listing MessageID Message)
getModmail' = Route -> RedditT m (Listing MessageID Message)
forall a (m :: * -> *).
(FromJSON a, Monad m) =>
Route -> RedditT m a
runRoute (Route -> RedditT m (Listing MessageID Message))
-> (Options MessageID -> Route)
-> Options MessageID
-> RedditT m (Listing MessageID Message)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Options MessageID -> Route
modmail