{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleInstances #-} -- allow instance declaration of MonadDiscord
{-
Module      : Discord.Internal.Monad
License     : BSD (see the LICENSE file)
Description : The DiscordMonad class and its instances.

This module contains the 'MonadDiscord' data class, which abstracts away all
the possible REST interactions with Discord. It also defines instances for
'DiscordHandler' and 'ReaderT Auth IO'.

-}
module Discord.Internal.Monad
    ( MonadDiscord(..)
    ) where

import           Control.Concurrent         ( threadDelay )
import           Control.Exception.Safe     ( MonadThrow
                                            , MonadMask
                                            , SomeException
                                            , throwM
                                            , try
                                            )
import           Control.Monad.IO.Class     ( MonadIO
                                            , liftIO
                                            )
import           Control.Monad              ( void )
import           Control.Monad.Reader       ( ReaderT
                                            , ask
                                            )
import           Data.Aeson                 ( FromJSON
                                            , eitherDecode
                                            )
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString as B
import           Data.Ix                    ( inRange )
import qualified Data.Text.Encoding as TE
import qualified Data.Text as T
import           Data.Time.Clock.POSIX      ( POSIXTime
                                            , getPOSIXTime
                                            )
import qualified Network.HTTP.Req as Req
import           Text.Read                  ( readMaybe )

import           Discord.Internal.Rest.Prelude
import           Discord.Internal.Rest.HTTP ( RestCallInternalException(..)
                                            , Request(..)
                                            , JsonRequest(..)
                                            )
import qualified Discord.Requests as R
import           Discord.Types
import           Discord

import           Command.Error             ( CommandError(..) )

-- | @MonadDiscord@ is a data class of Monads that can interact with Discord.
-- It requires MonadThrow to throw possible errors like HTTP errors, MonadMask
-- as a helper for common operations paired with errors (like `finally`), and
-- MonadFail to allow convenient pattern-matching in do-notation (not necessary,
-- but helps a lot with our code style).
class (Monad m, MonadThrow m, MonadMask m, MonadFail m) => MonadDiscord m where
    -- Channels
    getChannel :: ChannelId -> m Channel
    modifyChannel :: ChannelId -> R.ModifyChannelOpts -> m Channel
    deleteChannel :: ChannelId -> m Channel
    getChannelMessages :: ChannelId -> (Int, R.MessageTiming) -> m [Message]
    getChannelMessage :: (ChannelId, MessageId) -> m Message
    createMessage :: ChannelId -> T.Text -> m Message
    createMessageEmbed :: ChannelId -> T.Text -> CreateEmbed -> m Message
    createMessageUploadFile :: ChannelId -> T.Text -> B.ByteString -> m Message
    createMessageDetailed :: ChannelId -> R.MessageDetailedOpts -> m Message
    createReaction :: (ChannelId, MessageId) -> T.Text -> m ()
    deleteOwnReaction :: (ChannelId, MessageId) -> T.Text -> m ()
    deleteUserReaction :: (ChannelId, MessageId) -> UserId -> T.Text -> m ()
    deleteSingleReaction :: (ChannelId, MessageId) -> T.Text -> m ()
    getReactions :: (ChannelId, MessageId) -> T.Text -> (Int, R.ReactionTiming) -> m [User]
    deleteAllReactions :: (ChannelId, MessageId) -> m ()
    editMessage :: (ChannelId, MessageId) -> T.Text -> Maybe CreateEmbed -> m Message
    deleteMessage :: (ChannelId, MessageId) -> m ()
    bulkDeleteMessage :: (ChannelId, [MessageId]) -> m ()
    editChannelPermissions :: ChannelId -> OverwriteId -> R.ChannelPermissionsOpts -> m ()
    getChannelInvites  :: ChannelId -> m Object
    createChannelInvite :: ChannelId -> R.ChannelInviteOpts -> m Invite
    deleteChannelPermission :: ChannelId -> OverwriteId -> m ()
    triggerTypingIndicator :: ChannelId -> m ()
    getPinnedMessages :: ChannelId -> m [Message]
    addPinnedMessage :: (ChannelId, MessageId) -> m ()
    deletePinnedMessage :: (ChannelId, MessageId) -> m ()
    groupDMAddRecipient :: ChannelId -> R.GroupDMAddRecipientOpts -> m ()
    groupDMRemoveRecipient :: ChannelId -> UserId -> m ()
    -- Emojis
    listGuildEmojis :: GuildId -> m [Emoji]
    getGuildEmoji :: GuildId -> EmojiId -> m Emoji
    createGuildEmoji :: GuildId -> T.Text -> B.ByteString -> m Emoji
    modifyGuildEmoji :: GuildId -> EmojiId -> R.ModifyGuildEmojiOpts -> m Emoji
    deleteGuildEmoji :: GuildId -> EmojiId -> m ()
    -- Guilds
    createGuild :: R.CreateGuildOpts -> m Guild
    getGuild :: GuildId -> m Guild
    modifyGuild :: GuildId -> R.ModifyGuildOpts -> m Guild
    deleteGuild :: GuildId -> m ()
    getGuildChannels :: GuildId -> m [Channel]
    createGuildChannel :: GuildId -> T.Text -> [Overwrite] -> R.CreateGuildChannelOpts -> m Channel
    modifyGuildChannelPositions :: GuildId -> [(ChannelId, Int)] -> m [Channel]
    getGuildMember :: GuildId -> UserId -> m GuildMember
    listGuildMembers :: GuildId -> R.GuildMembersTiming -> m [GuildMember]
    addGuildMember :: GuildId -> UserId -> R.AddGuildMemberOpts -> m ()
    modifyGuildMember :: GuildId -> UserId -> R.ModifyGuildMemberOpts -> m ()
    modifyCurrentUserNick :: GuildId -> T.Text -> m ()
    addGuildMemberRole :: GuildId -> UserId -> RoleId -> m ()
    removeGuildMemberRole :: GuildId -> UserId -> RoleId -> m ()
    removeGuildMember :: GuildId -> UserId -> m ()
    getGuildBans :: GuildId -> m [GuildBan]
    getGuildBan :: GuildId -> UserId -> m GuildBan
    createGuildBan :: GuildId -> UserId -> R.CreateGuildBanOpts -> m ()
    removeGuildBan :: GuildId -> UserId -> m ()
    getGuildRoles :: GuildId -> m [Role]
    createGuildRole :: GuildId -> R.ModifyGuildRoleOpts -> m Role
    modifyGuildRolePositions :: GuildId -> [(RoleId, Integer)] -> m [Role]
    modifyGuildRole :: GuildId -> RoleId -> R.ModifyGuildRoleOpts -> m Role
    deleteGuildRole :: GuildId -> RoleId -> m ()
    getGuildPruneCount :: GuildId -> Integer -> m Object
    beginGuildPrune :: GuildId -> Integer -> m Object
    getGuildVoiceRegions :: GuildId -> m [VoiceRegion]
    getGuildInvites :: GuildId -> m [Invite]
    getGuildIntegrations :: GuildId -> m [Integration]
    createGuildIntegration :: GuildId -> IntegrationId -> R.CreateGuildIntegrationOpts -> m ()
    modifyGuildIntegration :: GuildId -> IntegrationId -> R.ModifyGuildIntegrationOpts -> m ()
    deleteGuildIntegration :: GuildId -> IntegrationId -> m ()
    syncGuildIntegration :: GuildId -> IntegrationId -> m ()
    getGuildEmbed :: GuildId -> m GuildEmbed
    modifyGuildEmbed :: GuildId -> GuildEmbed -> m GuildEmbed
    getGuildVanityURL :: GuildId -> m T.Text
    -- Invites
    getInvite :: T.Text -> m Invite
    deleteInvite :: T.Text -> m Invite
    -- Users
    getCurrentUser :: m User
    getUser :: UserId -> m User
    modifyCurrentUser :: T.Text -> R.CurrentUserAvatar -> m User
    getCurrentUserGuilds :: m [PartialGuild]
    leaveGuild :: GuildId -> m ()
    getUserDMs :: m [Channel]
    createDM :: UserId -> m Channel
    getUserConnections :: m [ConnectionObject]
    -- Voice
    listVoiceRegions :: m [VoiceRegion]
    -- Webhooks
    createWebhook :: ChannelId -> R.CreateWebhookOpts -> m Webhook
    getChannelWebhooks :: ChannelId -> m [Webhook]
    getGuildWebhooks :: GuildId -> m [Webhook]
    getWebhook :: WebhookId -> m Webhook
    getWebhookWithToken :: WebhookId -> T.Text -> m Webhook
    modifyWebhook :: WebhookId -> R.ModifyWebhookOpts -> m Webhook
    modifyWebhookWithToken :: WebhookId -> T.Text -> R.ModifyWebhookOpts -> m Webhook
    deleteWebhook :: WebhookId -> m ()
    deleteWebhookWithToken :: WebhookId -> T.Text -> m ()
    executeWebhookWithToken :: WebhookId -> T.Text -> R.ExecuteWebhookWithTokenOpts -> m ()

    -- Custom utilities
    respond       :: Message -> T.Text -> m ()

-- | Implements every single possible rest call as a wrapper function.
-- Convenient notation achieved using a point-free restCallAndHandle
instance MonadDiscord DiscordHandler where
    getChannel :: ChannelId -> DiscordHandler Channel
getChannel = ChannelRequest Channel -> DiscordHandler Channel
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest Channel -> DiscordHandler Channel)
-> (ChannelId -> ChannelRequest Channel)
-> ChannelId
-> DiscordHandler Channel
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelRequest Channel
R.GetChannel
    modifyChannel :: ChannelId -> ModifyChannelOpts -> DiscordHandler Channel
modifyChannel = (ChannelRequest Channel -> DiscordHandler Channel
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest Channel -> DiscordHandler Channel)
-> (ModifyChannelOpts -> ChannelRequest Channel)
-> ModifyChannelOpts
-> DiscordHandler Channel
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ModifyChannelOpts -> ChannelRequest Channel)
 -> ModifyChannelOpts -> DiscordHandler Channel)
-> (ChannelId -> ModifyChannelOpts -> ChannelRequest Channel)
-> ChannelId
-> ModifyChannelOpts
-> DiscordHandler Channel
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ModifyChannelOpts -> ChannelRequest Channel
R.ModifyChannel
    deleteChannel :: ChannelId -> DiscordHandler Channel
deleteChannel = ChannelRequest Channel -> DiscordHandler Channel
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest Channel -> DiscordHandler Channel)
-> (ChannelId -> ChannelRequest Channel)
-> ChannelId
-> DiscordHandler Channel
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelRequest Channel
R.DeleteChannel
    getChannelMessages :: ChannelId -> (Int, MessageTiming) -> DiscordHandler [Message]
getChannelMessages = (ChannelRequest [Message] -> DiscordHandler [Message]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest [Message] -> DiscordHandler [Message])
-> ((Int, MessageTiming) -> ChannelRequest [Message])
-> (Int, MessageTiming)
-> DiscordHandler [Message]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) (((Int, MessageTiming) -> ChannelRequest [Message])
 -> (Int, MessageTiming) -> DiscordHandler [Message])
-> (ChannelId -> (Int, MessageTiming) -> ChannelRequest [Message])
-> ChannelId
-> (Int, MessageTiming)
-> DiscordHandler [Message]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> (Int, MessageTiming) -> ChannelRequest [Message]
R.GetChannelMessages
    getChannelMessage :: (ChannelId, ChannelId) -> DiscordHandler Message
getChannelMessage = ChannelRequest Message -> DiscordHandler Message
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest Message -> DiscordHandler Message)
-> ((ChannelId, ChannelId) -> ChannelRequest Message)
-> (ChannelId, ChannelId)
-> DiscordHandler Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ChannelId) -> ChannelRequest Message
R.GetChannelMessage
    createMessage :: ChannelId -> Text -> DiscordHandler Message
createMessage = (ChannelRequest Message -> DiscordHandler Message
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest Message -> DiscordHandler Message)
-> (Text -> ChannelRequest Message)
-> Text
-> DiscordHandler Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> ChannelRequest Message)
 -> Text -> DiscordHandler Message)
-> (ChannelId -> Text -> ChannelRequest Message)
-> ChannelId
-> Text
-> DiscordHandler Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> Text -> ChannelRequest Message
R.CreateMessage
    createMessageEmbed :: ChannelId -> Text -> CreateEmbed -> DiscordHandler Message
createMessageEmbed = ((ChannelRequest Message -> DiscordHandler Message
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest Message -> DiscordHandler Message)
-> (CreateEmbed -> ChannelRequest Message)
-> CreateEmbed
-> DiscordHandler Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((CreateEmbed -> ChannelRequest Message)
 -> CreateEmbed -> DiscordHandler Message)
-> (Text -> CreateEmbed -> ChannelRequest Message)
-> Text
-> CreateEmbed
-> DiscordHandler Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> CreateEmbed -> ChannelRequest Message)
 -> Text -> CreateEmbed -> DiscordHandler Message)
-> (ChannelId -> Text -> CreateEmbed -> ChannelRequest Message)
-> ChannelId
-> Text
-> CreateEmbed
-> DiscordHandler Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> Text -> CreateEmbed -> ChannelRequest Message
R.CreateMessageEmbed
    createMessageUploadFile :: ChannelId -> Text -> ByteString -> DiscordHandler Message
createMessageUploadFile = ((ChannelRequest Message -> DiscordHandler Message
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest Message -> DiscordHandler Message)
-> (ByteString -> ChannelRequest Message)
-> ByteString
-> DiscordHandler Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ByteString -> ChannelRequest Message)
 -> ByteString -> DiscordHandler Message)
-> (Text -> ByteString -> ChannelRequest Message)
-> Text
-> ByteString
-> DiscordHandler Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> ByteString -> ChannelRequest Message)
 -> Text -> ByteString -> DiscordHandler Message)
-> (ChannelId -> Text -> ByteString -> ChannelRequest Message)
-> ChannelId
-> Text
-> ByteString
-> DiscordHandler Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> Text -> ByteString -> ChannelRequest Message
R.CreateMessageUploadFile
    createMessageDetailed :: ChannelId -> MessageDetailedOpts -> DiscordHandler Message
createMessageDetailed = (ChannelRequest Message -> DiscordHandler Message
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest Message -> DiscordHandler Message)
-> (MessageDetailedOpts -> ChannelRequest Message)
-> MessageDetailedOpts
-> DiscordHandler Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((MessageDetailedOpts -> ChannelRequest Message)
 -> MessageDetailedOpts -> DiscordHandler Message)
-> (ChannelId -> MessageDetailedOpts -> ChannelRequest Message)
-> ChannelId
-> MessageDetailedOpts
-> DiscordHandler Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> MessageDetailedOpts -> ChannelRequest Message
R.CreateMessageDetailed
    createReaction :: (ChannelId, ChannelId) -> Text -> DiscordHandler ()
createReaction = (ChannelRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest () -> DiscordHandler ())
-> (Text -> ChannelRequest ()) -> Text -> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> ChannelRequest ()) -> Text -> DiscordHandler ())
-> ((ChannelId, ChannelId) -> Text -> ChannelRequest ())
-> (ChannelId, ChannelId)
-> Text
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ChannelId) -> Text -> ChannelRequest ()
R.CreateReaction
    deleteOwnReaction :: (ChannelId, ChannelId) -> Text -> DiscordHandler ()
deleteOwnReaction = (ChannelRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest () -> DiscordHandler ())
-> (Text -> ChannelRequest ()) -> Text -> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> ChannelRequest ()) -> Text -> DiscordHandler ())
-> ((ChannelId, ChannelId) -> Text -> ChannelRequest ())
-> (ChannelId, ChannelId)
-> Text
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ChannelId) -> Text -> ChannelRequest ()
R.DeleteOwnReaction
    deleteUserReaction :: (ChannelId, ChannelId) -> ChannelId -> Text -> DiscordHandler ()
deleteUserReaction = ((ChannelRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest () -> DiscordHandler ())
-> (Text -> ChannelRequest ()) -> Text -> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> ChannelRequest ()) -> Text -> DiscordHandler ())
-> (ChannelId -> Text -> ChannelRequest ())
-> ChannelId
-> Text
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> Text -> ChannelRequest ())
 -> ChannelId -> Text -> DiscordHandler ())
-> ((ChannelId, ChannelId)
    -> ChannelId -> Text -> ChannelRequest ())
-> (ChannelId, ChannelId)
-> ChannelId
-> Text
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ChannelId) -> ChannelId -> Text -> ChannelRequest ()
R.DeleteUserReaction
    deleteSingleReaction :: (ChannelId, ChannelId) -> Text -> DiscordHandler ()
deleteSingleReaction = (ChannelRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest () -> DiscordHandler ())
-> (Text -> ChannelRequest ()) -> Text -> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> ChannelRequest ()) -> Text -> DiscordHandler ())
-> ((ChannelId, ChannelId) -> Text -> ChannelRequest ())
-> (ChannelId, ChannelId)
-> Text
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ChannelId) -> Text -> ChannelRequest ()
R.DeleteSingleReaction
    getReactions :: (ChannelId, ChannelId)
-> Text -> (Int, ReactionTiming) -> DiscordHandler [User]
getReactions = ((ChannelRequest [User] -> DiscordHandler [User]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest [User] -> DiscordHandler [User])
-> ((Int, ReactionTiming) -> ChannelRequest [User])
-> (Int, ReactionTiming)
-> DiscordHandler [User]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) (((Int, ReactionTiming) -> ChannelRequest [User])
 -> (Int, ReactionTiming) -> DiscordHandler [User])
-> (Text -> (Int, ReactionTiming) -> ChannelRequest [User])
-> Text
-> (Int, ReactionTiming)
-> DiscordHandler [User]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> (Int, ReactionTiming) -> ChannelRequest [User])
 -> Text -> (Int, ReactionTiming) -> DiscordHandler [User])
-> ((ChannelId, ChannelId)
    -> Text -> (Int, ReactionTiming) -> ChannelRequest [User])
-> (ChannelId, ChannelId)
-> Text
-> (Int, ReactionTiming)
-> DiscordHandler [User]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ChannelId)
-> Text -> (Int, ReactionTiming) -> ChannelRequest [User]
R.GetReactions
    deleteAllReactions :: (ChannelId, ChannelId) -> DiscordHandler ()
deleteAllReactions = ChannelRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest () -> DiscordHandler ())
-> ((ChannelId, ChannelId) -> ChannelRequest ())
-> (ChannelId, ChannelId)
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ChannelId) -> ChannelRequest ()
R.DeleteAllReactions
    editMessage :: (ChannelId, ChannelId)
-> Text -> Maybe CreateEmbed -> DiscordHandler Message
editMessage = ((ChannelRequest Message -> DiscordHandler Message
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest Message -> DiscordHandler Message)
-> (Maybe CreateEmbed -> ChannelRequest Message)
-> Maybe CreateEmbed
-> DiscordHandler Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Maybe CreateEmbed -> ChannelRequest Message)
 -> Maybe CreateEmbed -> DiscordHandler Message)
-> (Text -> Maybe CreateEmbed -> ChannelRequest Message)
-> Text
-> Maybe CreateEmbed
-> DiscordHandler Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> Maybe CreateEmbed -> ChannelRequest Message)
 -> Text -> Maybe CreateEmbed -> DiscordHandler Message)
-> ((ChannelId, ChannelId)
    -> Text -> Maybe CreateEmbed -> ChannelRequest Message)
-> (ChannelId, ChannelId)
-> Text
-> Maybe CreateEmbed
-> DiscordHandler Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ChannelId)
-> Text -> Maybe CreateEmbed -> ChannelRequest Message
R.EditMessage
    deleteMessage :: (ChannelId, ChannelId) -> DiscordHandler ()
deleteMessage = ChannelRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest () -> DiscordHandler ())
-> ((ChannelId, ChannelId) -> ChannelRequest ())
-> (ChannelId, ChannelId)
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ChannelId) -> ChannelRequest ()
R.DeleteMessage
    bulkDeleteMessage :: (ChannelId, [ChannelId]) -> DiscordHandler ()
bulkDeleteMessage = ChannelRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest () -> DiscordHandler ())
-> ((ChannelId, [ChannelId]) -> ChannelRequest ())
-> (ChannelId, [ChannelId])
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, [ChannelId]) -> ChannelRequest ()
R.BulkDeleteMessage
    editChannelPermissions :: ChannelId
-> ChannelId -> ChannelPermissionsOpts -> DiscordHandler ()
editChannelPermissions = ((ChannelRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest () -> DiscordHandler ())
-> (ChannelPermissionsOpts -> ChannelRequest ())
-> ChannelPermissionsOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelPermissionsOpts -> ChannelRequest ())
 -> ChannelPermissionsOpts -> DiscordHandler ())
-> (ChannelId -> ChannelPermissionsOpts -> ChannelRequest ())
-> ChannelId
-> ChannelPermissionsOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> ChannelPermissionsOpts -> ChannelRequest ())
 -> ChannelId -> ChannelPermissionsOpts -> DiscordHandler ())
-> (ChannelId
    -> ChannelId -> ChannelPermissionsOpts -> ChannelRequest ())
-> ChannelId
-> ChannelId
-> ChannelPermissionsOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId
-> ChannelId -> ChannelPermissionsOpts -> ChannelRequest ()
R.EditChannelPermissions
    getChannelInvites :: ChannelId -> DiscordHandler Object
getChannelInvites = ChannelRequest Object -> DiscordHandler Object
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest Object -> DiscordHandler Object)
-> (ChannelId -> ChannelRequest Object)
-> ChannelId
-> DiscordHandler Object
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelRequest Object
R.GetChannelInvites
    createChannelInvite :: ChannelId -> ChannelInviteOpts -> DiscordHandler Invite
createChannelInvite = (ChannelRequest Invite -> DiscordHandler Invite
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest Invite -> DiscordHandler Invite)
-> (ChannelInviteOpts -> ChannelRequest Invite)
-> ChannelInviteOpts
-> DiscordHandler Invite
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelInviteOpts -> ChannelRequest Invite)
 -> ChannelInviteOpts -> DiscordHandler Invite)
-> (ChannelId -> ChannelInviteOpts -> ChannelRequest Invite)
-> ChannelId
-> ChannelInviteOpts
-> DiscordHandler Invite
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelInviteOpts -> ChannelRequest Invite
R.CreateChannelInvite
    deleteChannelPermission :: ChannelId -> ChannelId -> DiscordHandler ()
deleteChannelPermission = (ChannelRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest () -> DiscordHandler ())
-> (ChannelId -> ChannelRequest ())
-> ChannelId
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> ChannelRequest ())
 -> ChannelId -> DiscordHandler ())
-> (ChannelId -> ChannelId -> ChannelRequest ())
-> ChannelId
-> ChannelId
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> ChannelRequest ()
R.DeleteChannelPermission
    triggerTypingIndicator :: ChannelId -> DiscordHandler ()
triggerTypingIndicator = ChannelRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest () -> DiscordHandler ())
-> (ChannelId -> ChannelRequest ())
-> ChannelId
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelRequest ()
R.TriggerTypingIndicator
    getPinnedMessages :: ChannelId -> DiscordHandler [Message]
getPinnedMessages = ChannelRequest [Message] -> DiscordHandler [Message]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest [Message] -> DiscordHandler [Message])
-> (ChannelId -> ChannelRequest [Message])
-> ChannelId
-> DiscordHandler [Message]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelRequest [Message]
R.GetPinnedMessages
    addPinnedMessage :: (ChannelId, ChannelId) -> DiscordHandler ()
addPinnedMessage = ChannelRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest () -> DiscordHandler ())
-> ((ChannelId, ChannelId) -> ChannelRequest ())
-> (ChannelId, ChannelId)
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ChannelId) -> ChannelRequest ()
R.AddPinnedMessage
    deletePinnedMessage :: (ChannelId, ChannelId) -> DiscordHandler ()
deletePinnedMessage = ChannelRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest () -> DiscordHandler ())
-> ((ChannelId, ChannelId) -> ChannelRequest ())
-> (ChannelId, ChannelId)
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ChannelId) -> ChannelRequest ()
R.DeletePinnedMessage
    groupDMAddRecipient :: ChannelId -> GroupDMAddRecipientOpts -> DiscordHandler ()
groupDMAddRecipient = (ChannelRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest () -> DiscordHandler ())
-> (GroupDMAddRecipientOpts -> ChannelRequest ())
-> GroupDMAddRecipientOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((GroupDMAddRecipientOpts -> ChannelRequest ())
 -> GroupDMAddRecipientOpts -> DiscordHandler ())
-> (ChannelId -> GroupDMAddRecipientOpts -> ChannelRequest ())
-> ChannelId
-> GroupDMAddRecipientOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GroupDMAddRecipientOpts -> ChannelRequest ()
R.GroupDMAddRecipient
    groupDMRemoveRecipient :: ChannelId -> ChannelId -> DiscordHandler ()
groupDMRemoveRecipient = (ChannelRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (ChannelRequest () -> DiscordHandler ())
-> (ChannelId -> ChannelRequest ())
-> ChannelId
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> ChannelRequest ())
 -> ChannelId -> DiscordHandler ())
-> (ChannelId -> ChannelId -> ChannelRequest ())
-> ChannelId
-> ChannelId
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> ChannelRequest ()
R.GroupDMRemoveRecipient
    -- Emojis
    listGuildEmojis :: ChannelId -> DiscordHandler [Emoji]
listGuildEmojis = EmojiRequest [Emoji] -> DiscordHandler [Emoji]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (EmojiRequest [Emoji] -> DiscordHandler [Emoji])
-> (ChannelId -> EmojiRequest [Emoji])
-> ChannelId
-> DiscordHandler [Emoji]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> EmojiRequest [Emoji]
R.ListGuildEmojis
    getGuildEmoji :: ChannelId -> ChannelId -> DiscordHandler Emoji
getGuildEmoji = (EmojiRequest Emoji -> DiscordHandler Emoji
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (EmojiRequest Emoji -> DiscordHandler Emoji)
-> (ChannelId -> EmojiRequest Emoji)
-> ChannelId
-> DiscordHandler Emoji
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> EmojiRequest Emoji)
 -> ChannelId -> DiscordHandler Emoji)
-> (ChannelId -> ChannelId -> EmojiRequest Emoji)
-> ChannelId
-> ChannelId
-> DiscordHandler Emoji
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> EmojiRequest Emoji
R.GetGuildEmoji
    createGuildEmoji :: ChannelId -> Text -> ByteString -> DiscordHandler Emoji
createGuildEmoji ChannelId
g Text
t ByteString
b =
        case ByteString -> Either Text EmojiImageParsed
R.parseEmojiImage ByteString
b of
            Left Text
x  -> CommandError -> DiscordHandler Emoji
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM (CommandError -> DiscordHandler Emoji)
-> CommandError -> DiscordHandler Emoji
forall a b. (a -> b) -> a -> b
$ Text -> CommandError
ProcessingError Text
x
            Right EmojiImageParsed
x -> EmojiRequest Emoji
-> DiscordHandler (Either RestCallErrorCode Emoji)
forall a (r :: * -> *).
(FromJSON a, Request (r a)) =>
r a -> DiscordHandler (Either RestCallErrorCode a)
restCall (ChannelId -> Text -> EmojiImageParsed -> EmojiRequest Emoji
R.CreateGuildEmoji ChannelId
g Text
t EmojiImageParsed
x) DiscordHandler (Either RestCallErrorCode Emoji)
-> (Either RestCallErrorCode Emoji -> DiscordHandler Emoji)
-> DiscordHandler Emoji
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Either RestCallErrorCode Emoji -> DiscordHandler Emoji
forall a. Either RestCallErrorCode a -> DiscordHandler a
handleDiscordResult
    modifyGuildEmoji :: ChannelId
-> ChannelId -> ModifyGuildEmojiOpts -> DiscordHandler Emoji
modifyGuildEmoji = ((EmojiRequest Emoji -> DiscordHandler Emoji
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (EmojiRequest Emoji -> DiscordHandler Emoji)
-> (ModifyGuildEmojiOpts -> EmojiRequest Emoji)
-> ModifyGuildEmojiOpts
-> DiscordHandler Emoji
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ModifyGuildEmojiOpts -> EmojiRequest Emoji)
 -> ModifyGuildEmojiOpts -> DiscordHandler Emoji)
-> (ChannelId -> ModifyGuildEmojiOpts -> EmojiRequest Emoji)
-> ChannelId
-> ModifyGuildEmojiOpts
-> DiscordHandler Emoji
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> ModifyGuildEmojiOpts -> EmojiRequest Emoji)
 -> ChannelId -> ModifyGuildEmojiOpts -> DiscordHandler Emoji)
-> (ChannelId
    -> ChannelId -> ModifyGuildEmojiOpts -> EmojiRequest Emoji)
-> ChannelId
-> ChannelId
-> ModifyGuildEmojiOpts
-> DiscordHandler Emoji
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId
-> ChannelId -> ModifyGuildEmojiOpts -> EmojiRequest Emoji
R.ModifyGuildEmoji
    deleteGuildEmoji :: ChannelId -> ChannelId -> DiscordHandler ()
deleteGuildEmoji = (EmojiRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (EmojiRequest () -> DiscordHandler ())
-> (ChannelId -> EmojiRequest ()) -> ChannelId -> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> EmojiRequest ()) -> ChannelId -> DiscordHandler ())
-> (ChannelId -> ChannelId -> EmojiRequest ())
-> ChannelId
-> ChannelId
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> EmojiRequest ()
R.DeleteGuildEmoji
    -- Guilds
    createGuild :: CreateGuildOpts -> DiscordHandler Guild
createGuild = GuildRequest Guild -> DiscordHandler Guild
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest Guild -> DiscordHandler Guild)
-> (CreateGuildOpts -> GuildRequest Guild)
-> CreateGuildOpts
-> DiscordHandler Guild
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CreateGuildOpts -> GuildRequest Guild
R.CreateGuild
    getGuild :: ChannelId -> DiscordHandler Guild
getGuild = GuildRequest Guild -> DiscordHandler Guild
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest Guild -> DiscordHandler Guild)
-> (ChannelId -> GuildRequest Guild)
-> ChannelId
-> DiscordHandler Guild
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildRequest Guild
R.GetGuild
    modifyGuild :: ChannelId -> ModifyGuildOpts -> DiscordHandler Guild
modifyGuild = (GuildRequest Guild -> DiscordHandler Guild
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest Guild -> DiscordHandler Guild)
-> (ModifyGuildOpts -> GuildRequest Guild)
-> ModifyGuildOpts
-> DiscordHandler Guild
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ModifyGuildOpts -> GuildRequest Guild)
 -> ModifyGuildOpts -> DiscordHandler Guild)
-> (ChannelId -> ModifyGuildOpts -> GuildRequest Guild)
-> ChannelId
-> ModifyGuildOpts
-> DiscordHandler Guild
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ModifyGuildOpts -> GuildRequest Guild
R.ModifyGuild
    deleteGuild :: ChannelId -> DiscordHandler ()
deleteGuild = GuildRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest () -> DiscordHandler ())
-> (ChannelId -> GuildRequest ()) -> ChannelId -> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildRequest ()
R.DeleteGuild
    getGuildChannels :: ChannelId -> DiscordHandler [Channel]
getGuildChannels = GuildRequest [Channel] -> DiscordHandler [Channel]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest [Channel] -> DiscordHandler [Channel])
-> (ChannelId -> GuildRequest [Channel])
-> ChannelId
-> DiscordHandler [Channel]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildRequest [Channel]
R.GetGuildChannels
    createGuildChannel :: ChannelId
-> Text
-> [Overwrite]
-> CreateGuildChannelOpts
-> DiscordHandler Channel
createGuildChannel = (((GuildRequest Channel -> DiscordHandler Channel
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest Channel -> DiscordHandler Channel)
-> (CreateGuildChannelOpts -> GuildRequest Channel)
-> CreateGuildChannelOpts
-> DiscordHandler Channel
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((CreateGuildChannelOpts -> GuildRequest Channel)
 -> CreateGuildChannelOpts -> DiscordHandler Channel)
-> ([Overwrite] -> CreateGuildChannelOpts -> GuildRequest Channel)
-> [Overwrite]
-> CreateGuildChannelOpts
-> DiscordHandler Channel
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) (([Overwrite] -> CreateGuildChannelOpts -> GuildRequest Channel)
 -> [Overwrite] -> CreateGuildChannelOpts -> DiscordHandler Channel)
-> (Text
    -> [Overwrite] -> CreateGuildChannelOpts -> GuildRequest Channel)
-> Text
-> [Overwrite]
-> CreateGuildChannelOpts
-> DiscordHandler Channel
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text
  -> [Overwrite] -> CreateGuildChannelOpts -> GuildRequest Channel)
 -> Text
 -> [Overwrite]
 -> CreateGuildChannelOpts
 -> DiscordHandler Channel)
-> (ChannelId
    -> Text
    -> [Overwrite]
    -> CreateGuildChannelOpts
    -> GuildRequest Channel)
-> ChannelId
-> Text
-> [Overwrite]
-> CreateGuildChannelOpts
-> DiscordHandler Channel
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId
-> Text
-> [Overwrite]
-> CreateGuildChannelOpts
-> GuildRequest Channel
R.CreateGuildChannel
    modifyGuildChannelPositions :: ChannelId -> [(ChannelId, Int)] -> DiscordHandler [Channel]
modifyGuildChannelPositions = (GuildRequest [Channel] -> DiscordHandler [Channel]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest [Channel] -> DiscordHandler [Channel])
-> ([(ChannelId, Int)] -> GuildRequest [Channel])
-> [(ChannelId, Int)]
-> DiscordHandler [Channel]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) (([(ChannelId, Int)] -> GuildRequest [Channel])
 -> [(ChannelId, Int)] -> DiscordHandler [Channel])
-> (ChannelId -> [(ChannelId, Int)] -> GuildRequest [Channel])
-> ChannelId
-> [(ChannelId, Int)]
-> DiscordHandler [Channel]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> [(ChannelId, Int)] -> GuildRequest [Channel]
R.ModifyGuildChannelPositions
    getGuildMember :: ChannelId -> ChannelId -> DiscordHandler GuildMember
getGuildMember = (GuildRequest GuildMember -> DiscordHandler GuildMember
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest GuildMember -> DiscordHandler GuildMember)
-> (ChannelId -> GuildRequest GuildMember)
-> ChannelId
-> DiscordHandler GuildMember
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> GuildRequest GuildMember)
 -> ChannelId -> DiscordHandler GuildMember)
-> (ChannelId -> ChannelId -> GuildRequest GuildMember)
-> ChannelId
-> ChannelId
-> DiscordHandler GuildMember
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> GuildRequest GuildMember
R.GetGuildMember
    listGuildMembers :: ChannelId -> GuildMembersTiming -> DiscordHandler [GuildMember]
listGuildMembers = (GuildRequest [GuildMember] -> DiscordHandler [GuildMember]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest [GuildMember] -> DiscordHandler [GuildMember])
-> (GuildMembersTiming -> GuildRequest [GuildMember])
-> GuildMembersTiming
-> DiscordHandler [GuildMember]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((GuildMembersTiming -> GuildRequest [GuildMember])
 -> GuildMembersTiming -> DiscordHandler [GuildMember])
-> (ChannelId -> GuildMembersTiming -> GuildRequest [GuildMember])
-> ChannelId
-> GuildMembersTiming
-> DiscordHandler [GuildMember]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildMembersTiming -> GuildRequest [GuildMember]
R.ListGuildMembers
    addGuildMember :: ChannelId -> ChannelId -> AddGuildMemberOpts -> DiscordHandler ()
addGuildMember = ((GuildRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest () -> DiscordHandler ())
-> (AddGuildMemberOpts -> GuildRequest ())
-> AddGuildMemberOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((AddGuildMemberOpts -> GuildRequest ())
 -> AddGuildMemberOpts -> DiscordHandler ())
-> (ChannelId -> AddGuildMemberOpts -> GuildRequest ())
-> ChannelId
-> AddGuildMemberOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> AddGuildMemberOpts -> GuildRequest ())
 -> ChannelId -> AddGuildMemberOpts -> DiscordHandler ())
-> (ChannelId
    -> ChannelId -> AddGuildMemberOpts -> GuildRequest ())
-> ChannelId
-> ChannelId
-> AddGuildMemberOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> AddGuildMemberOpts -> GuildRequest ()
R.AddGuildMember
    modifyGuildMember :: ChannelId
-> ChannelId -> ModifyGuildMemberOpts -> DiscordHandler ()
modifyGuildMember = ((GuildRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest () -> DiscordHandler ())
-> (ModifyGuildMemberOpts -> GuildRequest ())
-> ModifyGuildMemberOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ModifyGuildMemberOpts -> GuildRequest ())
 -> ModifyGuildMemberOpts -> DiscordHandler ())
-> (ChannelId -> ModifyGuildMemberOpts -> GuildRequest ())
-> ChannelId
-> ModifyGuildMemberOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> ModifyGuildMemberOpts -> GuildRequest ())
 -> ChannelId -> ModifyGuildMemberOpts -> DiscordHandler ())
-> (ChannelId
    -> ChannelId -> ModifyGuildMemberOpts -> GuildRequest ())
-> ChannelId
-> ChannelId
-> ModifyGuildMemberOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> ModifyGuildMemberOpts -> GuildRequest ()
R.ModifyGuildMember
    modifyCurrentUserNick :: ChannelId -> Text -> DiscordHandler ()
modifyCurrentUserNick = (GuildRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest () -> DiscordHandler ())
-> (Text -> GuildRequest ()) -> Text -> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> GuildRequest ()) -> Text -> DiscordHandler ())
-> (ChannelId -> Text -> GuildRequest ())
-> ChannelId
-> Text
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> Text -> GuildRequest ()
R.ModifyCurrentUserNick
    addGuildMemberRole :: ChannelId -> ChannelId -> ChannelId -> DiscordHandler ()
addGuildMemberRole = ((GuildRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest () -> DiscordHandler ())
-> (ChannelId -> GuildRequest ()) -> ChannelId -> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> GuildRequest ()) -> ChannelId -> DiscordHandler ())
-> (ChannelId -> ChannelId -> GuildRequest ())
-> ChannelId
-> ChannelId
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> ChannelId -> GuildRequest ())
 -> ChannelId -> ChannelId -> DiscordHandler ())
-> (ChannelId -> ChannelId -> ChannelId -> GuildRequest ())
-> ChannelId
-> ChannelId
-> ChannelId
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> ChannelId -> GuildRequest ()
R.AddGuildMemberRole
    removeGuildMemberRole :: ChannelId -> ChannelId -> ChannelId -> DiscordHandler ()
removeGuildMemberRole = ((GuildRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest () -> DiscordHandler ())
-> (ChannelId -> GuildRequest ()) -> ChannelId -> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> GuildRequest ()) -> ChannelId -> DiscordHandler ())
-> (ChannelId -> ChannelId -> GuildRequest ())
-> ChannelId
-> ChannelId
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> ChannelId -> GuildRequest ())
 -> ChannelId -> ChannelId -> DiscordHandler ())
-> (ChannelId -> ChannelId -> ChannelId -> GuildRequest ())
-> ChannelId
-> ChannelId
-> ChannelId
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> ChannelId -> GuildRequest ()
R.RemoveGuildMemberRole
    removeGuildMember :: ChannelId -> ChannelId -> DiscordHandler ()
removeGuildMember = (GuildRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest () -> DiscordHandler ())
-> (ChannelId -> GuildRequest ()) -> ChannelId -> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> GuildRequest ()) -> ChannelId -> DiscordHandler ())
-> (ChannelId -> ChannelId -> GuildRequest ())
-> ChannelId
-> ChannelId
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> GuildRequest ()
R.RemoveGuildMember
    getGuildBans :: ChannelId -> DiscordHandler [GuildBan]
getGuildBans = GuildRequest [GuildBan] -> DiscordHandler [GuildBan]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest [GuildBan] -> DiscordHandler [GuildBan])
-> (ChannelId -> GuildRequest [GuildBan])
-> ChannelId
-> DiscordHandler [GuildBan]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildRequest [GuildBan]
R.GetGuildBans
    getGuildBan :: ChannelId -> ChannelId -> DiscordHandler GuildBan
getGuildBan = (GuildRequest GuildBan -> DiscordHandler GuildBan
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest GuildBan -> DiscordHandler GuildBan)
-> (ChannelId -> GuildRequest GuildBan)
-> ChannelId
-> DiscordHandler GuildBan
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> GuildRequest GuildBan)
 -> ChannelId -> DiscordHandler GuildBan)
-> (ChannelId -> ChannelId -> GuildRequest GuildBan)
-> ChannelId
-> ChannelId
-> DiscordHandler GuildBan
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> GuildRequest GuildBan
R.GetGuildBan
    createGuildBan :: ChannelId -> ChannelId -> CreateGuildBanOpts -> DiscordHandler ()
createGuildBan = ((GuildRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest () -> DiscordHandler ())
-> (CreateGuildBanOpts -> GuildRequest ())
-> CreateGuildBanOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((CreateGuildBanOpts -> GuildRequest ())
 -> CreateGuildBanOpts -> DiscordHandler ())
-> (ChannelId -> CreateGuildBanOpts -> GuildRequest ())
-> ChannelId
-> CreateGuildBanOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> CreateGuildBanOpts -> GuildRequest ())
 -> ChannelId -> CreateGuildBanOpts -> DiscordHandler ())
-> (ChannelId
    -> ChannelId -> CreateGuildBanOpts -> GuildRequest ())
-> ChannelId
-> ChannelId
-> CreateGuildBanOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> CreateGuildBanOpts -> GuildRequest ()
R.CreateGuildBan
    removeGuildBan :: ChannelId -> ChannelId -> DiscordHandler ()
removeGuildBan = (GuildRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest () -> DiscordHandler ())
-> (ChannelId -> GuildRequest ()) -> ChannelId -> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> GuildRequest ()) -> ChannelId -> DiscordHandler ())
-> (ChannelId -> ChannelId -> GuildRequest ())
-> ChannelId
-> ChannelId
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> GuildRequest ()
R.RemoveGuildBan
    getGuildRoles :: ChannelId -> DiscordHandler [Role]
getGuildRoles = GuildRequest [Role] -> DiscordHandler [Role]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest [Role] -> DiscordHandler [Role])
-> (ChannelId -> GuildRequest [Role])
-> ChannelId
-> DiscordHandler [Role]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildRequest [Role]
R.GetGuildRoles
    createGuildRole :: ChannelId -> ModifyGuildRoleOpts -> DiscordHandler Role
createGuildRole = (GuildRequest Role -> DiscordHandler Role
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest Role -> DiscordHandler Role)
-> (ModifyGuildRoleOpts -> GuildRequest Role)
-> ModifyGuildRoleOpts
-> DiscordHandler Role
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ModifyGuildRoleOpts -> GuildRequest Role)
 -> ModifyGuildRoleOpts -> DiscordHandler Role)
-> (ChannelId -> ModifyGuildRoleOpts -> GuildRequest Role)
-> ChannelId
-> ModifyGuildRoleOpts
-> DiscordHandler Role
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ModifyGuildRoleOpts -> GuildRequest Role
R.CreateGuildRole
    modifyGuildRolePositions :: ChannelId -> [(ChannelId, Integer)] -> DiscordHandler [Role]
modifyGuildRolePositions = (GuildRequest [Role] -> DiscordHandler [Role]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest [Role] -> DiscordHandler [Role])
-> ([(ChannelId, Integer)] -> GuildRequest [Role])
-> [(ChannelId, Integer)]
-> DiscordHandler [Role]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) (([(ChannelId, Integer)] -> GuildRequest [Role])
 -> [(ChannelId, Integer)] -> DiscordHandler [Role])
-> (ChannelId -> [(ChannelId, Integer)] -> GuildRequest [Role])
-> ChannelId
-> [(ChannelId, Integer)]
-> DiscordHandler [Role]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> [(ChannelId, Integer)] -> GuildRequest [Role]
R.ModifyGuildRolePositions
    modifyGuildRole :: ChannelId
-> ChannelId -> ModifyGuildRoleOpts -> DiscordHandler Role
modifyGuildRole = ((GuildRequest Role -> DiscordHandler Role
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest Role -> DiscordHandler Role)
-> (ModifyGuildRoleOpts -> GuildRequest Role)
-> ModifyGuildRoleOpts
-> DiscordHandler Role
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ModifyGuildRoleOpts -> GuildRequest Role)
 -> ModifyGuildRoleOpts -> DiscordHandler Role)
-> (ChannelId -> ModifyGuildRoleOpts -> GuildRequest Role)
-> ChannelId
-> ModifyGuildRoleOpts
-> DiscordHandler Role
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> ModifyGuildRoleOpts -> GuildRequest Role)
 -> ChannelId -> ModifyGuildRoleOpts -> DiscordHandler Role)
-> (ChannelId
    -> ChannelId -> ModifyGuildRoleOpts -> GuildRequest Role)
-> ChannelId
-> ChannelId
-> ModifyGuildRoleOpts
-> DiscordHandler Role
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> ModifyGuildRoleOpts -> GuildRequest Role
R.ModifyGuildRole
    deleteGuildRole :: ChannelId -> ChannelId -> DiscordHandler ()
deleteGuildRole = (GuildRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest () -> DiscordHandler ())
-> (ChannelId -> GuildRequest ()) -> ChannelId -> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> GuildRequest ()) -> ChannelId -> DiscordHandler ())
-> (ChannelId -> ChannelId -> GuildRequest ())
-> ChannelId
-> ChannelId
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> GuildRequest ()
R.DeleteGuildRole
    getGuildPruneCount :: ChannelId -> Integer -> DiscordHandler Object
getGuildPruneCount = (GuildRequest Object -> DiscordHandler Object
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest Object -> DiscordHandler Object)
-> (Integer -> GuildRequest Object)
-> Integer
-> DiscordHandler Object
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Integer -> GuildRequest Object)
 -> Integer -> DiscordHandler Object)
-> (ChannelId -> Integer -> GuildRequest Object)
-> ChannelId
-> Integer
-> DiscordHandler Object
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> Integer -> GuildRequest Object
R.GetGuildPruneCount
    beginGuildPrune :: ChannelId -> Integer -> DiscordHandler Object
beginGuildPrune = (GuildRequest Object -> DiscordHandler Object
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest Object -> DiscordHandler Object)
-> (Integer -> GuildRequest Object)
-> Integer
-> DiscordHandler Object
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Integer -> GuildRequest Object)
 -> Integer -> DiscordHandler Object)
-> (ChannelId -> Integer -> GuildRequest Object)
-> ChannelId
-> Integer
-> DiscordHandler Object
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> Integer -> GuildRequest Object
R.BeginGuildPrune
    getGuildVoiceRegions :: ChannelId -> DiscordHandler [VoiceRegion]
getGuildVoiceRegions = GuildRequest [VoiceRegion] -> DiscordHandler [VoiceRegion]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest [VoiceRegion] -> DiscordHandler [VoiceRegion])
-> (ChannelId -> GuildRequest [VoiceRegion])
-> ChannelId
-> DiscordHandler [VoiceRegion]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildRequest [VoiceRegion]
R.GetGuildVoiceRegions
    getGuildInvites :: ChannelId -> DiscordHandler [Invite]
getGuildInvites = GuildRequest [Invite] -> DiscordHandler [Invite]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest [Invite] -> DiscordHandler [Invite])
-> (ChannelId -> GuildRequest [Invite])
-> ChannelId
-> DiscordHandler [Invite]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildRequest [Invite]
R.GetGuildInvites
    getGuildIntegrations :: ChannelId -> DiscordHandler [Integration]
getGuildIntegrations = GuildRequest [Integration] -> DiscordHandler [Integration]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest [Integration] -> DiscordHandler [Integration])
-> (ChannelId -> GuildRequest [Integration])
-> ChannelId
-> DiscordHandler [Integration]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildRequest [Integration]
R.GetGuildIntegrations
    createGuildIntegration :: ChannelId
-> ChannelId -> CreateGuildIntegrationOpts -> DiscordHandler ()
createGuildIntegration = ((GuildRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest () -> DiscordHandler ())
-> (CreateGuildIntegrationOpts -> GuildRequest ())
-> CreateGuildIntegrationOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((CreateGuildIntegrationOpts -> GuildRequest ())
 -> CreateGuildIntegrationOpts -> DiscordHandler ())
-> (ChannelId -> CreateGuildIntegrationOpts -> GuildRequest ())
-> ChannelId
-> CreateGuildIntegrationOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> CreateGuildIntegrationOpts -> GuildRequest ())
 -> ChannelId -> CreateGuildIntegrationOpts -> DiscordHandler ())
-> (ChannelId
    -> ChannelId -> CreateGuildIntegrationOpts -> GuildRequest ())
-> ChannelId
-> ChannelId
-> CreateGuildIntegrationOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId
-> ChannelId -> CreateGuildIntegrationOpts -> GuildRequest ()
R.CreateGuildIntegration
    modifyGuildIntegration :: ChannelId
-> ChannelId -> ModifyGuildIntegrationOpts -> DiscordHandler ()
modifyGuildIntegration = ((GuildRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest () -> DiscordHandler ())
-> (ModifyGuildIntegrationOpts -> GuildRequest ())
-> ModifyGuildIntegrationOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ModifyGuildIntegrationOpts -> GuildRequest ())
 -> ModifyGuildIntegrationOpts -> DiscordHandler ())
-> (ChannelId -> ModifyGuildIntegrationOpts -> GuildRequest ())
-> ChannelId
-> ModifyGuildIntegrationOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> ModifyGuildIntegrationOpts -> GuildRequest ())
 -> ChannelId -> ModifyGuildIntegrationOpts -> DiscordHandler ())
-> (ChannelId
    -> ChannelId -> ModifyGuildIntegrationOpts -> GuildRequest ())
-> ChannelId
-> ChannelId
-> ModifyGuildIntegrationOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId
-> ChannelId -> ModifyGuildIntegrationOpts -> GuildRequest ()
R.ModifyGuildIntegration
    deleteGuildIntegration :: ChannelId -> ChannelId -> DiscordHandler ()
deleteGuildIntegration = (GuildRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest () -> DiscordHandler ())
-> (ChannelId -> GuildRequest ()) -> ChannelId -> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> GuildRequest ()) -> ChannelId -> DiscordHandler ())
-> (ChannelId -> ChannelId -> GuildRequest ())
-> ChannelId
-> ChannelId
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> GuildRequest ()
R.DeleteGuildIntegration
    syncGuildIntegration :: ChannelId -> ChannelId -> DiscordHandler ()
syncGuildIntegration = (GuildRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest () -> DiscordHandler ())
-> (ChannelId -> GuildRequest ()) -> ChannelId -> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> GuildRequest ()) -> ChannelId -> DiscordHandler ())
-> (ChannelId -> ChannelId -> GuildRequest ())
-> ChannelId
-> ChannelId
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> GuildRequest ()
R.SyncGuildIntegration
    getGuildEmbed :: ChannelId -> DiscordHandler GuildEmbed
getGuildEmbed = GuildRequest GuildEmbed -> DiscordHandler GuildEmbed
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest GuildEmbed -> DiscordHandler GuildEmbed)
-> (ChannelId -> GuildRequest GuildEmbed)
-> ChannelId
-> DiscordHandler GuildEmbed
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildRequest GuildEmbed
R.GetGuildEmbed
    modifyGuildEmbed :: ChannelId -> GuildEmbed -> DiscordHandler GuildEmbed
modifyGuildEmbed = (GuildRequest GuildEmbed -> DiscordHandler GuildEmbed
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest GuildEmbed -> DiscordHandler GuildEmbed)
-> (GuildEmbed -> GuildRequest GuildEmbed)
-> GuildEmbed
-> DiscordHandler GuildEmbed
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((GuildEmbed -> GuildRequest GuildEmbed)
 -> GuildEmbed -> DiscordHandler GuildEmbed)
-> (ChannelId -> GuildEmbed -> GuildRequest GuildEmbed)
-> ChannelId
-> GuildEmbed
-> DiscordHandler GuildEmbed
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildEmbed -> GuildRequest GuildEmbed
R.ModifyGuildEmbed
    getGuildVanityURL :: ChannelId -> DiscordHandler Text
getGuildVanityURL = GuildRequest Text -> DiscordHandler Text
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (GuildRequest Text -> DiscordHandler Text)
-> (ChannelId -> GuildRequest Text)
-> ChannelId
-> DiscordHandler Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildRequest Text
R.GetGuildVanityURL
    -- Invites
    getInvite :: Text -> DiscordHandler Invite
getInvite = InviteRequest Invite -> DiscordHandler Invite
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (InviteRequest Invite -> DiscordHandler Invite)
-> (Text -> InviteRequest Invite) -> Text -> DiscordHandler Invite
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> InviteRequest Invite
R.GetInvite
    deleteInvite :: Text -> DiscordHandler Invite
deleteInvite = InviteRequest Invite -> DiscordHandler Invite
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (InviteRequest Invite -> DiscordHandler Invite)
-> (Text -> InviteRequest Invite) -> Text -> DiscordHandler Invite
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> InviteRequest Invite
R.DeleteInvite
    -- Users
    getCurrentUser :: DiscordHandler User
getCurrentUser = UserRequest User -> DiscordHandler User
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle UserRequest User
R.GetCurrentUser
    getUser :: ChannelId -> DiscordHandler User
getUser = UserRequest User -> DiscordHandler User
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (UserRequest User -> DiscordHandler User)
-> (ChannelId -> UserRequest User)
-> ChannelId
-> DiscordHandler User
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> UserRequest User
R.GetUser
    modifyCurrentUser :: Text -> CurrentUserAvatar -> DiscordHandler User
modifyCurrentUser = (UserRequest User -> DiscordHandler User
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (UserRequest User -> DiscordHandler User)
-> (CurrentUserAvatar -> UserRequest User)
-> CurrentUserAvatar
-> DiscordHandler User
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((CurrentUserAvatar -> UserRequest User)
 -> CurrentUserAvatar -> DiscordHandler User)
-> (Text -> CurrentUserAvatar -> UserRequest User)
-> Text
-> CurrentUserAvatar
-> DiscordHandler User
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> CurrentUserAvatar -> UserRequest User
R.ModifyCurrentUser
    getCurrentUserGuilds :: DiscordHandler [PartialGuild]
getCurrentUserGuilds = UserRequest [PartialGuild] -> DiscordHandler [PartialGuild]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle UserRequest [PartialGuild]
R.GetCurrentUserGuilds
    leaveGuild :: ChannelId -> DiscordHandler ()
leaveGuild = UserRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (UserRequest () -> DiscordHandler ())
-> (ChannelId -> UserRequest ()) -> ChannelId -> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> UserRequest ()
R.LeaveGuild
    getUserDMs :: DiscordHandler [Channel]
getUserDMs = UserRequest [Channel] -> DiscordHandler [Channel]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle UserRequest [Channel]
R.GetUserDMs
    createDM :: ChannelId -> DiscordHandler Channel
createDM = UserRequest Channel -> DiscordHandler Channel
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (UserRequest Channel -> DiscordHandler Channel)
-> (ChannelId -> UserRequest Channel)
-> ChannelId
-> DiscordHandler Channel
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> UserRequest Channel
R.CreateDM
    getUserConnections :: DiscordHandler [ConnectionObject]
getUserConnections = UserRequest [ConnectionObject] -> DiscordHandler [ConnectionObject]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle UserRequest [ConnectionObject]
R.GetUserConnections
    -- Voice
    listVoiceRegions :: DiscordHandler [VoiceRegion]
listVoiceRegions = VoiceRequest [VoiceRegion] -> DiscordHandler [VoiceRegion]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle VoiceRequest [VoiceRegion]
R.ListVoiceRegions
    -- Webhooks
    createWebhook :: ChannelId -> CreateWebhookOpts -> DiscordHandler Webhook
createWebhook = (WebhookRequest Webhook -> DiscordHandler Webhook
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (WebhookRequest Webhook -> DiscordHandler Webhook)
-> (CreateWebhookOpts -> WebhookRequest Webhook)
-> CreateWebhookOpts
-> DiscordHandler Webhook
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((CreateWebhookOpts -> WebhookRequest Webhook)
 -> CreateWebhookOpts -> DiscordHandler Webhook)
-> (ChannelId -> CreateWebhookOpts -> WebhookRequest Webhook)
-> ChannelId
-> CreateWebhookOpts
-> DiscordHandler Webhook
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> CreateWebhookOpts -> WebhookRequest Webhook
R.CreateWebhook
    getChannelWebhooks :: ChannelId -> DiscordHandler [Webhook]
getChannelWebhooks = WebhookRequest [Webhook] -> DiscordHandler [Webhook]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (WebhookRequest [Webhook] -> DiscordHandler [Webhook])
-> (ChannelId -> WebhookRequest [Webhook])
-> ChannelId
-> DiscordHandler [Webhook]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> WebhookRequest [Webhook]
R.GetChannelWebhooks
    getGuildWebhooks :: ChannelId -> DiscordHandler [Webhook]
getGuildWebhooks = WebhookRequest [Webhook] -> DiscordHandler [Webhook]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (WebhookRequest [Webhook] -> DiscordHandler [Webhook])
-> (ChannelId -> WebhookRequest [Webhook])
-> ChannelId
-> DiscordHandler [Webhook]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> WebhookRequest [Webhook]
R.GetGuildWebhooks
    getWebhook :: ChannelId -> DiscordHandler Webhook
getWebhook = WebhookRequest Webhook -> DiscordHandler Webhook
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (WebhookRequest Webhook -> DiscordHandler Webhook)
-> (ChannelId -> WebhookRequest Webhook)
-> ChannelId
-> DiscordHandler Webhook
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> WebhookRequest Webhook
R.GetWebhook
    getWebhookWithToken :: ChannelId -> Text -> DiscordHandler Webhook
getWebhookWithToken = (WebhookRequest Webhook -> DiscordHandler Webhook
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (WebhookRequest Webhook -> DiscordHandler Webhook)
-> (Text -> WebhookRequest Webhook)
-> Text
-> DiscordHandler Webhook
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> WebhookRequest Webhook)
 -> Text -> DiscordHandler Webhook)
-> (ChannelId -> Text -> WebhookRequest Webhook)
-> ChannelId
-> Text
-> DiscordHandler Webhook
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> Text -> WebhookRequest Webhook
R.GetWebhookWithToken
    modifyWebhook :: ChannelId -> ModifyWebhookOpts -> DiscordHandler Webhook
modifyWebhook = (WebhookRequest Webhook -> DiscordHandler Webhook
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (WebhookRequest Webhook -> DiscordHandler Webhook)
-> (ModifyWebhookOpts -> WebhookRequest Webhook)
-> ModifyWebhookOpts
-> DiscordHandler Webhook
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ModifyWebhookOpts -> WebhookRequest Webhook)
 -> ModifyWebhookOpts -> DiscordHandler Webhook)
-> (ChannelId -> ModifyWebhookOpts -> WebhookRequest Webhook)
-> ChannelId
-> ModifyWebhookOpts
-> DiscordHandler Webhook
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ModifyWebhookOpts -> WebhookRequest Webhook
R.ModifyWebhook
    modifyWebhookWithToken :: ChannelId -> Text -> ModifyWebhookOpts -> DiscordHandler Webhook
modifyWebhookWithToken = ((WebhookRequest Webhook -> DiscordHandler Webhook
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (WebhookRequest Webhook -> DiscordHandler Webhook)
-> (ModifyWebhookOpts -> WebhookRequest Webhook)
-> ModifyWebhookOpts
-> DiscordHandler Webhook
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ModifyWebhookOpts -> WebhookRequest Webhook)
 -> ModifyWebhookOpts -> DiscordHandler Webhook)
-> (Text -> ModifyWebhookOpts -> WebhookRequest Webhook)
-> Text
-> ModifyWebhookOpts
-> DiscordHandler Webhook
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> ModifyWebhookOpts -> WebhookRequest Webhook)
 -> Text -> ModifyWebhookOpts -> DiscordHandler Webhook)
-> (ChannelId
    -> Text -> ModifyWebhookOpts -> WebhookRequest Webhook)
-> ChannelId
-> Text
-> ModifyWebhookOpts
-> DiscordHandler Webhook
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> Text -> ModifyWebhookOpts -> WebhookRequest Webhook
R.ModifyWebhookWithToken
    deleteWebhook :: ChannelId -> DiscordHandler ()
deleteWebhook = WebhookRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (WebhookRequest () -> DiscordHandler ())
-> (ChannelId -> WebhookRequest ())
-> ChannelId
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> WebhookRequest ()
R.DeleteWebhook
    deleteWebhookWithToken :: ChannelId -> Text -> DiscordHandler ()
deleteWebhookWithToken = (WebhookRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (WebhookRequest () -> DiscordHandler ())
-> (Text -> WebhookRequest ()) -> Text -> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> WebhookRequest ()) -> Text -> DiscordHandler ())
-> (ChannelId -> Text -> WebhookRequest ())
-> ChannelId
-> Text
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> Text -> WebhookRequest ()
R.DeleteWebhookWithToken
    executeWebhookWithToken :: ChannelId
-> Text -> ExecuteWebhookWithTokenOpts -> DiscordHandler ()
executeWebhookWithToken = ((WebhookRequest () -> DiscordHandler ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> DiscordHandler a
restCallAndHandle (WebhookRequest () -> DiscordHandler ())
-> (ExecuteWebhookWithTokenOpts -> WebhookRequest ())
-> ExecuteWebhookWithTokenOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ExecuteWebhookWithTokenOpts -> WebhookRequest ())
 -> ExecuteWebhookWithTokenOpts -> DiscordHandler ())
-> (Text -> ExecuteWebhookWithTokenOpts -> WebhookRequest ())
-> Text
-> ExecuteWebhookWithTokenOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> ExecuteWebhookWithTokenOpts -> WebhookRequest ())
 -> Text -> ExecuteWebhookWithTokenOpts -> DiscordHandler ())
-> (ChannelId
    -> Text -> ExecuteWebhookWithTokenOpts -> WebhookRequest ())
-> ChannelId
-> Text
-> ExecuteWebhookWithTokenOpts
-> DiscordHandler ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId
-> Text -> ExecuteWebhookWithTokenOpts -> WebhookRequest ()
R.ExecuteWebhookWithToken

    -- Custom utilities
    respond :: Message -> Text -> DiscordHandler ()
respond Message
m Text
t = DiscordHandler Message -> DiscordHandler ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (DiscordHandler Message -> DiscordHandler ())
-> DiscordHandler Message -> DiscordHandler ()
forall a b. (a -> b) -> a -> b
$ ChannelId -> Text -> DiscordHandler Message
forall (m :: * -> *).
MonadDiscord m =>
ChannelId -> Text -> m Message
createMessage (Message -> ChannelId
messageChannel Message
m) Text
t

-- | @restCallAndHandle@ calls a request and returns it in the DiscordHandler
-- monad, throwing @DiscordError@ on errors.
restCallAndHandle :: (Request (r a), FromJSON a) => r a -> DiscordHandler a
restCallAndHandle :: r a -> DiscordHandler a
restCallAndHandle r a
req = r a -> DiscordHandler (Either RestCallErrorCode a)
forall a (r :: * -> *).
(FromJSON a, Request (r a)) =>
r a -> DiscordHandler (Either RestCallErrorCode a)
restCall r a
req DiscordHandler (Either RestCallErrorCode a)
-> (Either RestCallErrorCode a -> DiscordHandler a)
-> DiscordHandler a
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Either RestCallErrorCode a -> DiscordHandler a
forall a. Either RestCallErrorCode a -> DiscordHandler a
handleDiscordResult

-- | Handles the response of discord-haskell's REST calls in DiscordHandler
-- and throws a 'DiscordError' if the call errored.
handleDiscordResult :: Either RestCallErrorCode a -> DiscordHandler a
handleDiscordResult :: Either RestCallErrorCode a -> DiscordHandler a
handleDiscordResult Either RestCallErrorCode a
result =
    case Either RestCallErrorCode a
result of
        Left RestCallErrorCode
e  -> CommandError -> DiscordHandler a
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM (CommandError -> DiscordHandler a)
-> CommandError -> DiscordHandler a
forall a b. (a -> b) -> a -> b
$ RestCallErrorCode -> CommandError
DiscordError RestCallErrorCode
e
        Right a
x -> a -> DiscordHandler a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x

-- | Unfortunately, IO cannot be an instance of MonadDiscord because it needs
-- access to the Auth tokens, but that can't be put in the type signature.
-- So instead, it is implicitly passed through a ReaderT.
--
-- [Usage:]
-- @
-- import Control.Monad.Reader ( runReaderT )
-- someFunc :: IO ()
-- someFunc = runReaderT (createMessage 1234 "text" >> pure ()) (Auth "tokenhere")
-- @
instance MonadDiscord (ReaderT Auth IO) where
    getChannel :: ChannelId -> ReaderT Auth IO Channel
getChannel = ChannelRequest Channel -> ReaderT Auth IO Channel
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest Channel -> ReaderT Auth IO Channel)
-> (ChannelId -> ChannelRequest Channel)
-> ChannelId
-> ReaderT Auth IO Channel
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelRequest Channel
R.GetChannel
    modifyChannel :: ChannelId -> ModifyChannelOpts -> ReaderT Auth IO Channel
modifyChannel = (ChannelRequest Channel -> ReaderT Auth IO Channel
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest Channel -> ReaderT Auth IO Channel)
-> (ModifyChannelOpts -> ChannelRequest Channel)
-> ModifyChannelOpts
-> ReaderT Auth IO Channel
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ModifyChannelOpts -> ChannelRequest Channel)
 -> ModifyChannelOpts -> ReaderT Auth IO Channel)
-> (ChannelId -> ModifyChannelOpts -> ChannelRequest Channel)
-> ChannelId
-> ModifyChannelOpts
-> ReaderT Auth IO Channel
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ModifyChannelOpts -> ChannelRequest Channel
R.ModifyChannel
    deleteChannel :: ChannelId -> ReaderT Auth IO Channel
deleteChannel = ChannelRequest Channel -> ReaderT Auth IO Channel
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest Channel -> ReaderT Auth IO Channel)
-> (ChannelId -> ChannelRequest Channel)
-> ChannelId
-> ReaderT Auth IO Channel
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelRequest Channel
R.DeleteChannel
    getChannelMessages :: ChannelId -> (Int, MessageTiming) -> ReaderT Auth IO [Message]
getChannelMessages = (ChannelRequest [Message] -> ReaderT Auth IO [Message]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest [Message] -> ReaderT Auth IO [Message])
-> ((Int, MessageTiming) -> ChannelRequest [Message])
-> (Int, MessageTiming)
-> ReaderT Auth IO [Message]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) (((Int, MessageTiming) -> ChannelRequest [Message])
 -> (Int, MessageTiming) -> ReaderT Auth IO [Message])
-> (ChannelId -> (Int, MessageTiming) -> ChannelRequest [Message])
-> ChannelId
-> (Int, MessageTiming)
-> ReaderT Auth IO [Message]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> (Int, MessageTiming) -> ChannelRequest [Message]
R.GetChannelMessages
    getChannelMessage :: (ChannelId, ChannelId) -> ReaderT Auth IO Message
getChannelMessage = ChannelRequest Message -> ReaderT Auth IO Message
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest Message -> ReaderT Auth IO Message)
-> ((ChannelId, ChannelId) -> ChannelRequest Message)
-> (ChannelId, ChannelId)
-> ReaderT Auth IO Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ChannelId) -> ChannelRequest Message
R.GetChannelMessage
    createMessage :: ChannelId -> Text -> ReaderT Auth IO Message
createMessage = (ChannelRequest Message -> ReaderT Auth IO Message
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest Message -> ReaderT Auth IO Message)
-> (Text -> ChannelRequest Message)
-> Text
-> ReaderT Auth IO Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> ChannelRequest Message)
 -> Text -> ReaderT Auth IO Message)
-> (ChannelId -> Text -> ChannelRequest Message)
-> ChannelId
-> Text
-> ReaderT Auth IO Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> Text -> ChannelRequest Message
R.CreateMessage
    createMessageEmbed :: ChannelId -> Text -> CreateEmbed -> ReaderT Auth IO Message
createMessageEmbed = ((ChannelRequest Message -> ReaderT Auth IO Message
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest Message -> ReaderT Auth IO Message)
-> (CreateEmbed -> ChannelRequest Message)
-> CreateEmbed
-> ReaderT Auth IO Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((CreateEmbed -> ChannelRequest Message)
 -> CreateEmbed -> ReaderT Auth IO Message)
-> (Text -> CreateEmbed -> ChannelRequest Message)
-> Text
-> CreateEmbed
-> ReaderT Auth IO Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> CreateEmbed -> ChannelRequest Message)
 -> Text -> CreateEmbed -> ReaderT Auth IO Message)
-> (ChannelId -> Text -> CreateEmbed -> ChannelRequest Message)
-> ChannelId
-> Text
-> CreateEmbed
-> ReaderT Auth IO Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> Text -> CreateEmbed -> ChannelRequest Message
R.CreateMessageEmbed
    createMessageUploadFile :: ChannelId -> Text -> ByteString -> ReaderT Auth IO Message
createMessageUploadFile = ((ChannelRequest Message -> ReaderT Auth IO Message
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest Message -> ReaderT Auth IO Message)
-> (ByteString -> ChannelRequest Message)
-> ByteString
-> ReaderT Auth IO Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ByteString -> ChannelRequest Message)
 -> ByteString -> ReaderT Auth IO Message)
-> (Text -> ByteString -> ChannelRequest Message)
-> Text
-> ByteString
-> ReaderT Auth IO Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> ByteString -> ChannelRequest Message)
 -> Text -> ByteString -> ReaderT Auth IO Message)
-> (ChannelId -> Text -> ByteString -> ChannelRequest Message)
-> ChannelId
-> Text
-> ByteString
-> ReaderT Auth IO Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> Text -> ByteString -> ChannelRequest Message
R.CreateMessageUploadFile
    createMessageDetailed :: ChannelId -> MessageDetailedOpts -> ReaderT Auth IO Message
createMessageDetailed = (ChannelRequest Message -> ReaderT Auth IO Message
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest Message -> ReaderT Auth IO Message)
-> (MessageDetailedOpts -> ChannelRequest Message)
-> MessageDetailedOpts
-> ReaderT Auth IO Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((MessageDetailedOpts -> ChannelRequest Message)
 -> MessageDetailedOpts -> ReaderT Auth IO Message)
-> (ChannelId -> MessageDetailedOpts -> ChannelRequest Message)
-> ChannelId
-> MessageDetailedOpts
-> ReaderT Auth IO Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> MessageDetailedOpts -> ChannelRequest Message
R.CreateMessageDetailed
    createReaction :: (ChannelId, ChannelId) -> Text -> ReaderT Auth IO ()
createReaction = (ChannelRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest () -> ReaderT Auth IO ())
-> (Text -> ChannelRequest ()) -> Text -> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> ChannelRequest ()) -> Text -> ReaderT Auth IO ())
-> ((ChannelId, ChannelId) -> Text -> ChannelRequest ())
-> (ChannelId, ChannelId)
-> Text
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ChannelId) -> Text -> ChannelRequest ()
R.CreateReaction
    deleteOwnReaction :: (ChannelId, ChannelId) -> Text -> ReaderT Auth IO ()
deleteOwnReaction = (ChannelRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest () -> ReaderT Auth IO ())
-> (Text -> ChannelRequest ()) -> Text -> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> ChannelRequest ()) -> Text -> ReaderT Auth IO ())
-> ((ChannelId, ChannelId) -> Text -> ChannelRequest ())
-> (ChannelId, ChannelId)
-> Text
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ChannelId) -> Text -> ChannelRequest ()
R.DeleteOwnReaction
    deleteUserReaction :: (ChannelId, ChannelId) -> ChannelId -> Text -> ReaderT Auth IO ()
deleteUserReaction = ((ChannelRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest () -> ReaderT Auth IO ())
-> (Text -> ChannelRequest ()) -> Text -> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> ChannelRequest ()) -> Text -> ReaderT Auth IO ())
-> (ChannelId -> Text -> ChannelRequest ())
-> ChannelId
-> Text
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> Text -> ChannelRequest ())
 -> ChannelId -> Text -> ReaderT Auth IO ())
-> ((ChannelId, ChannelId)
    -> ChannelId -> Text -> ChannelRequest ())
-> (ChannelId, ChannelId)
-> ChannelId
-> Text
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ChannelId) -> ChannelId -> Text -> ChannelRequest ()
R.DeleteUserReaction
    deleteSingleReaction :: (ChannelId, ChannelId) -> Text -> ReaderT Auth IO ()
deleteSingleReaction = (ChannelRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest () -> ReaderT Auth IO ())
-> (Text -> ChannelRequest ()) -> Text -> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> ChannelRequest ()) -> Text -> ReaderT Auth IO ())
-> ((ChannelId, ChannelId) -> Text -> ChannelRequest ())
-> (ChannelId, ChannelId)
-> Text
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ChannelId) -> Text -> ChannelRequest ()
R.DeleteSingleReaction
    getReactions :: (ChannelId, ChannelId)
-> Text -> (Int, ReactionTiming) -> ReaderT Auth IO [User]
getReactions = ((ChannelRequest [User] -> ReaderT Auth IO [User]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest [User] -> ReaderT Auth IO [User])
-> ((Int, ReactionTiming) -> ChannelRequest [User])
-> (Int, ReactionTiming)
-> ReaderT Auth IO [User]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) (((Int, ReactionTiming) -> ChannelRequest [User])
 -> (Int, ReactionTiming) -> ReaderT Auth IO [User])
-> (Text -> (Int, ReactionTiming) -> ChannelRequest [User])
-> Text
-> (Int, ReactionTiming)
-> ReaderT Auth IO [User]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> (Int, ReactionTiming) -> ChannelRequest [User])
 -> Text -> (Int, ReactionTiming) -> ReaderT Auth IO [User])
-> ((ChannelId, ChannelId)
    -> Text -> (Int, ReactionTiming) -> ChannelRequest [User])
-> (ChannelId, ChannelId)
-> Text
-> (Int, ReactionTiming)
-> ReaderT Auth IO [User]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ChannelId)
-> Text -> (Int, ReactionTiming) -> ChannelRequest [User]
R.GetReactions
    deleteAllReactions :: (ChannelId, ChannelId) -> ReaderT Auth IO ()
deleteAllReactions = ChannelRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest () -> ReaderT Auth IO ())
-> ((ChannelId, ChannelId) -> ChannelRequest ())
-> (ChannelId, ChannelId)
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ChannelId) -> ChannelRequest ()
R.DeleteAllReactions
    editMessage :: (ChannelId, ChannelId)
-> Text -> Maybe CreateEmbed -> ReaderT Auth IO Message
editMessage = ((ChannelRequest Message -> ReaderT Auth IO Message
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest Message -> ReaderT Auth IO Message)
-> (Maybe CreateEmbed -> ChannelRequest Message)
-> Maybe CreateEmbed
-> ReaderT Auth IO Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Maybe CreateEmbed -> ChannelRequest Message)
 -> Maybe CreateEmbed -> ReaderT Auth IO Message)
-> (Text -> Maybe CreateEmbed -> ChannelRequest Message)
-> Text
-> Maybe CreateEmbed
-> ReaderT Auth IO Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> Maybe CreateEmbed -> ChannelRequest Message)
 -> Text -> Maybe CreateEmbed -> ReaderT Auth IO Message)
-> ((ChannelId, ChannelId)
    -> Text -> Maybe CreateEmbed -> ChannelRequest Message)
-> (ChannelId, ChannelId)
-> Text
-> Maybe CreateEmbed
-> ReaderT Auth IO Message
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ChannelId)
-> Text -> Maybe CreateEmbed -> ChannelRequest Message
R.EditMessage
    deleteMessage :: (ChannelId, ChannelId) -> ReaderT Auth IO ()
deleteMessage = ChannelRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest () -> ReaderT Auth IO ())
-> ((ChannelId, ChannelId) -> ChannelRequest ())
-> (ChannelId, ChannelId)
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ChannelId) -> ChannelRequest ()
R.DeleteMessage
    bulkDeleteMessage :: (ChannelId, [ChannelId]) -> ReaderT Auth IO ()
bulkDeleteMessage = ChannelRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest () -> ReaderT Auth IO ())
-> ((ChannelId, [ChannelId]) -> ChannelRequest ())
-> (ChannelId, [ChannelId])
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, [ChannelId]) -> ChannelRequest ()
R.BulkDeleteMessage
    editChannelPermissions :: ChannelId
-> ChannelId -> ChannelPermissionsOpts -> ReaderT Auth IO ()
editChannelPermissions = ((ChannelRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest () -> ReaderT Auth IO ())
-> (ChannelPermissionsOpts -> ChannelRequest ())
-> ChannelPermissionsOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelPermissionsOpts -> ChannelRequest ())
 -> ChannelPermissionsOpts -> ReaderT Auth IO ())
-> (ChannelId -> ChannelPermissionsOpts -> ChannelRequest ())
-> ChannelId
-> ChannelPermissionsOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> ChannelPermissionsOpts -> ChannelRequest ())
 -> ChannelId -> ChannelPermissionsOpts -> ReaderT Auth IO ())
-> (ChannelId
    -> ChannelId -> ChannelPermissionsOpts -> ChannelRequest ())
-> ChannelId
-> ChannelId
-> ChannelPermissionsOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId
-> ChannelId -> ChannelPermissionsOpts -> ChannelRequest ()
R.EditChannelPermissions
    getChannelInvites :: ChannelId -> ReaderT Auth IO Object
getChannelInvites = ChannelRequest Object -> ReaderT Auth IO Object
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest Object -> ReaderT Auth IO Object)
-> (ChannelId -> ChannelRequest Object)
-> ChannelId
-> ReaderT Auth IO Object
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelRequest Object
R.GetChannelInvites
    createChannelInvite :: ChannelId -> ChannelInviteOpts -> ReaderT Auth IO Invite
createChannelInvite = (ChannelRequest Invite -> ReaderT Auth IO Invite
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest Invite -> ReaderT Auth IO Invite)
-> (ChannelInviteOpts -> ChannelRequest Invite)
-> ChannelInviteOpts
-> ReaderT Auth IO Invite
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelInviteOpts -> ChannelRequest Invite)
 -> ChannelInviteOpts -> ReaderT Auth IO Invite)
-> (ChannelId -> ChannelInviteOpts -> ChannelRequest Invite)
-> ChannelId
-> ChannelInviteOpts
-> ReaderT Auth IO Invite
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelInviteOpts -> ChannelRequest Invite
R.CreateChannelInvite
    deleteChannelPermission :: ChannelId -> ChannelId -> ReaderT Auth IO ()
deleteChannelPermission = (ChannelRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest () -> ReaderT Auth IO ())
-> (ChannelId -> ChannelRequest ())
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> ChannelRequest ())
 -> ChannelId -> ReaderT Auth IO ())
-> (ChannelId -> ChannelId -> ChannelRequest ())
-> ChannelId
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> ChannelRequest ()
R.DeleteChannelPermission
    triggerTypingIndicator :: ChannelId -> ReaderT Auth IO ()
triggerTypingIndicator = ChannelRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest () -> ReaderT Auth IO ())
-> (ChannelId -> ChannelRequest ())
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelRequest ()
R.TriggerTypingIndicator
    getPinnedMessages :: ChannelId -> ReaderT Auth IO [Message]
getPinnedMessages = ChannelRequest [Message] -> ReaderT Auth IO [Message]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest [Message] -> ReaderT Auth IO [Message])
-> (ChannelId -> ChannelRequest [Message])
-> ChannelId
-> ReaderT Auth IO [Message]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelRequest [Message]
R.GetPinnedMessages
    addPinnedMessage :: (ChannelId, ChannelId) -> ReaderT Auth IO ()
addPinnedMessage = ChannelRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest () -> ReaderT Auth IO ())
-> ((ChannelId, ChannelId) -> ChannelRequest ())
-> (ChannelId, ChannelId)
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ChannelId) -> ChannelRequest ()
R.AddPinnedMessage
    deletePinnedMessage :: (ChannelId, ChannelId) -> ReaderT Auth IO ()
deletePinnedMessage = ChannelRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest () -> ReaderT Auth IO ())
-> ((ChannelId, ChannelId) -> ChannelRequest ())
-> (ChannelId, ChannelId)
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ChannelId, ChannelId) -> ChannelRequest ()
R.DeletePinnedMessage
    groupDMAddRecipient :: ChannelId -> GroupDMAddRecipientOpts -> ReaderT Auth IO ()
groupDMAddRecipient = (ChannelRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest () -> ReaderT Auth IO ())
-> (GroupDMAddRecipientOpts -> ChannelRequest ())
-> GroupDMAddRecipientOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((GroupDMAddRecipientOpts -> ChannelRequest ())
 -> GroupDMAddRecipientOpts -> ReaderT Auth IO ())
-> (ChannelId -> GroupDMAddRecipientOpts -> ChannelRequest ())
-> ChannelId
-> GroupDMAddRecipientOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GroupDMAddRecipientOpts -> ChannelRequest ()
R.GroupDMAddRecipient
    groupDMRemoveRecipient :: ChannelId -> ChannelId -> ReaderT Auth IO ()
groupDMRemoveRecipient = (ChannelRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (ChannelRequest () -> ReaderT Auth IO ())
-> (ChannelId -> ChannelRequest ())
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> ChannelRequest ())
 -> ChannelId -> ReaderT Auth IO ())
-> (ChannelId -> ChannelId -> ChannelRequest ())
-> ChannelId
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> ChannelRequest ()
R.GroupDMRemoveRecipient
    -- Emojis
    listGuildEmojis :: ChannelId -> ReaderT Auth IO [Emoji]
listGuildEmojis = EmojiRequest [Emoji] -> ReaderT Auth IO [Emoji]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (EmojiRequest [Emoji] -> ReaderT Auth IO [Emoji])
-> (ChannelId -> EmojiRequest [Emoji])
-> ChannelId
-> ReaderT Auth IO [Emoji]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> EmojiRequest [Emoji]
R.ListGuildEmojis
    getGuildEmoji :: ChannelId -> ChannelId -> ReaderT Auth IO Emoji
getGuildEmoji = (EmojiRequest Emoji -> ReaderT Auth IO Emoji
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (EmojiRequest Emoji -> ReaderT Auth IO Emoji)
-> (ChannelId -> EmojiRequest Emoji)
-> ChannelId
-> ReaderT Auth IO Emoji
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> EmojiRequest Emoji)
 -> ChannelId -> ReaderT Auth IO Emoji)
-> (ChannelId -> ChannelId -> EmojiRequest Emoji)
-> ChannelId
-> ChannelId
-> ReaderT Auth IO Emoji
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> EmojiRequest Emoji
R.GetGuildEmoji
    createGuildEmoji :: ChannelId -> Text -> ByteString -> ReaderT Auth IO Emoji
createGuildEmoji ChannelId
g Text
t ByteString
b =
        case ByteString -> Either Text EmojiImageParsed
R.parseEmojiImage ByteString
b of
            Left Text
x  -> CommandError -> ReaderT Auth IO Emoji
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM (CommandError -> ReaderT Auth IO Emoji)
-> CommandError -> ReaderT Auth IO Emoji
forall a b. (a -> b) -> a -> b
$ Text -> CommandError
ProcessingError Text
x
            Right EmojiImageParsed
x -> EmojiRequest Emoji -> ReaderT Auth IO Emoji
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (EmojiRequest Emoji -> ReaderT Auth IO Emoji)
-> EmojiRequest Emoji -> ReaderT Auth IO Emoji
forall a b. (a -> b) -> a -> b
$ ChannelId -> Text -> EmojiImageParsed -> EmojiRequest Emoji
R.CreateGuildEmoji ChannelId
g Text
t EmojiImageParsed
x
    modifyGuildEmoji :: ChannelId
-> ChannelId -> ModifyGuildEmojiOpts -> ReaderT Auth IO Emoji
modifyGuildEmoji = ((EmojiRequest Emoji -> ReaderT Auth IO Emoji
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (EmojiRequest Emoji -> ReaderT Auth IO Emoji)
-> (ModifyGuildEmojiOpts -> EmojiRequest Emoji)
-> ModifyGuildEmojiOpts
-> ReaderT Auth IO Emoji
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ModifyGuildEmojiOpts -> EmojiRequest Emoji)
 -> ModifyGuildEmojiOpts -> ReaderT Auth IO Emoji)
-> (ChannelId -> ModifyGuildEmojiOpts -> EmojiRequest Emoji)
-> ChannelId
-> ModifyGuildEmojiOpts
-> ReaderT Auth IO Emoji
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> ModifyGuildEmojiOpts -> EmojiRequest Emoji)
 -> ChannelId -> ModifyGuildEmojiOpts -> ReaderT Auth IO Emoji)
-> (ChannelId
    -> ChannelId -> ModifyGuildEmojiOpts -> EmojiRequest Emoji)
-> ChannelId
-> ChannelId
-> ModifyGuildEmojiOpts
-> ReaderT Auth IO Emoji
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId
-> ChannelId -> ModifyGuildEmojiOpts -> EmojiRequest Emoji
R.ModifyGuildEmoji
    deleteGuildEmoji :: ChannelId -> ChannelId -> ReaderT Auth IO ()
deleteGuildEmoji = (EmojiRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (EmojiRequest () -> ReaderT Auth IO ())
-> (ChannelId -> EmojiRequest ())
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> EmojiRequest ()) -> ChannelId -> ReaderT Auth IO ())
-> (ChannelId -> ChannelId -> EmojiRequest ())
-> ChannelId
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> EmojiRequest ()
R.DeleteGuildEmoji
    -- Guilds
    createGuild :: CreateGuildOpts -> ReaderT Auth IO Guild
createGuild = GuildRequest Guild -> ReaderT Auth IO Guild
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest Guild -> ReaderT Auth IO Guild)
-> (CreateGuildOpts -> GuildRequest Guild)
-> CreateGuildOpts
-> ReaderT Auth IO Guild
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CreateGuildOpts -> GuildRequest Guild
R.CreateGuild
    getGuild :: ChannelId -> ReaderT Auth IO Guild
getGuild = GuildRequest Guild -> ReaderT Auth IO Guild
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest Guild -> ReaderT Auth IO Guild)
-> (ChannelId -> GuildRequest Guild)
-> ChannelId
-> ReaderT Auth IO Guild
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildRequest Guild
R.GetGuild
    modifyGuild :: ChannelId -> ModifyGuildOpts -> ReaderT Auth IO Guild
modifyGuild = (GuildRequest Guild -> ReaderT Auth IO Guild
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest Guild -> ReaderT Auth IO Guild)
-> (ModifyGuildOpts -> GuildRequest Guild)
-> ModifyGuildOpts
-> ReaderT Auth IO Guild
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ModifyGuildOpts -> GuildRequest Guild)
 -> ModifyGuildOpts -> ReaderT Auth IO Guild)
-> (ChannelId -> ModifyGuildOpts -> GuildRequest Guild)
-> ChannelId
-> ModifyGuildOpts
-> ReaderT Auth IO Guild
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ModifyGuildOpts -> GuildRequest Guild
R.ModifyGuild
    deleteGuild :: ChannelId -> ReaderT Auth IO ()
deleteGuild = GuildRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest () -> ReaderT Auth IO ())
-> (ChannelId -> GuildRequest ())
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildRequest ()
R.DeleteGuild
    getGuildChannels :: ChannelId -> ReaderT Auth IO [Channel]
getGuildChannels = GuildRequest [Channel] -> ReaderT Auth IO [Channel]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest [Channel] -> ReaderT Auth IO [Channel])
-> (ChannelId -> GuildRequest [Channel])
-> ChannelId
-> ReaderT Auth IO [Channel]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildRequest [Channel]
R.GetGuildChannels
    createGuildChannel :: ChannelId
-> Text
-> [Overwrite]
-> CreateGuildChannelOpts
-> ReaderT Auth IO Channel
createGuildChannel = (((GuildRequest Channel -> ReaderT Auth IO Channel
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest Channel -> ReaderT Auth IO Channel)
-> (CreateGuildChannelOpts -> GuildRequest Channel)
-> CreateGuildChannelOpts
-> ReaderT Auth IO Channel
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((CreateGuildChannelOpts -> GuildRequest Channel)
 -> CreateGuildChannelOpts -> ReaderT Auth IO Channel)
-> ([Overwrite] -> CreateGuildChannelOpts -> GuildRequest Channel)
-> [Overwrite]
-> CreateGuildChannelOpts
-> ReaderT Auth IO Channel
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) (([Overwrite] -> CreateGuildChannelOpts -> GuildRequest Channel)
 -> [Overwrite]
 -> CreateGuildChannelOpts
 -> ReaderT Auth IO Channel)
-> (Text
    -> [Overwrite] -> CreateGuildChannelOpts -> GuildRequest Channel)
-> Text
-> [Overwrite]
-> CreateGuildChannelOpts
-> ReaderT Auth IO Channel
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text
  -> [Overwrite] -> CreateGuildChannelOpts -> GuildRequest Channel)
 -> Text
 -> [Overwrite]
 -> CreateGuildChannelOpts
 -> ReaderT Auth IO Channel)
-> (ChannelId
    -> Text
    -> [Overwrite]
    -> CreateGuildChannelOpts
    -> GuildRequest Channel)
-> ChannelId
-> Text
-> [Overwrite]
-> CreateGuildChannelOpts
-> ReaderT Auth IO Channel
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId
-> Text
-> [Overwrite]
-> CreateGuildChannelOpts
-> GuildRequest Channel
R.CreateGuildChannel
    modifyGuildChannelPositions :: ChannelId -> [(ChannelId, Int)] -> ReaderT Auth IO [Channel]
modifyGuildChannelPositions = (GuildRequest [Channel] -> ReaderT Auth IO [Channel]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest [Channel] -> ReaderT Auth IO [Channel])
-> ([(ChannelId, Int)] -> GuildRequest [Channel])
-> [(ChannelId, Int)]
-> ReaderT Auth IO [Channel]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) (([(ChannelId, Int)] -> GuildRequest [Channel])
 -> [(ChannelId, Int)] -> ReaderT Auth IO [Channel])
-> (ChannelId -> [(ChannelId, Int)] -> GuildRequest [Channel])
-> ChannelId
-> [(ChannelId, Int)]
-> ReaderT Auth IO [Channel]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> [(ChannelId, Int)] -> GuildRequest [Channel]
R.ModifyGuildChannelPositions
    getGuildMember :: ChannelId -> ChannelId -> ReaderT Auth IO GuildMember
getGuildMember = (GuildRequest GuildMember -> ReaderT Auth IO GuildMember
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest GuildMember -> ReaderT Auth IO GuildMember)
-> (ChannelId -> GuildRequest GuildMember)
-> ChannelId
-> ReaderT Auth IO GuildMember
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> GuildRequest GuildMember)
 -> ChannelId -> ReaderT Auth IO GuildMember)
-> (ChannelId -> ChannelId -> GuildRequest GuildMember)
-> ChannelId
-> ChannelId
-> ReaderT Auth IO GuildMember
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> GuildRequest GuildMember
R.GetGuildMember
    listGuildMembers :: ChannelId -> GuildMembersTiming -> ReaderT Auth IO [GuildMember]
listGuildMembers = (GuildRequest [GuildMember] -> ReaderT Auth IO [GuildMember]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest [GuildMember] -> ReaderT Auth IO [GuildMember])
-> (GuildMembersTiming -> GuildRequest [GuildMember])
-> GuildMembersTiming
-> ReaderT Auth IO [GuildMember]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((GuildMembersTiming -> GuildRequest [GuildMember])
 -> GuildMembersTiming -> ReaderT Auth IO [GuildMember])
-> (ChannelId -> GuildMembersTiming -> GuildRequest [GuildMember])
-> ChannelId
-> GuildMembersTiming
-> ReaderT Auth IO [GuildMember]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildMembersTiming -> GuildRequest [GuildMember]
R.ListGuildMembers
    addGuildMember :: ChannelId -> ChannelId -> AddGuildMemberOpts -> ReaderT Auth IO ()
addGuildMember = ((GuildRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest () -> ReaderT Auth IO ())
-> (AddGuildMemberOpts -> GuildRequest ())
-> AddGuildMemberOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((AddGuildMemberOpts -> GuildRequest ())
 -> AddGuildMemberOpts -> ReaderT Auth IO ())
-> (ChannelId -> AddGuildMemberOpts -> GuildRequest ())
-> ChannelId
-> AddGuildMemberOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> AddGuildMemberOpts -> GuildRequest ())
 -> ChannelId -> AddGuildMemberOpts -> ReaderT Auth IO ())
-> (ChannelId
    -> ChannelId -> AddGuildMemberOpts -> GuildRequest ())
-> ChannelId
-> ChannelId
-> AddGuildMemberOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> AddGuildMemberOpts -> GuildRequest ()
R.AddGuildMember
    modifyGuildMember :: ChannelId
-> ChannelId -> ModifyGuildMemberOpts -> ReaderT Auth IO ()
modifyGuildMember = ((GuildRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest () -> ReaderT Auth IO ())
-> (ModifyGuildMemberOpts -> GuildRequest ())
-> ModifyGuildMemberOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ModifyGuildMemberOpts -> GuildRequest ())
 -> ModifyGuildMemberOpts -> ReaderT Auth IO ())
-> (ChannelId -> ModifyGuildMemberOpts -> GuildRequest ())
-> ChannelId
-> ModifyGuildMemberOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> ModifyGuildMemberOpts -> GuildRequest ())
 -> ChannelId -> ModifyGuildMemberOpts -> ReaderT Auth IO ())
-> (ChannelId
    -> ChannelId -> ModifyGuildMemberOpts -> GuildRequest ())
-> ChannelId
-> ChannelId
-> ModifyGuildMemberOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> ModifyGuildMemberOpts -> GuildRequest ()
R.ModifyGuildMember
    modifyCurrentUserNick :: ChannelId -> Text -> ReaderT Auth IO ()
modifyCurrentUserNick = (GuildRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest () -> ReaderT Auth IO ())
-> (Text -> GuildRequest ()) -> Text -> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> GuildRequest ()) -> Text -> ReaderT Auth IO ())
-> (ChannelId -> Text -> GuildRequest ())
-> ChannelId
-> Text
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> Text -> GuildRequest ()
R.ModifyCurrentUserNick
    addGuildMemberRole :: ChannelId -> ChannelId -> ChannelId -> ReaderT Auth IO ()
addGuildMemberRole = ((GuildRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest () -> ReaderT Auth IO ())
-> (ChannelId -> GuildRequest ())
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> GuildRequest ()) -> ChannelId -> ReaderT Auth IO ())
-> (ChannelId -> ChannelId -> GuildRequest ())
-> ChannelId
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> ChannelId -> GuildRequest ())
 -> ChannelId -> ChannelId -> ReaderT Auth IO ())
-> (ChannelId -> ChannelId -> ChannelId -> GuildRequest ())
-> ChannelId
-> ChannelId
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> ChannelId -> GuildRequest ()
R.AddGuildMemberRole
    removeGuildMemberRole :: ChannelId -> ChannelId -> ChannelId -> ReaderT Auth IO ()
removeGuildMemberRole = ((GuildRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest () -> ReaderT Auth IO ())
-> (ChannelId -> GuildRequest ())
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> GuildRequest ()) -> ChannelId -> ReaderT Auth IO ())
-> (ChannelId -> ChannelId -> GuildRequest ())
-> ChannelId
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> ChannelId -> GuildRequest ())
 -> ChannelId -> ChannelId -> ReaderT Auth IO ())
-> (ChannelId -> ChannelId -> ChannelId -> GuildRequest ())
-> ChannelId
-> ChannelId
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> ChannelId -> GuildRequest ()
R.RemoveGuildMemberRole
    removeGuildMember :: ChannelId -> ChannelId -> ReaderT Auth IO ()
removeGuildMember = (GuildRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest () -> ReaderT Auth IO ())
-> (ChannelId -> GuildRequest ())
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> GuildRequest ()) -> ChannelId -> ReaderT Auth IO ())
-> (ChannelId -> ChannelId -> GuildRequest ())
-> ChannelId
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> GuildRequest ()
R.RemoveGuildMember
    getGuildBans :: ChannelId -> ReaderT Auth IO [GuildBan]
getGuildBans = GuildRequest [GuildBan] -> ReaderT Auth IO [GuildBan]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest [GuildBan] -> ReaderT Auth IO [GuildBan])
-> (ChannelId -> GuildRequest [GuildBan])
-> ChannelId
-> ReaderT Auth IO [GuildBan]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildRequest [GuildBan]
R.GetGuildBans
    getGuildBan :: ChannelId -> ChannelId -> ReaderT Auth IO GuildBan
getGuildBan = (GuildRequest GuildBan -> ReaderT Auth IO GuildBan
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest GuildBan -> ReaderT Auth IO GuildBan)
-> (ChannelId -> GuildRequest GuildBan)
-> ChannelId
-> ReaderT Auth IO GuildBan
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> GuildRequest GuildBan)
 -> ChannelId -> ReaderT Auth IO GuildBan)
-> (ChannelId -> ChannelId -> GuildRequest GuildBan)
-> ChannelId
-> ChannelId
-> ReaderT Auth IO GuildBan
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> GuildRequest GuildBan
R.GetGuildBan
    createGuildBan :: ChannelId -> ChannelId -> CreateGuildBanOpts -> ReaderT Auth IO ()
createGuildBan = ((GuildRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest () -> ReaderT Auth IO ())
-> (CreateGuildBanOpts -> GuildRequest ())
-> CreateGuildBanOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((CreateGuildBanOpts -> GuildRequest ())
 -> CreateGuildBanOpts -> ReaderT Auth IO ())
-> (ChannelId -> CreateGuildBanOpts -> GuildRequest ())
-> ChannelId
-> CreateGuildBanOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> CreateGuildBanOpts -> GuildRequest ())
 -> ChannelId -> CreateGuildBanOpts -> ReaderT Auth IO ())
-> (ChannelId
    -> ChannelId -> CreateGuildBanOpts -> GuildRequest ())
-> ChannelId
-> ChannelId
-> CreateGuildBanOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> CreateGuildBanOpts -> GuildRequest ()
R.CreateGuildBan
    removeGuildBan :: ChannelId -> ChannelId -> ReaderT Auth IO ()
removeGuildBan = (GuildRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest () -> ReaderT Auth IO ())
-> (ChannelId -> GuildRequest ())
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> GuildRequest ()) -> ChannelId -> ReaderT Auth IO ())
-> (ChannelId -> ChannelId -> GuildRequest ())
-> ChannelId
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> GuildRequest ()
R.RemoveGuildBan
    getGuildRoles :: ChannelId -> ReaderT Auth IO [Role]
getGuildRoles = GuildRequest [Role] -> ReaderT Auth IO [Role]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest [Role] -> ReaderT Auth IO [Role])
-> (ChannelId -> GuildRequest [Role])
-> ChannelId
-> ReaderT Auth IO [Role]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildRequest [Role]
R.GetGuildRoles
    createGuildRole :: ChannelId -> ModifyGuildRoleOpts -> ReaderT Auth IO Role
createGuildRole = (GuildRequest Role -> ReaderT Auth IO Role
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest Role -> ReaderT Auth IO Role)
-> (ModifyGuildRoleOpts -> GuildRequest Role)
-> ModifyGuildRoleOpts
-> ReaderT Auth IO Role
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ModifyGuildRoleOpts -> GuildRequest Role)
 -> ModifyGuildRoleOpts -> ReaderT Auth IO Role)
-> (ChannelId -> ModifyGuildRoleOpts -> GuildRequest Role)
-> ChannelId
-> ModifyGuildRoleOpts
-> ReaderT Auth IO Role
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ModifyGuildRoleOpts -> GuildRequest Role
R.CreateGuildRole
    modifyGuildRolePositions :: ChannelId -> [(ChannelId, Integer)] -> ReaderT Auth IO [Role]
modifyGuildRolePositions = (GuildRequest [Role] -> ReaderT Auth IO [Role]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest [Role] -> ReaderT Auth IO [Role])
-> ([(ChannelId, Integer)] -> GuildRequest [Role])
-> [(ChannelId, Integer)]
-> ReaderT Auth IO [Role]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) (([(ChannelId, Integer)] -> GuildRequest [Role])
 -> [(ChannelId, Integer)] -> ReaderT Auth IO [Role])
-> (ChannelId -> [(ChannelId, Integer)] -> GuildRequest [Role])
-> ChannelId
-> [(ChannelId, Integer)]
-> ReaderT Auth IO [Role]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> [(ChannelId, Integer)] -> GuildRequest [Role]
R.ModifyGuildRolePositions
    modifyGuildRole :: ChannelId
-> ChannelId -> ModifyGuildRoleOpts -> ReaderT Auth IO Role
modifyGuildRole = ((GuildRequest Role -> ReaderT Auth IO Role
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest Role -> ReaderT Auth IO Role)
-> (ModifyGuildRoleOpts -> GuildRequest Role)
-> ModifyGuildRoleOpts
-> ReaderT Auth IO Role
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ModifyGuildRoleOpts -> GuildRequest Role)
 -> ModifyGuildRoleOpts -> ReaderT Auth IO Role)
-> (ChannelId -> ModifyGuildRoleOpts -> GuildRequest Role)
-> ChannelId
-> ModifyGuildRoleOpts
-> ReaderT Auth IO Role
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> ModifyGuildRoleOpts -> GuildRequest Role)
 -> ChannelId -> ModifyGuildRoleOpts -> ReaderT Auth IO Role)
-> (ChannelId
    -> ChannelId -> ModifyGuildRoleOpts -> GuildRequest Role)
-> ChannelId
-> ChannelId
-> ModifyGuildRoleOpts
-> ReaderT Auth IO Role
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> ModifyGuildRoleOpts -> GuildRequest Role
R.ModifyGuildRole
    deleteGuildRole :: ChannelId -> ChannelId -> ReaderT Auth IO ()
deleteGuildRole = (GuildRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest () -> ReaderT Auth IO ())
-> (ChannelId -> GuildRequest ())
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> GuildRequest ()) -> ChannelId -> ReaderT Auth IO ())
-> (ChannelId -> ChannelId -> GuildRequest ())
-> ChannelId
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> GuildRequest ()
R.DeleteGuildRole
    getGuildPruneCount :: ChannelId -> Integer -> ReaderT Auth IO Object
getGuildPruneCount = (GuildRequest Object -> ReaderT Auth IO Object
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest Object -> ReaderT Auth IO Object)
-> (Integer -> GuildRequest Object)
-> Integer
-> ReaderT Auth IO Object
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Integer -> GuildRequest Object)
 -> Integer -> ReaderT Auth IO Object)
-> (ChannelId -> Integer -> GuildRequest Object)
-> ChannelId
-> Integer
-> ReaderT Auth IO Object
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> Integer -> GuildRequest Object
R.GetGuildPruneCount
    beginGuildPrune :: ChannelId -> Integer -> ReaderT Auth IO Object
beginGuildPrune = (GuildRequest Object -> ReaderT Auth IO Object
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest Object -> ReaderT Auth IO Object)
-> (Integer -> GuildRequest Object)
-> Integer
-> ReaderT Auth IO Object
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Integer -> GuildRequest Object)
 -> Integer -> ReaderT Auth IO Object)
-> (ChannelId -> Integer -> GuildRequest Object)
-> ChannelId
-> Integer
-> ReaderT Auth IO Object
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> Integer -> GuildRequest Object
R.BeginGuildPrune
    getGuildVoiceRegions :: ChannelId -> ReaderT Auth IO [VoiceRegion]
getGuildVoiceRegions = GuildRequest [VoiceRegion] -> ReaderT Auth IO [VoiceRegion]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest [VoiceRegion] -> ReaderT Auth IO [VoiceRegion])
-> (ChannelId -> GuildRequest [VoiceRegion])
-> ChannelId
-> ReaderT Auth IO [VoiceRegion]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildRequest [VoiceRegion]
R.GetGuildVoiceRegions
    getGuildInvites :: ChannelId -> ReaderT Auth IO [Invite]
getGuildInvites = GuildRequest [Invite] -> ReaderT Auth IO [Invite]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest [Invite] -> ReaderT Auth IO [Invite])
-> (ChannelId -> GuildRequest [Invite])
-> ChannelId
-> ReaderT Auth IO [Invite]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildRequest [Invite]
R.GetGuildInvites
    getGuildIntegrations :: ChannelId -> ReaderT Auth IO [Integration]
getGuildIntegrations = GuildRequest [Integration] -> ReaderT Auth IO [Integration]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest [Integration] -> ReaderT Auth IO [Integration])
-> (ChannelId -> GuildRequest [Integration])
-> ChannelId
-> ReaderT Auth IO [Integration]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildRequest [Integration]
R.GetGuildIntegrations
    createGuildIntegration :: ChannelId
-> ChannelId -> CreateGuildIntegrationOpts -> ReaderT Auth IO ()
createGuildIntegration = ((GuildRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest () -> ReaderT Auth IO ())
-> (CreateGuildIntegrationOpts -> GuildRequest ())
-> CreateGuildIntegrationOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((CreateGuildIntegrationOpts -> GuildRequest ())
 -> CreateGuildIntegrationOpts -> ReaderT Auth IO ())
-> (ChannelId -> CreateGuildIntegrationOpts -> GuildRequest ())
-> ChannelId
-> CreateGuildIntegrationOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> CreateGuildIntegrationOpts -> GuildRequest ())
 -> ChannelId -> CreateGuildIntegrationOpts -> ReaderT Auth IO ())
-> (ChannelId
    -> ChannelId -> CreateGuildIntegrationOpts -> GuildRequest ())
-> ChannelId
-> ChannelId
-> CreateGuildIntegrationOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId
-> ChannelId -> CreateGuildIntegrationOpts -> GuildRequest ()
R.CreateGuildIntegration
    modifyGuildIntegration :: ChannelId
-> ChannelId -> ModifyGuildIntegrationOpts -> ReaderT Auth IO ()
modifyGuildIntegration = ((GuildRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest () -> ReaderT Auth IO ())
-> (ModifyGuildIntegrationOpts -> GuildRequest ())
-> ModifyGuildIntegrationOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ModifyGuildIntegrationOpts -> GuildRequest ())
 -> ModifyGuildIntegrationOpts -> ReaderT Auth IO ())
-> (ChannelId -> ModifyGuildIntegrationOpts -> GuildRequest ())
-> ChannelId
-> ModifyGuildIntegrationOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> ModifyGuildIntegrationOpts -> GuildRequest ())
 -> ChannelId -> ModifyGuildIntegrationOpts -> ReaderT Auth IO ())
-> (ChannelId
    -> ChannelId -> ModifyGuildIntegrationOpts -> GuildRequest ())
-> ChannelId
-> ChannelId
-> ModifyGuildIntegrationOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId
-> ChannelId -> ModifyGuildIntegrationOpts -> GuildRequest ()
R.ModifyGuildIntegration
    deleteGuildIntegration :: ChannelId -> ChannelId -> ReaderT Auth IO ()
deleteGuildIntegration = (GuildRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest () -> ReaderT Auth IO ())
-> (ChannelId -> GuildRequest ())
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> GuildRequest ()) -> ChannelId -> ReaderT Auth IO ())
-> (ChannelId -> ChannelId -> GuildRequest ())
-> ChannelId
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> GuildRequest ()
R.DeleteGuildIntegration
    syncGuildIntegration :: ChannelId -> ChannelId -> ReaderT Auth IO ()
syncGuildIntegration = (GuildRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest () -> ReaderT Auth IO ())
-> (ChannelId -> GuildRequest ())
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ChannelId -> GuildRequest ()) -> ChannelId -> ReaderT Auth IO ())
-> (ChannelId -> ChannelId -> GuildRequest ())
-> ChannelId
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ChannelId -> GuildRequest ()
R.SyncGuildIntegration
    getGuildEmbed :: ChannelId -> ReaderT Auth IO GuildEmbed
getGuildEmbed = GuildRequest GuildEmbed -> ReaderT Auth IO GuildEmbed
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest GuildEmbed -> ReaderT Auth IO GuildEmbed)
-> (ChannelId -> GuildRequest GuildEmbed)
-> ChannelId
-> ReaderT Auth IO GuildEmbed
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildRequest GuildEmbed
R.GetGuildEmbed
    modifyGuildEmbed :: ChannelId -> GuildEmbed -> ReaderT Auth IO GuildEmbed
modifyGuildEmbed = (GuildRequest GuildEmbed -> ReaderT Auth IO GuildEmbed
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest GuildEmbed -> ReaderT Auth IO GuildEmbed)
-> (GuildEmbed -> GuildRequest GuildEmbed)
-> GuildEmbed
-> ReaderT Auth IO GuildEmbed
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((GuildEmbed -> GuildRequest GuildEmbed)
 -> GuildEmbed -> ReaderT Auth IO GuildEmbed)
-> (ChannelId -> GuildEmbed -> GuildRequest GuildEmbed)
-> ChannelId
-> GuildEmbed
-> ReaderT Auth IO GuildEmbed
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildEmbed -> GuildRequest GuildEmbed
R.ModifyGuildEmbed
    getGuildVanityURL :: ChannelId -> ReaderT Auth IO Text
getGuildVanityURL = GuildRequest Text -> ReaderT Auth IO Text
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (GuildRequest Text -> ReaderT Auth IO Text)
-> (ChannelId -> GuildRequest Text)
-> ChannelId
-> ReaderT Auth IO Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> GuildRequest Text
R.GetGuildVanityURL
    -- Invites
    getInvite :: Text -> ReaderT Auth IO Invite
getInvite = InviteRequest Invite -> ReaderT Auth IO Invite
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (InviteRequest Invite -> ReaderT Auth IO Invite)
-> (Text -> InviteRequest Invite) -> Text -> ReaderT Auth IO Invite
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> InviteRequest Invite
R.GetInvite
    deleteInvite :: Text -> ReaderT Auth IO Invite
deleteInvite = InviteRequest Invite -> ReaderT Auth IO Invite
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (InviteRequest Invite -> ReaderT Auth IO Invite)
-> (Text -> InviteRequest Invite) -> Text -> ReaderT Auth IO Invite
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> InviteRequest Invite
R.DeleteInvite
    -- Users
    getCurrentUser :: ReaderT Auth IO User
getCurrentUser = UserRequest User -> ReaderT Auth IO User
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO UserRequest User
R.GetCurrentUser
    getUser :: ChannelId -> ReaderT Auth IO User
getUser = UserRequest User -> ReaderT Auth IO User
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (UserRequest User -> ReaderT Auth IO User)
-> (ChannelId -> UserRequest User)
-> ChannelId
-> ReaderT Auth IO User
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> UserRequest User
R.GetUser
    modifyCurrentUser :: Text -> CurrentUserAvatar -> ReaderT Auth IO User
modifyCurrentUser = (UserRequest User -> ReaderT Auth IO User
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (UserRequest User -> ReaderT Auth IO User)
-> (CurrentUserAvatar -> UserRequest User)
-> CurrentUserAvatar
-> ReaderT Auth IO User
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((CurrentUserAvatar -> UserRequest User)
 -> CurrentUserAvatar -> ReaderT Auth IO User)
-> (Text -> CurrentUserAvatar -> UserRequest User)
-> Text
-> CurrentUserAvatar
-> ReaderT Auth IO User
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> CurrentUserAvatar -> UserRequest User
R.ModifyCurrentUser
    getCurrentUserGuilds :: ReaderT Auth IO [PartialGuild]
getCurrentUserGuilds = UserRequest [PartialGuild] -> ReaderT Auth IO [PartialGuild]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO UserRequest [PartialGuild]
R.GetCurrentUserGuilds
    leaveGuild :: ChannelId -> ReaderT Auth IO ()
leaveGuild = UserRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (UserRequest () -> ReaderT Auth IO ())
-> (ChannelId -> UserRequest ()) -> ChannelId -> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> UserRequest ()
R.LeaveGuild
    getUserDMs :: ReaderT Auth IO [Channel]
getUserDMs = UserRequest [Channel] -> ReaderT Auth IO [Channel]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO UserRequest [Channel]
R.GetUserDMs
    createDM :: ChannelId -> ReaderT Auth IO Channel
createDM = UserRequest Channel -> ReaderT Auth IO Channel
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (UserRequest Channel -> ReaderT Auth IO Channel)
-> (ChannelId -> UserRequest Channel)
-> ChannelId
-> ReaderT Auth IO Channel
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> UserRequest Channel
R.CreateDM
    getUserConnections :: ReaderT Auth IO [ConnectionObject]
getUserConnections = UserRequest [ConnectionObject]
-> ReaderT Auth IO [ConnectionObject]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO UserRequest [ConnectionObject]
R.GetUserConnections
    -- Voice
    listVoiceRegions :: ReaderT Auth IO [VoiceRegion]
listVoiceRegions = VoiceRequest [VoiceRegion] -> ReaderT Auth IO [VoiceRegion]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO VoiceRequest [VoiceRegion]
R.ListVoiceRegions
    -- Webhooks
    createWebhook :: ChannelId -> CreateWebhookOpts -> ReaderT Auth IO Webhook
createWebhook = (WebhookRequest Webhook -> ReaderT Auth IO Webhook
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (WebhookRequest Webhook -> ReaderT Auth IO Webhook)
-> (CreateWebhookOpts -> WebhookRequest Webhook)
-> CreateWebhookOpts
-> ReaderT Auth IO Webhook
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((CreateWebhookOpts -> WebhookRequest Webhook)
 -> CreateWebhookOpts -> ReaderT Auth IO Webhook)
-> (ChannelId -> CreateWebhookOpts -> WebhookRequest Webhook)
-> ChannelId
-> CreateWebhookOpts
-> ReaderT Auth IO Webhook
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> CreateWebhookOpts -> WebhookRequest Webhook
R.CreateWebhook
    getChannelWebhooks :: ChannelId -> ReaderT Auth IO [Webhook]
getChannelWebhooks = WebhookRequest [Webhook] -> ReaderT Auth IO [Webhook]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (WebhookRequest [Webhook] -> ReaderT Auth IO [Webhook])
-> (ChannelId -> WebhookRequest [Webhook])
-> ChannelId
-> ReaderT Auth IO [Webhook]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> WebhookRequest [Webhook]
R.GetChannelWebhooks
    getGuildWebhooks :: ChannelId -> ReaderT Auth IO [Webhook]
getGuildWebhooks = WebhookRequest [Webhook] -> ReaderT Auth IO [Webhook]
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (WebhookRequest [Webhook] -> ReaderT Auth IO [Webhook])
-> (ChannelId -> WebhookRequest [Webhook])
-> ChannelId
-> ReaderT Auth IO [Webhook]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> WebhookRequest [Webhook]
R.GetGuildWebhooks
    getWebhook :: ChannelId -> ReaderT Auth IO Webhook
getWebhook = WebhookRequest Webhook -> ReaderT Auth IO Webhook
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (WebhookRequest Webhook -> ReaderT Auth IO Webhook)
-> (ChannelId -> WebhookRequest Webhook)
-> ChannelId
-> ReaderT Auth IO Webhook
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> WebhookRequest Webhook
R.GetWebhook
    getWebhookWithToken :: ChannelId -> Text -> ReaderT Auth IO Webhook
getWebhookWithToken = (WebhookRequest Webhook -> ReaderT Auth IO Webhook
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (WebhookRequest Webhook -> ReaderT Auth IO Webhook)
-> (Text -> WebhookRequest Webhook)
-> Text
-> ReaderT Auth IO Webhook
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> WebhookRequest Webhook)
 -> Text -> ReaderT Auth IO Webhook)
-> (ChannelId -> Text -> WebhookRequest Webhook)
-> ChannelId
-> Text
-> ReaderT Auth IO Webhook
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> Text -> WebhookRequest Webhook
R.GetWebhookWithToken
    modifyWebhook :: ChannelId -> ModifyWebhookOpts -> ReaderT Auth IO Webhook
modifyWebhook = (WebhookRequest Webhook -> ReaderT Auth IO Webhook
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (WebhookRequest Webhook -> ReaderT Auth IO Webhook)
-> (ModifyWebhookOpts -> WebhookRequest Webhook)
-> ModifyWebhookOpts
-> ReaderT Auth IO Webhook
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ModifyWebhookOpts -> WebhookRequest Webhook)
 -> ModifyWebhookOpts -> ReaderT Auth IO Webhook)
-> (ChannelId -> ModifyWebhookOpts -> WebhookRequest Webhook)
-> ChannelId
-> ModifyWebhookOpts
-> ReaderT Auth IO Webhook
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> ModifyWebhookOpts -> WebhookRequest Webhook
R.ModifyWebhook
    modifyWebhookWithToken :: ChannelId -> Text -> ModifyWebhookOpts -> ReaderT Auth IO Webhook
modifyWebhookWithToken = ((WebhookRequest Webhook -> ReaderT Auth IO Webhook
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (WebhookRequest Webhook -> ReaderT Auth IO Webhook)
-> (ModifyWebhookOpts -> WebhookRequest Webhook)
-> ModifyWebhookOpts
-> ReaderT Auth IO Webhook
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ModifyWebhookOpts -> WebhookRequest Webhook)
 -> ModifyWebhookOpts -> ReaderT Auth IO Webhook)
-> (Text -> ModifyWebhookOpts -> WebhookRequest Webhook)
-> Text
-> ModifyWebhookOpts
-> ReaderT Auth IO Webhook
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> ModifyWebhookOpts -> WebhookRequest Webhook)
 -> Text -> ModifyWebhookOpts -> ReaderT Auth IO Webhook)
-> (ChannelId
    -> Text -> ModifyWebhookOpts -> WebhookRequest Webhook)
-> ChannelId
-> Text
-> ModifyWebhookOpts
-> ReaderT Auth IO Webhook
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> Text -> ModifyWebhookOpts -> WebhookRequest Webhook
R.ModifyWebhookWithToken
    deleteWebhook :: ChannelId -> ReaderT Auth IO ()
deleteWebhook = WebhookRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (WebhookRequest () -> ReaderT Auth IO ())
-> (ChannelId -> WebhookRequest ())
-> ChannelId
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> WebhookRequest ()
R.DeleteWebhook
    deleteWebhookWithToken :: ChannelId -> Text -> ReaderT Auth IO ()
deleteWebhookWithToken = (WebhookRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (WebhookRequest () -> ReaderT Auth IO ())
-> (Text -> WebhookRequest ()) -> Text -> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> WebhookRequest ()) -> Text -> ReaderT Auth IO ())
-> (ChannelId -> Text -> WebhookRequest ())
-> ChannelId
-> Text
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId -> Text -> WebhookRequest ()
R.DeleteWebhookWithToken
    executeWebhookWithToken :: ChannelId
-> Text -> ExecuteWebhookWithTokenOpts -> ReaderT Auth IO ()
executeWebhookWithToken = ((WebhookRequest () -> ReaderT Auth IO ()
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO (WebhookRequest () -> ReaderT Auth IO ())
-> (ExecuteWebhookWithTokenOpts -> WebhookRequest ())
-> ExecuteWebhookWithTokenOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((ExecuteWebhookWithTokenOpts -> WebhookRequest ())
 -> ExecuteWebhookWithTokenOpts -> ReaderT Auth IO ())
-> (Text -> ExecuteWebhookWithTokenOpts -> WebhookRequest ())
-> Text
-> ExecuteWebhookWithTokenOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((Text -> ExecuteWebhookWithTokenOpts -> WebhookRequest ())
 -> Text -> ExecuteWebhookWithTokenOpts -> ReaderT Auth IO ())
-> (ChannelId
    -> Text -> ExecuteWebhookWithTokenOpts -> WebhookRequest ())
-> ChannelId
-> Text
-> ExecuteWebhookWithTokenOpts
-> ReaderT Auth IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ChannelId
-> Text -> ExecuteWebhookWithTokenOpts -> WebhookRequest ()
R.ExecuteWebhookWithToken

    -- Custom utilities
    respond :: Message -> Text -> ReaderT Auth IO ()
respond Message
m Text
t = ReaderT Auth IO Message -> ReaderT Auth IO ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ReaderT Auth IO Message -> ReaderT Auth IO ())
-> ReaderT Auth IO Message -> ReaderT Auth IO ()
forall a b. (a -> b) -> a -> b
$ ChannelId -> Text -> ReaderT Auth IO Message
forall (m :: * -> *).
MonadDiscord m =>
ChannelId -> Text -> m Message
createMessage (Message -> ChannelId
messageChannel Message
m) Text
t


-- the following is a GIGANTIC mess basically cut and pasted from discord-haskell's
-- internals and simplified, because it's alas, not exported.

data RequestResponse
    = ResponseTryAgain
    | ResponseByteString BL.ByteString
    | ResponseErrorCode Int B.ByteString B.ByteString
    deriving (Int -> RequestResponse -> ShowS
[RequestResponse] -> ShowS
RequestResponse -> String
(Int -> RequestResponse -> ShowS)
-> (RequestResponse -> String)
-> ([RequestResponse] -> ShowS)
-> Show RequestResponse
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RequestResponse] -> ShowS
$cshowList :: [RequestResponse] -> ShowS
show :: RequestResponse -> String
$cshow :: RequestResponse -> String
showsPrec :: Int -> RequestResponse -> ShowS
$cshowsPrec :: Int -> RequestResponse -> ShowS
Show)

-- | Do an IO call to get the result of the request, and throw errors
-- whenever some error occurs. A simplified version of the logic within
-- discord-haskell's Discord.Internal.Rest.HTTP module, as it doesn't need to
-- store the error information, it can just throw it.
callRestIO
    :: (Request (r a), FromJSON a)
    => r a
    -> ReaderT Auth IO a
callRestIO :: r a -> ReaderT Auth IO a
callRestIO r a
req = do
    -- get the token
    Auth
auth <- ReaderT Auth IO Auth
forall r (m :: * -> *). MonadReader r m => m r
ask
    -- create a request with the auth in the header
    let action :: RestIO LbsResponse
action = Auth -> JsonRequest -> RestIO LbsResponse
compileRequest Auth
auth (r a -> JsonRequest
forall a. Request a => a -> JsonRequest
jsonRequest r a
req)
    -- send off the request, get the response
    LbsResponse
resp <- IO LbsResponse -> ReaderT Auth IO LbsResponse
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO LbsResponse -> ReaderT Auth IO LbsResponse)
-> IO LbsResponse -> ReaderT Auth IO LbsResponse
forall a b. (a -> b) -> a -> b
$ RestIO LbsResponse -> IO LbsResponse
forall a. RestIO a -> IO a
restIOtoIO RestIO LbsResponse
action
    let body :: HttpResponseBody LbsResponse
body = LbsResponse -> HttpResponseBody LbsResponse
forall response.
HttpResponse response =>
response -> HttpResponseBody response
Req.responseBody LbsResponse
resp
        code :: Int
code = LbsResponse -> Int
forall response. HttpResponse response => response -> Int
Req.responseStatusCode LbsResponse
resp
        status :: Text
status = ByteString -> Text
TE.decodeUtf8 (ByteString -> Text) -> ByteString -> Text
forall a b. (a -> b) -> a -> b
$ LbsResponse -> ByteString
forall response. HttpResponse response => response -> ByteString
Req.responseStatusMessage LbsResponse
resp
    case () of
        ()
_ | Int
code Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int
429, Int
500, Int
502] -> do
            -- wait a bit before retrying.
            IO () -> ReaderT Auth IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ReaderT Auth IO ()) -> IO () -> ReaderT Auth IO ()
forall a b. (a -> b) -> a -> b
$ Int -> IO ()
threadDelay (Int
10 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
10Int -> Int -> Int
forall a b. (Num a, Integral b) => a -> b -> a
^(Int
6 :: Int))
            r a -> ReaderT Auth IO a
forall (r :: * -> *) a.
(Request (r a), FromJSON a) =>
r a -> ReaderT Auth IO a
callRestIO r a
req
        ()
_ | Int
code Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
200 Bool -> Bool -> Bool
&& Int
code Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
299 -> do
            let parsableBody :: ByteString
parsableBody = if ByteString
body ByteString -> ByteString -> Bool
forall a. Eq a => a -> a -> Bool
== ByteString
"" then ByteString
"[]" else ByteString
body
            case ByteString -> Either String a
forall a. FromJSON a => ByteString -> Either String a
eitherDecode ByteString
parsableBody of
                Right a
o -> a -> ReaderT Auth IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
o
                Left String
er -> do
                    let formaterr :: Text
formaterr = String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ String
"Response could not be parsed " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
er
                    CommandError -> ReaderT Auth IO a
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM (CommandError -> ReaderT Auth IO a)
-> CommandError -> ReaderT Auth IO a
forall a b. (a -> b) -> a -> b
$ RestCallErrorCode -> CommandError
DiscordError (RestCallErrorCode -> CommandError)
-> RestCallErrorCode -> CommandError
forall a b. (a -> b) -> a -> b
$ Int -> Text -> Text -> RestCallErrorCode
RestCallErrorCode Int
code Text
"err" Text
formaterr
        ()
_ | Bool
otherwise -> do
            CommandError -> ReaderT Auth IO a
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM (CommandError -> ReaderT Auth IO a)
-> CommandError -> ReaderT Auth IO a
forall a b. (a -> b) -> a -> b
$ RestCallErrorCode -> CommandError
DiscordError (RestCallErrorCode -> CommandError)
-> RestCallErrorCode -> CommandError
forall a b. (a -> b) -> a -> b
$ Int -> Text -> Text -> RestCallErrorCode
RestCallErrorCode Int
code Text
status (ByteString -> Text
TE.decodeUtf8 (ByteString -> Text) -> ByteString -> Text
forall a b. (a -> b) -> a -> b
$ ByteString -> ByteString
BL.toStrict ByteString
body)

-- | From a JsonRequest, create a RestIO thingy with the appropriately auth
-- headers. Idk why this is necessary but it doesn't work without it.
compileRequest :: Auth -> JsonRequest -> RestIO Req.LbsResponse
compileRequest :: Auth -> JsonRequest -> RestIO LbsResponse
compileRequest Auth
auth JsonRequest
request = 
  let
    authopt :: Option 'Https
authopt = Auth -> Option 'Https
authHeader Auth
auth Option 'Https -> Option 'Https -> Option 'Https
forall a. Semigroup a => a -> a -> a
<> ByteString -> ByteString -> Option 'Https
forall (scheme :: Scheme).
ByteString -> ByteString -> Option scheme
Req.header ByteString
"X-RateLimit-Precision" ByteString
"millisecond"
  in
    case JsonRequest
request of
        (Delete Url 'Https
url Option 'Https
opts) ->
            DELETE
-> Url 'Https
-> NoReqBody
-> Proxy LbsResponse
-> Option 'Https
-> RestIO LbsResponse
forall (m :: * -> *) method body response (scheme :: Scheme).
(MonadHttp m, HttpMethod method, HttpBody body,
 HttpResponse response,
 HttpBodyAllowed (AllowsBody method) (ProvidesBody body)) =>
method
-> Url scheme
-> body
-> Proxy response
-> Option scheme
-> m response
Req.req DELETE
Req.DELETE Url 'Https
url NoReqBody
Req.NoReqBody Proxy LbsResponse
Req.lbsResponse (Option 'Https
authopt Option 'Https -> Option 'Https -> Option 'Https
forall a. Semigroup a => a -> a -> a
<> Option 'Https
opts)
        (Get Url 'Https
url Option 'Https
opts) ->
            GET
-> Url 'Https
-> NoReqBody
-> Proxy LbsResponse
-> Option 'Https
-> RestIO LbsResponse
forall (m :: * -> *) method body response (scheme :: Scheme).
(MonadHttp m, HttpMethod method, HttpBody body,
 HttpResponse response,
 HttpBodyAllowed (AllowsBody method) (ProvidesBody body)) =>
method
-> Url scheme
-> body
-> Proxy response
-> Option scheme
-> m response
Req.req GET
Req.GET Url 'Https
url NoReqBody
Req.NoReqBody Proxy LbsResponse
Req.lbsResponse (Option 'Https
authopt Option 'Https -> Option 'Https -> Option 'Https
forall a. Semigroup a => a -> a -> a
<> Option 'Https
opts)
        (Put Url 'Https
url a
body Option 'Https
opts) ->
            PUT
-> Url 'Https
-> a
-> Proxy LbsResponse
-> Option 'Https
-> RestIO LbsResponse
forall (m :: * -> *) method body response (scheme :: Scheme).
(MonadHttp m, HttpMethod method, HttpBody body,
 HttpResponse response,
 HttpBodyAllowed (AllowsBody method) (ProvidesBody body)) =>
method
-> Url scheme
-> body
-> Proxy response
-> Option scheme
-> m response
Req.req PUT
Req.PUT Url 'Https
url a
body Proxy LbsResponse
Req.lbsResponse (Option 'Https
authopt Option 'Https -> Option 'Https -> Option 'Https
forall a. Semigroup a => a -> a -> a
<> Option 'Https
opts)
        (Patch Url 'Https
url RestIO a
body Option 'Https
opts) -> do
            a
b <- RestIO a
body
            PATCH
-> Url 'Https
-> a
-> Proxy LbsResponse
-> Option 'Https
-> RestIO LbsResponse
forall (m :: * -> *) method body response (scheme :: Scheme).
(MonadHttp m, HttpMethod method, HttpBody body,
 HttpResponse response,
 HttpBodyAllowed (AllowsBody method) (ProvidesBody body)) =>
method
-> Url scheme
-> body
-> Proxy response
-> Option scheme
-> m response
Req.req PATCH
Req.PATCH Url 'Https
url a
b Proxy LbsResponse
Req.lbsResponse (Option 'Https
authopt Option 'Https -> Option 'Https -> Option 'Https
forall a. Semigroup a => a -> a -> a
<> Option 'Https
opts)
        (Post Url 'Https
url RestIO a
body Option 'Https
opts) -> do
            a
b <- RestIO a
body
            POST
-> Url 'Https
-> a
-> Proxy LbsResponse
-> Option 'Https
-> RestIO LbsResponse
forall (m :: * -> *) method body response (scheme :: Scheme).
(MonadHttp m, HttpMethod method, HttpBody body,
 HttpResponse response,
 HttpBodyAllowed (AllowsBody method) (ProvidesBody body)) =>
method
-> Url scheme
-> body
-> Proxy response
-> Option scheme
-> m response
Req.req POST
Req.POST Url 'Https
url a
b Proxy LbsResponse
Req.lbsResponse (Option 'Https
authopt Option 'Https -> Option 'Https -> Option 'Https
forall a. Semigroup a => a -> a -> a
<> Option 'Https
opts)