{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE DeriveDataTypeable #-}

-- | Data structures pertaining to Discord Channels
module Discord.Internal.Types.Channel where

import Control.Applicative (empty)
import Data.Aeson
import Data.Aeson.Types (Parser)
import Data.Default (Default, def)
import Data.Text (Text)
import Data.Time.Clock
import qualified Data.Text as T
import Data.Bits
import Data.Data (Data)

import Discord.Internal.Types.Prelude
import Discord.Internal.Types.User (User(..), GuildMember)
import Discord.Internal.Types.Embed
import Discord.Internal.Types.Components (ActionRow)
import Discord.Internal.Types.Emoji

-- | Guild channels represent an isolated set of users and messages in a Guild (Server)
data Channel
  -- | A text channel in a guild.
  = ChannelText
      { Channel -> ChannelId
channelId          :: ChannelId         -- ^ The id of the channel (Will be equal to
                                                --   the guild if it's the "general" channel).
      , Channel -> GuildId
channelGuild       :: GuildId           -- ^ The id of the guild.
      , Channel -> Text
channelName        :: T.Text            -- ^ The name of the channel (2 - 1000 characters).
      , Channel -> Integer
channelPosition    :: Integer           -- ^ The storing position of the channel.
      , Channel -> [Overwrite]
channelPermissions :: [Overwrite]       -- ^ An array of permission 'Overwrite's
      , Channel -> Integer
channelUserRateLimit :: Integer         -- ^ Seconds before a user can speak again
      , Channel -> Bool
channelNSFW        :: Bool              -- ^ Is not-safe-for-work
      , Channel -> Text
channelTopic       :: T.Text            -- ^ The topic of the channel. (0 - 1024 chars).
      , Channel -> Maybe MessageId
channelLastMessage :: Maybe MessageId   -- ^ The id of the last message sent in the
                                                --   channel
      , Channel -> Maybe ParentId
channelParentId    :: Maybe ParentId    -- ^ The id of the parent channel (category)
      }
  -- | A news Channel in a guild.
  | ChannelNews
      { channelId          :: ChannelId       -- ^ The id of the channel
      , channelGuild       :: GuildId         -- ^ The id of the guild
      , channelName        :: T.Text          -- ^ The name of the channel (2 - 1000 characters)
      , channelPosition    :: Integer         -- ^ The position of the channel
      , channelPermissions :: [Overwrite]     -- ^ An array of permission 'Overrite's
      , channelNSFW        :: Bool            -- ^ Is not-safe-for-work
      , channelTopic       :: T.Text          -- ^ Topic of the channel (0 - 1024 characters)
      , channelLastMessage :: Maybe MessageId -- ^ The ID of the last message of the channel
      , channelParentId    :: Maybe ParentId  -- ^ The id of the parent channel (category)
      }
   -- | A store page channel in a guild
  | ChannelStorePage
      { channelId          :: ChannelId      -- ^ The id of the channel
      , channelGuild       :: GuildId        -- ^ The id of the guild
      , channelName        :: T.Text         -- ^ The name of the channel (2 - 1000 characters)
      , channelPosition    :: Integer        -- ^ The position of the channel
      , channelNSFW        :: Bool           -- ^ Is not-safe-for-work
      , channelPermissions :: [Overwrite]    -- ^ An array of permission 'Overrite's
      , channelParentId    :: Maybe ParentId -- ^ The id of the parrent channel (category)
      }
  -- | A voice channel in a guild.
  | ChannelVoice
      { channelId          :: ChannelId       -- ^ The id of the channel
      , channelGuild       :: GuildId         -- ^ The id of the guild
      , channelName        :: T.Text          -- ^ The name of the channel (2 - 1000) characters
      , channelPosition    :: Integer         -- ^ The position of the channel
      , channelPermissions :: [Overwrite]     -- ^ An array of permission 'Overrite's
      , channelNSFW        :: Bool            -- ^ Is not-safe-for-work
      , Channel -> Integer
channelBitRate     :: Integer         -- ^ The bitrate (in bps) of the channel.
      , Channel -> Integer
channelUserLimit   :: Integer         -- ^ The user limit of the voice channel.
      , channelParentId    :: Maybe ParentId  -- ^ The id of the parrent channel (category)
      }
  -- | DM Channels represent a one-to-one conversation between two users, outside the scope
  --   of guilds
  | ChannelDirectMessage
      { channelId          :: ChannelId       -- ^ The id of the channel
      , Channel -> [User]
channelRecipients  :: [User]          -- ^ The 'User' object(s) of the DM recipient(s).
      , channelLastMessage :: Maybe MessageId -- ^ The last message sent to the channel
      }
  -- | Like a 'ChannelDirectMessage' but for more people
  | ChannelGroupDM
      { channelId          :: ChannelId       -- ^ The id of the channel
      , channelRecipients  :: [User]          -- ^ The 'User' object(s) of the DM recipent(s).
      , channelLastMessage :: Maybe MessageId -- ^ The last message sent to the channel
      }
  -- | A channel category
  | ChannelGuildCategory
      { channelId          :: ChannelId   -- ^ The id of the category
      , channelGuild       :: GuildId     -- ^ The id of the gild
      , channelName        :: T.Text      -- ^ The name of the category
      , channelPosition    :: Integer     -- ^ The position of the category
      , channelPermissions :: [Overwrite] -- ^ A list of permission 'Overrite's
      }
  -- | A stage channel
  | ChannelStage
      { channelId          :: ChannelId -- ^ The id of the channel
      , channelGuild       :: GuildId   -- ^ The id of the guild
      , Channel -> StageId
channelStageId     :: StageId   -- ^ The id of the stage
      , Channel -> Text
channelStageTopic  :: Text      -- ^ The topic text
      }
  -- | A news Thread
  | ChannelNewsThread
      { channelId          :: ChannelId               -- ^ The id of the thread
      , channelGuild       :: GuildId                 -- ^ The id of the guild.
      , Channel -> Maybe Text
channelThreadName  :: Maybe T.Text            -- ^ The name of the channel (2 - 1000 characters).
      , Channel -> Maybe Integer
channelUserRateLimitThread :: Maybe Integer   -- ^ Seconds before a user can speak again
      , channelLastMessage :: Maybe MessageId         -- ^ The id of the last message sent in the
                                                      --   channel
      , channelParentId    :: Maybe ParentId          -- ^ The id of the parent channel
      , Channel -> Maybe ThreadMetadata
channelThreadMetadata :: Maybe ThreadMetadata -- ^ Metadata about this thread
      , Channel -> Maybe ThreadMember
channelThreadMember :: Maybe ThreadMember     -- ^ Used to indicate if the user has joined the thread
      }
  -- | A thread anyone can join
  | ChannelPublicThread
      { channelId          :: ChannelId               -- ^ The id of the thread
      , channelGuild       :: GuildId                 -- ^ The id of the guild.
      , channelThreadName  :: Maybe T.Text            -- ^ The name of the channel (2 - 1000 characters).
      , channelUserRateLimitThread :: Maybe Integer   -- ^ Seconds before a user can speak again
      , channelLastMessage :: Maybe MessageId         -- ^ The id of the last message sent in the
                                                      --   channel
      , channelParentId    :: Maybe ParentId          -- ^ The id of the parent channel
      , channelThreadMetadata :: Maybe ThreadMetadata -- ^ Metadata about this thread
      , channelThreadMember :: Maybe ThreadMember     -- ^ Used to indicate if the user has joined the thread
      }
  -- | An on-invite thread
  | ChannelPrivateThread
      { channelId          :: ChannelId               -- ^ The id of the thread
      , channelGuild       :: GuildId                 -- ^ The id of the guild.
      , channelThreadName  :: Maybe T.Text            -- ^ The name of the channel (2 - 1000 characters).
      , channelUserRateLimitThread :: Maybe Integer   -- ^ Seconds before a user can speak again
      , channelLastMessage :: Maybe MessageId         -- ^ The id of the last message sent in the
                                                      --   channel
      , channelParentId    :: Maybe ParentId          -- ^ The id of the parent channel
      , channelThreadMetadata :: Maybe ThreadMetadata -- ^ Metadata about this thread
      , channelThreadMember :: Maybe ThreadMember     -- ^ Used to indicate if the user has joined the thread
      }
  -- | A channel of unknown type
  | ChannelUnknownType
      { channelId          :: ChannelId -- ^ The id of the channel
      , Channel -> Text
channelJSON        :: Text      -- ^ The library couldn't parse the channel type, here is the raw JSON
      } deriving (Int -> Channel -> ShowS
[Channel] -> ShowS
Channel -> String
(Int -> Channel -> ShowS)
-> (Channel -> String) -> ([Channel] -> ShowS) -> Show Channel
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Channel] -> ShowS
$cshowList :: [Channel] -> ShowS
show :: Channel -> String
$cshow :: Channel -> String
showsPrec :: Int -> Channel -> ShowS
$cshowsPrec :: Int -> Channel -> ShowS
Show, ReadPrec [Channel]
ReadPrec Channel
Int -> ReadS Channel
ReadS [Channel]
(Int -> ReadS Channel)
-> ReadS [Channel]
-> ReadPrec Channel
-> ReadPrec [Channel]
-> Read Channel
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Channel]
$creadListPrec :: ReadPrec [Channel]
readPrec :: ReadPrec Channel
$creadPrec :: ReadPrec Channel
readList :: ReadS [Channel]
$creadList :: ReadS [Channel]
readsPrec :: Int -> ReadS Channel
$creadsPrec :: Int -> ReadS Channel
Read, Channel -> Channel -> Bool
(Channel -> Channel -> Bool)
-> (Channel -> Channel -> Bool) -> Eq Channel
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Channel -> Channel -> Bool
$c/= :: Channel -> Channel -> Bool
== :: Channel -> Channel -> Bool
$c== :: Channel -> Channel -> Bool
Eq, Eq Channel
Eq Channel
-> (Channel -> Channel -> Ordering)
-> (Channel -> Channel -> Bool)
-> (Channel -> Channel -> Bool)
-> (Channel -> Channel -> Bool)
-> (Channel -> Channel -> Bool)
-> (Channel -> Channel -> Channel)
-> (Channel -> Channel -> Channel)
-> Ord Channel
Channel -> Channel -> Bool
Channel -> Channel -> Ordering
Channel -> Channel -> Channel
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Channel -> Channel -> Channel
$cmin :: Channel -> Channel -> Channel
max :: Channel -> Channel -> Channel
$cmax :: Channel -> Channel -> Channel
>= :: Channel -> Channel -> Bool
$c>= :: Channel -> Channel -> Bool
> :: Channel -> Channel -> Bool
$c> :: Channel -> Channel -> Bool
<= :: Channel -> Channel -> Bool
$c<= :: Channel -> Channel -> Bool
< :: Channel -> Channel -> Bool
$c< :: Channel -> Channel -> Bool
compare :: Channel -> Channel -> Ordering
$ccompare :: Channel -> Channel -> Ordering
$cp1Ord :: Eq Channel
Ord)

instance FromJSON Channel where
  parseJSON :: Value -> Parser Channel
parseJSON = String -> (Object -> Parser Channel) -> Value -> Parser Channel
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"Channel" ((Object -> Parser Channel) -> Value -> Parser Channel)
-> (Object -> Parser Channel) -> Value -> Parser Channel
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
    Int
type' <- (Object
o Object -> Text -> Parser Int
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"type") :: Parser Int
    case Int
type' of
      Int
0 ->
        ChannelId
-> GuildId
-> Text
-> Integer
-> [Overwrite]
-> Integer
-> Bool
-> Text
-> Maybe MessageId
-> Maybe ParentId
-> Channel
ChannelText  (ChannelId
 -> GuildId
 -> Text
 -> Integer
 -> [Overwrite]
 -> Integer
 -> Bool
 -> Text
 -> Maybe MessageId
 -> Maybe ParentId
 -> Channel)
-> Parser ChannelId
-> Parser
     (GuildId
      -> Text
      -> Integer
      -> [Overwrite]
      -> Integer
      -> Bool
      -> Text
      -> Maybe MessageId
      -> Maybe ParentId
      -> Channel)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"id"
                     Parser
  (GuildId
   -> Text
   -> Integer
   -> [Overwrite]
   -> Integer
   -> Bool
   -> Text
   -> Maybe MessageId
   -> Maybe ParentId
   -> Channel)
-> Parser GuildId
-> Parser
     (Text
      -> Integer
      -> [Overwrite]
      -> Integer
      -> Bool
      -> Text
      -> Maybe MessageId
      -> Maybe ParentId
      -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe GuildId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"guild_id" Parser (Maybe GuildId) -> GuildId -> Parser GuildId
forall a. Parser (Maybe a) -> a -> Parser a
.!= GuildId
0
                     Parser
  (Text
   -> Integer
   -> [Overwrite]
   -> Integer
   -> Bool
   -> Text
   -> Maybe MessageId
   -> Maybe ParentId
   -> Channel)
-> Parser Text
-> Parser
     (Integer
      -> [Overwrite]
      -> Integer
      -> Bool
      -> Text
      -> Maybe MessageId
      -> Maybe ParentId
      -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"name"
                     Parser
  (Integer
   -> [Overwrite]
   -> Integer
   -> Bool
   -> Text
   -> Maybe MessageId
   -> Maybe ParentId
   -> Channel)
-> Parser Integer
-> Parser
     ([Overwrite]
      -> Integer
      -> Bool
      -> Text
      -> Maybe MessageId
      -> Maybe ParentId
      -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"position"
                     Parser
  ([Overwrite]
   -> Integer
   -> Bool
   -> Text
   -> Maybe MessageId
   -> Maybe ParentId
   -> Channel)
-> Parser [Overwrite]
-> Parser
     (Integer
      -> Bool -> Text -> Maybe MessageId -> Maybe ParentId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser [Overwrite]
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"permission_overwrites"
                     Parser
  (Integer
   -> Bool -> Text -> Maybe MessageId -> Maybe ParentId -> Channel)
-> Parser Integer
-> Parser
     (Bool -> Text -> Maybe MessageId -> Maybe ParentId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"rate_limit_per_user"
                     Parser
  (Bool -> Text -> Maybe MessageId -> Maybe ParentId -> Channel)
-> Parser Bool
-> Parser (Text -> Maybe MessageId -> Maybe ParentId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"nsfw" Parser (Maybe Bool) -> Bool -> Parser Bool
forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
False
                     Parser (Text -> Maybe MessageId -> Maybe ParentId -> Channel)
-> Parser Text
-> Parser (Maybe MessageId -> Maybe ParentId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"topic" Parser (Maybe Text) -> Text -> Parser Text
forall a. Parser (Maybe a) -> a -> Parser a
.!= Text
""
                     Parser (Maybe MessageId -> Maybe ParentId -> Channel)
-> Parser (Maybe MessageId) -> Parser (Maybe ParentId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe MessageId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"last_message_id"
                     Parser (Maybe ParentId -> Channel)
-> Parser (Maybe ParentId) -> Parser Channel
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ParentId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"parent_id"
      Int
1 ->
        ChannelId -> [User] -> Maybe MessageId -> Channel
ChannelDirectMessage (ChannelId -> [User] -> Maybe MessageId -> Channel)
-> Parser ChannelId
-> Parser ([User] -> Maybe MessageId -> Channel)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"id"
                             Parser ([User] -> Maybe MessageId -> Channel)
-> Parser [User] -> Parser (Maybe MessageId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser [User]
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"recipients"
                             Parser (Maybe MessageId -> Channel)
-> Parser (Maybe MessageId) -> Parser Channel
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe MessageId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"last_message_id"
      Int
2 ->
        ChannelId
-> GuildId
-> Text
-> Integer
-> [Overwrite]
-> Bool
-> Integer
-> Integer
-> Maybe ParentId
-> Channel
ChannelVoice (ChannelId
 -> GuildId
 -> Text
 -> Integer
 -> [Overwrite]
 -> Bool
 -> Integer
 -> Integer
 -> Maybe ParentId
 -> Channel)
-> Parser ChannelId
-> Parser
     (GuildId
      -> Text
      -> Integer
      -> [Overwrite]
      -> Bool
      -> Integer
      -> Integer
      -> Maybe ParentId
      -> Channel)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"id"
                     Parser
  (GuildId
   -> Text
   -> Integer
   -> [Overwrite]
   -> Bool
   -> Integer
   -> Integer
   -> Maybe ParentId
   -> Channel)
-> Parser GuildId
-> Parser
     (Text
      -> Integer
      -> [Overwrite]
      -> Bool
      -> Integer
      -> Integer
      -> Maybe ParentId
      -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe GuildId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"guild_id" Parser (Maybe GuildId) -> GuildId -> Parser GuildId
forall a. Parser (Maybe a) -> a -> Parser a
.!= GuildId
0
                     Parser
  (Text
   -> Integer
   -> [Overwrite]
   -> Bool
   -> Integer
   -> Integer
   -> Maybe ParentId
   -> Channel)
-> Parser Text
-> Parser
     (Integer
      -> [Overwrite]
      -> Bool
      -> Integer
      -> Integer
      -> Maybe ParentId
      -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"name"
                     Parser
  (Integer
   -> [Overwrite]
   -> Bool
   -> Integer
   -> Integer
   -> Maybe ParentId
   -> Channel)
-> Parser Integer
-> Parser
     ([Overwrite]
      -> Bool -> Integer -> Integer -> Maybe ParentId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"position"
                     Parser
  ([Overwrite]
   -> Bool -> Integer -> Integer -> Maybe ParentId -> Channel)
-> Parser [Overwrite]
-> Parser (Bool -> Integer -> Integer -> Maybe ParentId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser [Overwrite]
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"permission_overwrites"
                     Parser (Bool -> Integer -> Integer -> Maybe ParentId -> Channel)
-> Parser Bool
-> Parser (Integer -> Integer -> Maybe ParentId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"nsfw" Parser (Maybe Bool) -> Bool -> Parser Bool
forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
False
                     Parser (Integer -> Integer -> Maybe ParentId -> Channel)
-> Parser Integer -> Parser (Integer -> Maybe ParentId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"bitrate"
                     Parser (Integer -> Maybe ParentId -> Channel)
-> Parser Integer -> Parser (Maybe ParentId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"user_limit"
                     Parser (Maybe ParentId -> Channel)
-> Parser (Maybe ParentId) -> Parser Channel
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ParentId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"parent_id"
      Int
3 ->
        ChannelId -> [User] -> Maybe MessageId -> Channel
ChannelGroupDM (ChannelId -> [User] -> Maybe MessageId -> Channel)
-> Parser ChannelId
-> Parser ([User] -> Maybe MessageId -> Channel)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"id"
                       Parser ([User] -> Maybe MessageId -> Channel)
-> Parser [User] -> Parser (Maybe MessageId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser [User]
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"recipients"
                       Parser (Maybe MessageId -> Channel)
-> Parser (Maybe MessageId) -> Parser Channel
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe MessageId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"last_message_id"
      Int
4 ->
        ChannelId -> GuildId -> Text -> Integer -> [Overwrite] -> Channel
ChannelGuildCategory (ChannelId -> GuildId -> Text -> Integer -> [Overwrite] -> Channel)
-> Parser ChannelId
-> Parser (GuildId -> Text -> Integer -> [Overwrite] -> Channel)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"id"
                             Parser (GuildId -> Text -> Integer -> [Overwrite] -> Channel)
-> Parser GuildId
-> Parser (Text -> Integer -> [Overwrite] -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe GuildId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"guild_id" Parser (Maybe GuildId) -> GuildId -> Parser GuildId
forall a. Parser (Maybe a) -> a -> Parser a
.!= GuildId
0
                             Parser (Text -> Integer -> [Overwrite] -> Channel)
-> Parser Text -> Parser (Integer -> [Overwrite] -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"name"
                             Parser (Integer -> [Overwrite] -> Channel)
-> Parser Integer -> Parser ([Overwrite] -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"position"
                             Parser ([Overwrite] -> Channel)
-> Parser [Overwrite] -> Parser Channel
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser [Overwrite]
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"permission_overwrites"
      Int
5 ->
        ChannelId
-> GuildId
-> Text
-> Integer
-> [Overwrite]
-> Bool
-> Text
-> Maybe MessageId
-> Maybe ParentId
-> Channel
ChannelNews (ChannelId
 -> GuildId
 -> Text
 -> Integer
 -> [Overwrite]
 -> Bool
 -> Text
 -> Maybe MessageId
 -> Maybe ParentId
 -> Channel)
-> Parser ChannelId
-> Parser
     (GuildId
      -> Text
      -> Integer
      -> [Overwrite]
      -> Bool
      -> Text
      -> Maybe MessageId
      -> Maybe ParentId
      -> Channel)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"id"
                    Parser
  (GuildId
   -> Text
   -> Integer
   -> [Overwrite]
   -> Bool
   -> Text
   -> Maybe MessageId
   -> Maybe ParentId
   -> Channel)
-> Parser GuildId
-> Parser
     (Text
      -> Integer
      -> [Overwrite]
      -> Bool
      -> Text
      -> Maybe MessageId
      -> Maybe ParentId
      -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe GuildId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"guild_id" Parser (Maybe GuildId) -> GuildId -> Parser GuildId
forall a. Parser (Maybe a) -> a -> Parser a
.!= GuildId
0
                    Parser
  (Text
   -> Integer
   -> [Overwrite]
   -> Bool
   -> Text
   -> Maybe MessageId
   -> Maybe ParentId
   -> Channel)
-> Parser Text
-> Parser
     (Integer
      -> [Overwrite]
      -> Bool
      -> Text
      -> Maybe MessageId
      -> Maybe ParentId
      -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"name"
                    Parser
  (Integer
   -> [Overwrite]
   -> Bool
   -> Text
   -> Maybe MessageId
   -> Maybe ParentId
   -> Channel)
-> Parser Integer
-> Parser
     ([Overwrite]
      -> Bool -> Text -> Maybe MessageId -> Maybe ParentId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"position"
                    Parser
  ([Overwrite]
   -> Bool -> Text -> Maybe MessageId -> Maybe ParentId -> Channel)
-> Parser [Overwrite]
-> Parser
     (Bool -> Text -> Maybe MessageId -> Maybe ParentId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser [Overwrite]
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"permission_overwrites"
                    Parser
  (Bool -> Text -> Maybe MessageId -> Maybe ParentId -> Channel)
-> Parser Bool
-> Parser (Text -> Maybe MessageId -> Maybe ParentId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"nsfw" Parser (Maybe Bool) -> Bool -> Parser Bool
forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
False
                    Parser (Text -> Maybe MessageId -> Maybe ParentId -> Channel)
-> Parser Text
-> Parser (Maybe MessageId -> Maybe ParentId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"topic" Parser (Maybe Text) -> Text -> Parser Text
forall a. Parser (Maybe a) -> a -> Parser a
.!= Text
""
                    Parser (Maybe MessageId -> Maybe ParentId -> Channel)
-> Parser (Maybe MessageId) -> Parser (Maybe ParentId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe MessageId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"last_message_id"
                    Parser (Maybe ParentId -> Channel)
-> Parser (Maybe ParentId) -> Parser Channel
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ParentId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"parent_id"
      Int
6 ->
        ChannelId
-> GuildId
-> Text
-> Integer
-> Bool
-> [Overwrite]
-> Maybe ParentId
-> Channel
ChannelStorePage (ChannelId
 -> GuildId
 -> Text
 -> Integer
 -> Bool
 -> [Overwrite]
 -> Maybe ParentId
 -> Channel)
-> Parser ChannelId
-> Parser
     (GuildId
      -> Text
      -> Integer
      -> Bool
      -> [Overwrite]
      -> Maybe ParentId
      -> Channel)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"id"
                         Parser
  (GuildId
   -> Text
   -> Integer
   -> Bool
   -> [Overwrite]
   -> Maybe ParentId
   -> Channel)
-> Parser GuildId
-> Parser
     (Text
      -> Integer -> Bool -> [Overwrite] -> Maybe ParentId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe GuildId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"guild_id" Parser (Maybe GuildId) -> GuildId -> Parser GuildId
forall a. Parser (Maybe a) -> a -> Parser a
.!= GuildId
0
                         Parser
  (Text
   -> Integer -> Bool -> [Overwrite] -> Maybe ParentId -> Channel)
-> Parser Text
-> Parser
     (Integer -> Bool -> [Overwrite] -> Maybe ParentId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"name"
                         Parser
  (Integer -> Bool -> [Overwrite] -> Maybe ParentId -> Channel)
-> Parser Integer
-> Parser (Bool -> [Overwrite] -> Maybe ParentId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"position"
                         Parser (Bool -> [Overwrite] -> Maybe ParentId -> Channel)
-> Parser Bool -> Parser ([Overwrite] -> Maybe ParentId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"nsfw" Parser (Maybe Bool) -> Bool -> Parser Bool
forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
False
                         Parser ([Overwrite] -> Maybe ParentId -> Channel)
-> Parser [Overwrite] -> Parser (Maybe ParentId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser [Overwrite]
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"permission_overwrites"
                         Parser (Maybe ParentId -> Channel)
-> Parser (Maybe ParentId) -> Parser Channel
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ParentId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"parent_id"
      Int
10 -> ChannelId
-> GuildId
-> Maybe Text
-> Maybe Integer
-> Maybe MessageId
-> Maybe ParentId
-> Maybe ThreadMetadata
-> Maybe ThreadMember
-> Channel
ChannelNewsThread (ChannelId
 -> GuildId
 -> Maybe Text
 -> Maybe Integer
 -> Maybe MessageId
 -> Maybe ParentId
 -> Maybe ThreadMetadata
 -> Maybe ThreadMember
 -> Channel)
-> Parser ChannelId
-> Parser
     (GuildId
      -> Maybe Text
      -> Maybe Integer
      -> Maybe MessageId
      -> Maybe ParentId
      -> Maybe ThreadMetadata
      -> Maybe ThreadMember
      -> Channel)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
oObject -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"id"
                              Parser
  (GuildId
   -> Maybe Text
   -> Maybe Integer
   -> Maybe MessageId
   -> Maybe ParentId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser GuildId
-> Parser
     (Maybe Text
      -> Maybe Integer
      -> Maybe MessageId
      -> Maybe ParentId
      -> Maybe ThreadMetadata
      -> Maybe ThreadMember
      -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe GuildId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"guild_id" Parser (Maybe GuildId) -> GuildId -> Parser GuildId
forall a. Parser (Maybe a) -> a -> Parser a
.!= GuildId
0
                              Parser
  (Maybe Text
   -> Maybe Integer
   -> Maybe MessageId
   -> Maybe ParentId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser (Maybe Text)
-> Parser
     (Maybe Integer
      -> Maybe MessageId
      -> Maybe ParentId
      -> Maybe ThreadMetadata
      -> Maybe ThreadMember
      -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"name"
                              Parser
  (Maybe Integer
   -> Maybe MessageId
   -> Maybe ParentId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser (Maybe Integer)
-> Parser
     (Maybe MessageId
      -> Maybe ParentId
      -> Maybe ThreadMetadata
      -> Maybe ThreadMember
      -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"rate_limit_per_user"
                              Parser
  (Maybe MessageId
   -> Maybe ParentId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser (Maybe MessageId)
-> Parser
     (Maybe ParentId
      -> Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe MessageId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"last_message_id"
                              Parser
  (Maybe ParentId
   -> Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
-> Parser (Maybe ParentId)
-> Parser (Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ParentId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"parent_id"
                              Parser (Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
-> Parser (Maybe ThreadMetadata)
-> Parser (Maybe ThreadMember -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ThreadMetadata)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"thread_metadata"
                              Parser (Maybe ThreadMember -> Channel)
-> Parser (Maybe ThreadMember) -> Parser Channel
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ThreadMember)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"member"
      Int
11 -> ChannelId
-> GuildId
-> Maybe Text
-> Maybe Integer
-> Maybe MessageId
-> Maybe ParentId
-> Maybe ThreadMetadata
-> Maybe ThreadMember
-> Channel
ChannelPublicThread (ChannelId
 -> GuildId
 -> Maybe Text
 -> Maybe Integer
 -> Maybe MessageId
 -> Maybe ParentId
 -> Maybe ThreadMetadata
 -> Maybe ThreadMember
 -> Channel)
-> Parser ChannelId
-> Parser
     (GuildId
      -> Maybe Text
      -> Maybe Integer
      -> Maybe MessageId
      -> Maybe ParentId
      -> Maybe ThreadMetadata
      -> Maybe ThreadMember
      -> Channel)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
oObject -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"id"
                                Parser
  (GuildId
   -> Maybe Text
   -> Maybe Integer
   -> Maybe MessageId
   -> Maybe ParentId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser GuildId
-> Parser
     (Maybe Text
      -> Maybe Integer
      -> Maybe MessageId
      -> Maybe ParentId
      -> Maybe ThreadMetadata
      -> Maybe ThreadMember
      -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe GuildId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"guild_id" Parser (Maybe GuildId) -> GuildId -> Parser GuildId
forall a. Parser (Maybe a) -> a -> Parser a
.!= GuildId
0
                                Parser
  (Maybe Text
   -> Maybe Integer
   -> Maybe MessageId
   -> Maybe ParentId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser (Maybe Text)
-> Parser
     (Maybe Integer
      -> Maybe MessageId
      -> Maybe ParentId
      -> Maybe ThreadMetadata
      -> Maybe ThreadMember
      -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"name"
                                Parser
  (Maybe Integer
   -> Maybe MessageId
   -> Maybe ParentId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser (Maybe Integer)
-> Parser
     (Maybe MessageId
      -> Maybe ParentId
      -> Maybe ThreadMetadata
      -> Maybe ThreadMember
      -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"rate_limit_per_user"
                                Parser
  (Maybe MessageId
   -> Maybe ParentId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser (Maybe MessageId)
-> Parser
     (Maybe ParentId
      -> Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe MessageId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"last_message_id"
                                Parser
  (Maybe ParentId
   -> Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
-> Parser (Maybe ParentId)
-> Parser (Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ParentId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"parent_id"
                                Parser (Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
-> Parser (Maybe ThreadMetadata)
-> Parser (Maybe ThreadMember -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ThreadMetadata)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"thread_metadata"
                                Parser (Maybe ThreadMember -> Channel)
-> Parser (Maybe ThreadMember) -> Parser Channel
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ThreadMember)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"member"
      Int
12 -> ChannelId
-> GuildId
-> Maybe Text
-> Maybe Integer
-> Maybe MessageId
-> Maybe ParentId
-> Maybe ThreadMetadata
-> Maybe ThreadMember
-> Channel
ChannelPrivateThread (ChannelId
 -> GuildId
 -> Maybe Text
 -> Maybe Integer
 -> Maybe MessageId
 -> Maybe ParentId
 -> Maybe ThreadMetadata
 -> Maybe ThreadMember
 -> Channel)
-> Parser ChannelId
-> Parser
     (GuildId
      -> Maybe Text
      -> Maybe Integer
      -> Maybe MessageId
      -> Maybe ParentId
      -> Maybe ThreadMetadata
      -> Maybe ThreadMember
      -> Channel)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
oObject -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"id"
                                 Parser
  (GuildId
   -> Maybe Text
   -> Maybe Integer
   -> Maybe MessageId
   -> Maybe ParentId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser GuildId
-> Parser
     (Maybe Text
      -> Maybe Integer
      -> Maybe MessageId
      -> Maybe ParentId
      -> Maybe ThreadMetadata
      -> Maybe ThreadMember
      -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe GuildId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"guild_id" Parser (Maybe GuildId) -> GuildId -> Parser GuildId
forall a. Parser (Maybe a) -> a -> Parser a
.!= GuildId
0
                                 Parser
  (Maybe Text
   -> Maybe Integer
   -> Maybe MessageId
   -> Maybe ParentId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser (Maybe Text)
-> Parser
     (Maybe Integer
      -> Maybe MessageId
      -> Maybe ParentId
      -> Maybe ThreadMetadata
      -> Maybe ThreadMember
      -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"name"
                                 Parser
  (Maybe Integer
   -> Maybe MessageId
   -> Maybe ParentId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser (Maybe Integer)
-> Parser
     (Maybe MessageId
      -> Maybe ParentId
      -> Maybe ThreadMetadata
      -> Maybe ThreadMember
      -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"rate_limit_per_user"
                                 Parser
  (Maybe MessageId
   -> Maybe ParentId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser (Maybe MessageId)
-> Parser
     (Maybe ParentId
      -> Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe MessageId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"last_message_id"
                                 Parser
  (Maybe ParentId
   -> Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
-> Parser (Maybe ParentId)
-> Parser (Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ParentId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"parent_id"
                                 Parser (Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
-> Parser (Maybe ThreadMetadata)
-> Parser (Maybe ThreadMember -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ThreadMetadata)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"thread_metadata"
                                 Parser (Maybe ThreadMember -> Channel)
-> Parser (Maybe ThreadMember) -> Parser Channel
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ThreadMember)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"member"
      Int
13 ->
        ChannelId -> GuildId -> StageId -> Text -> Channel
ChannelStage (ChannelId -> GuildId -> StageId -> Text -> Channel)
-> Parser ChannelId
-> Parser (GuildId -> StageId -> Text -> Channel)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"id"
                     Parser (GuildId -> StageId -> Text -> Channel)
-> Parser GuildId -> Parser (StageId -> Text -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe GuildId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"guild_id" Parser (Maybe GuildId) -> GuildId -> Parser GuildId
forall a. Parser (Maybe a) -> a -> Parser a
.!= GuildId
0
                     Parser (StageId -> Text -> Channel)
-> Parser StageId -> Parser (Text -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser StageId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"id"
                     Parser (Text -> Channel) -> Parser Text -> Parser Channel
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"topic" Parser (Maybe Text) -> Text -> Parser Text
forall a. Parser (Maybe a) -> a -> Parser a
.!= Text
""
      Int
_ -> ChannelId -> Text -> Channel
ChannelUnknownType (ChannelId -> Text -> Channel)
-> Parser ChannelId -> Parser (Text -> Channel)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"id"
                              Parser (Text -> Channel) -> Parser Text -> Parser Channel
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text -> Parser Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure (String -> Text
T.pack (Object -> String
forall a. Show a => a -> String
show Object
o))

instance ToJSON Channel where
  toJSON :: Channel -> Value
toJSON ChannelText{Bool
Integer
[Overwrite]
Maybe ParentId
Maybe MessageId
Text
GuildId
ChannelId
channelParentId :: Maybe ParentId
channelLastMessage :: Maybe MessageId
channelTopic :: Text
channelNSFW :: Bool
channelUserRateLimit :: Integer
channelPermissions :: [Overwrite]
channelPosition :: Integer
channelName :: Text
channelGuild :: GuildId
channelId :: ChannelId
channelParentId :: Channel -> Maybe ParentId
channelLastMessage :: Channel -> Maybe MessageId
channelTopic :: Channel -> Text
channelNSFW :: Channel -> Bool
channelUserRateLimit :: Channel -> Integer
channelPermissions :: Channel -> [Overwrite]
channelPosition :: Channel -> Integer
channelName :: Channel -> Text
channelGuild :: Channel -> GuildId
channelId :: Channel -> ChannelId
..} = [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"type", Value -> Maybe Value
forall a. a -> Maybe a
Just (Scientific -> Value
Number Scientific
0))
              , (Text
"id",     ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelId)
              , (Text
"guild_id", GuildId -> Value
forall a. ToJSON a => a -> Value
toJSON (GuildId -> Value) -> Maybe GuildId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GuildId -> Maybe GuildId
forall (f :: * -> *) a. Applicative f => a -> f a
pure GuildId
channelGuild)
              , (Text
"name",  Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
channelName)
              , (Text
"position",   Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Integer -> Maybe Integer
forall (f :: * -> *) a. Applicative f => a -> f a
pure Integer
channelPosition)
              , (Text
"rate_limit_per_user", Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Integer -> Maybe Integer
forall (f :: * -> *) a. Applicative f => a -> f a
pure Integer
channelUserRateLimit)
              , (Text
"nsfw", Bool -> Value
forall a. ToJSON a => a -> Value
toJSON (Bool -> Value) -> Maybe Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> Maybe Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
channelNSFW)
              , (Text
"permission_overwrites",   [Overwrite] -> Value
forall a. ToJSON a => a -> Value
toJSON ([Overwrite] -> Value) -> Maybe [Overwrite] -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Overwrite] -> Maybe [Overwrite]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [Overwrite]
channelPermissions)
              , (Text
"topic",   Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
channelTopic)
              , (Text
"last_message_id",  MessageId -> Value
forall a. ToJSON a => a -> Value
toJSON (MessageId -> Value) -> Maybe MessageId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe MessageId
channelLastMessage)
              , (Text
"parent_id",  Maybe ParentId -> Value
forall a. ToJSON a => a -> Value
toJSON (Maybe ParentId -> Value) -> Maybe (Maybe ParentId) -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ParentId -> Maybe (Maybe ParentId)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe ParentId
channelParentId)
              ] ]
  toJSON ChannelNews{Bool
Integer
[Overwrite]
Maybe ParentId
Maybe MessageId
Text
GuildId
ChannelId
channelParentId :: Maybe ParentId
channelLastMessage :: Maybe MessageId
channelTopic :: Text
channelNSFW :: Bool
channelPermissions :: [Overwrite]
channelPosition :: Integer
channelName :: Text
channelGuild :: GuildId
channelId :: ChannelId
channelParentId :: Channel -> Maybe ParentId
channelLastMessage :: Channel -> Maybe MessageId
channelTopic :: Channel -> Text
channelNSFW :: Channel -> Bool
channelPermissions :: Channel -> [Overwrite]
channelPosition :: Channel -> Integer
channelName :: Channel -> Text
channelGuild :: Channel -> GuildId
channelId :: Channel -> ChannelId
..} = [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"type", Value -> Maybe Value
forall a. a -> Maybe a
Just (Scientific -> Value
Number Scientific
5))
              , (Text
"id",     ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelId)
              , (Text
"guild_id", GuildId -> Value
forall a. ToJSON a => a -> Value
toJSON (GuildId -> Value) -> Maybe GuildId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GuildId -> Maybe GuildId
forall (f :: * -> *) a. Applicative f => a -> f a
pure GuildId
channelGuild)
              , (Text
"name",  Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
channelName)
              , (Text
"position",   Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Integer -> Maybe Integer
forall (f :: * -> *) a. Applicative f => a -> f a
pure Integer
channelPosition)
              , (Text
"permission_overwrites",   [Overwrite] -> Value
forall a. ToJSON a => a -> Value
toJSON ([Overwrite] -> Value) -> Maybe [Overwrite] -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Overwrite] -> Maybe [Overwrite]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [Overwrite]
channelPermissions)
              , (Text
"nsfw", Bool -> Value
forall a. ToJSON a => a -> Value
toJSON (Bool -> Value) -> Maybe Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> Maybe Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
channelNSFW)
              , (Text
"topic",   Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
channelTopic)
              , (Text
"last_message_id",  MessageId -> Value
forall a. ToJSON a => a -> Value
toJSON (MessageId -> Value) -> Maybe MessageId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe MessageId
channelLastMessage)
              , (Text
"parent_id", ParentId -> Value
forall a. ToJSON a => a -> Value
toJSON (ParentId -> Value) -> Maybe ParentId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ParentId
channelParentId)
              ] ]
  toJSON ChannelStorePage{Bool
Integer
[Overwrite]
Maybe ParentId
Text
GuildId
ChannelId
channelParentId :: Maybe ParentId
channelPermissions :: [Overwrite]
channelNSFW :: Bool
channelPosition :: Integer
channelName :: Text
channelGuild :: GuildId
channelId :: ChannelId
channelParentId :: Channel -> Maybe ParentId
channelNSFW :: Channel -> Bool
channelPermissions :: Channel -> [Overwrite]
channelPosition :: Channel -> Integer
channelName :: Channel -> Text
channelGuild :: Channel -> GuildId
channelId :: Channel -> ChannelId
..} = [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"type", Value -> Maybe Value
forall a. a -> Maybe a
Just (Scientific -> Value
Number Scientific
6))
              , (Text
"id",     ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelId)
              , (Text
"guild_id", GuildId -> Value
forall a. ToJSON a => a -> Value
toJSON (GuildId -> Value) -> Maybe GuildId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GuildId -> Maybe GuildId
forall (f :: * -> *) a. Applicative f => a -> f a
pure GuildId
channelGuild)
              , (Text
"name",  Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
channelName)
              , (Text
"nsfw", Bool -> Value
forall a. ToJSON a => a -> Value
toJSON (Bool -> Value) -> Maybe Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> Maybe Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
channelNSFW)
              , (Text
"position",   Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Integer -> Maybe Integer
forall (f :: * -> *) a. Applicative f => a -> f a
pure Integer
channelPosition)
              , (Text
"permission_overwrites",   [Overwrite] -> Value
forall a. ToJSON a => a -> Value
toJSON ([Overwrite] -> Value) -> Maybe [Overwrite] -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Overwrite] -> Maybe [Overwrite]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [Overwrite]
channelPermissions)
              ] ]
  toJSON ChannelDirectMessage{[User]
Maybe MessageId
ChannelId
channelLastMessage :: Maybe MessageId
channelRecipients :: [User]
channelId :: ChannelId
channelRecipients :: Channel -> [User]
channelLastMessage :: Channel -> Maybe MessageId
channelId :: Channel -> ChannelId
..} = [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"type", Value -> Maybe Value
forall a. a -> Maybe a
Just (Scientific -> Value
Number Scientific
1))
              , (Text
"id",     ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelId)
              , (Text
"recipients",   [User] -> Value
forall a. ToJSON a => a -> Value
toJSON ([User] -> Value) -> Maybe [User] -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [User] -> Maybe [User]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [User]
channelRecipients)
              , (Text
"last_message_id",  MessageId -> Value
forall a. ToJSON a => a -> Value
toJSON (MessageId -> Value) -> Maybe MessageId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe MessageId
channelLastMessage)
              ] ]
  toJSON ChannelVoice{Bool
Integer
[Overwrite]
Maybe ParentId
Text
GuildId
ChannelId
channelParentId :: Maybe ParentId
channelUserLimit :: Integer
channelBitRate :: Integer
channelNSFW :: Bool
channelPermissions :: [Overwrite]
channelPosition :: Integer
channelName :: Text
channelGuild :: GuildId
channelId :: ChannelId
channelUserLimit :: Channel -> Integer
channelBitRate :: Channel -> Integer
channelParentId :: Channel -> Maybe ParentId
channelNSFW :: Channel -> Bool
channelPermissions :: Channel -> [Overwrite]
channelPosition :: Channel -> Integer
channelName :: Channel -> Text
channelGuild :: Channel -> GuildId
channelId :: Channel -> ChannelId
..} = [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"type", Value -> Maybe Value
forall a. a -> Maybe a
Just (Scientific -> Value
Number Scientific
2))
              , (Text
"id",     ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelId)
              , (Text
"guild_id", GuildId -> Value
forall a. ToJSON a => a -> Value
toJSON (GuildId -> Value) -> Maybe GuildId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GuildId -> Maybe GuildId
forall (f :: * -> *) a. Applicative f => a -> f a
pure GuildId
channelGuild)
              , (Text
"name",  Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
channelName)
              , (Text
"position",   Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Integer -> Maybe Integer
forall (f :: * -> *) a. Applicative f => a -> f a
pure Integer
channelPosition)
              , (Text
"nsfw", Bool -> Value
forall a. ToJSON a => a -> Value
toJSON (Bool -> Value) -> Maybe Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> Maybe Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
channelNSFW)
              , (Text
"permission_overwrites",   [Overwrite] -> Value
forall a. ToJSON a => a -> Value
toJSON ([Overwrite] -> Value) -> Maybe [Overwrite] -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Overwrite] -> Maybe [Overwrite]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [Overwrite]
channelPermissions)
              , (Text
"bitrate",   Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Integer -> Maybe Integer
forall (f :: * -> *) a. Applicative f => a -> f a
pure Integer
channelBitRate)
              , (Text
"user_limit",  Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Integer -> Maybe Integer
forall (f :: * -> *) a. Applicative f => a -> f a
pure Integer
channelUserLimit)
              ] ]
  toJSON ChannelGroupDM{[User]
Maybe MessageId
ChannelId
channelLastMessage :: Maybe MessageId
channelRecipients :: [User]
channelId :: ChannelId
channelRecipients :: Channel -> [User]
channelLastMessage :: Channel -> Maybe MessageId
channelId :: Channel -> ChannelId
..} = [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"type", Value -> Maybe Value
forall a. a -> Maybe a
Just (Scientific -> Value
Number Scientific
3))
              , (Text
"id",     ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelId)
              , (Text
"recipients",   [User] -> Value
forall a. ToJSON a => a -> Value
toJSON ([User] -> Value) -> Maybe [User] -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [User] -> Maybe [User]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [User]
channelRecipients)
              , (Text
"last_message_id",  MessageId -> Value
forall a. ToJSON a => a -> Value
toJSON (MessageId -> Value) -> Maybe MessageId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe MessageId
channelLastMessage)
              ] ]
  toJSON ChannelGuildCategory{Integer
[Overwrite]
Text
GuildId
ChannelId
channelPermissions :: [Overwrite]
channelPosition :: Integer
channelName :: Text
channelGuild :: GuildId
channelId :: ChannelId
channelPermissions :: Channel -> [Overwrite]
channelPosition :: Channel -> Integer
channelName :: Channel -> Text
channelGuild :: Channel -> GuildId
channelId :: Channel -> ChannelId
..} = [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"type", Value -> Maybe Value
forall a. a -> Maybe a
Just (Scientific -> Value
Number Scientific
4))
              , (Text
"id",     ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelId)
              , (Text
"name", Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
channelName)
              , (Text
"guild_id", GuildId -> Value
forall a. ToJSON a => a -> Value
toJSON (GuildId -> Value) -> Maybe GuildId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GuildId -> Maybe GuildId
forall (f :: * -> *) a. Applicative f => a -> f a
pure GuildId
channelGuild)
              ] ]
  toJSON ChannelStage{Text
GuildId
StageId
ChannelId
channelStageTopic :: Text
channelStageId :: StageId
channelGuild :: GuildId
channelId :: ChannelId
channelStageTopic :: Channel -> Text
channelStageId :: Channel -> StageId
channelGuild :: Channel -> GuildId
channelId :: Channel -> ChannelId
..} = [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"type", Value -> Maybe Value
forall a. a -> Maybe a
Just (Scientific -> Value
Number Scientific
13))
              , (Text
"id",     ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelId)
              , (Text
"guild_id", GuildId -> Value
forall a. ToJSON a => a -> Value
toJSON (GuildId -> Value) -> Maybe GuildId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GuildId -> Maybe GuildId
forall (f :: * -> *) a. Applicative f => a -> f a
pure GuildId
channelGuild)
              , (Text
"channel_id", StageId -> Value
forall a. ToJSON a => a -> Value
toJSON (StageId -> Value) -> Maybe StageId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> StageId -> Maybe StageId
forall (f :: * -> *) a. Applicative f => a -> f a
pure StageId
channelStageId)
              , (Text
"topic", Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
channelStageTopic)
              ] ]
  toJSON ChannelNewsThread{Maybe Integer
Maybe Text
Maybe ParentId
Maybe MessageId
Maybe ThreadMember
Maybe ThreadMetadata
GuildId
ChannelId
channelThreadMember :: Maybe ThreadMember
channelThreadMetadata :: Maybe ThreadMetadata
channelParentId :: Maybe ParentId
channelLastMessage :: Maybe MessageId
channelUserRateLimitThread :: Maybe Integer
channelThreadName :: Maybe Text
channelGuild :: GuildId
channelId :: ChannelId
channelThreadMember :: Channel -> Maybe ThreadMember
channelThreadMetadata :: Channel -> Maybe ThreadMetadata
channelUserRateLimitThread :: Channel -> Maybe Integer
channelThreadName :: Channel -> Maybe Text
channelParentId :: Channel -> Maybe ParentId
channelLastMessage :: Channel -> Maybe MessageId
channelGuild :: Channel -> GuildId
channelId :: Channel -> ChannelId
..} = [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"type", Value -> Maybe Value
forall a. a -> Maybe a
Just (Scientific -> Value
Number Scientific
10))
              , (Text
"id",     ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelId)
              , (Text
"guild_id", GuildId -> Value
forall a. ToJSON a => a -> Value
toJSON (GuildId -> Value) -> Maybe GuildId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GuildId -> Maybe GuildId
forall (f :: * -> *) a. Applicative f => a -> f a
pure GuildId
channelGuild)
              , (Text
"name",  Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Text
channelThreadName)
              , (Text
"rate_limit_per_user", Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Integer
channelUserRateLimitThread)
              , (Text
"last_message_id",  MessageId -> Value
forall a. ToJSON a => a -> Value
toJSON (MessageId -> Value) -> Maybe MessageId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe MessageId
channelLastMessage)
              , (Text
"parent_id",  Maybe ParentId -> Value
forall a. ToJSON a => a -> Value
toJSON (Maybe ParentId -> Value) -> Maybe (Maybe ParentId) -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ParentId -> Maybe (Maybe ParentId)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe ParentId
channelParentId)
              , (Text
"thread_metadata", ThreadMetadata -> Value
forall a. ToJSON a => a -> Value
toJSON (ThreadMetadata -> Value) -> Maybe ThreadMetadata -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ThreadMetadata
channelThreadMetadata)
              , (Text
"member", ThreadMember -> Value
forall a. ToJSON a => a -> Value
toJSON (ThreadMember -> Value) -> Maybe ThreadMember -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ThreadMember
channelThreadMember)
              ] ]
  toJSON ChannelPublicThread{Maybe Integer
Maybe Text
Maybe ParentId
Maybe MessageId
Maybe ThreadMember
Maybe ThreadMetadata
GuildId
ChannelId
channelThreadMember :: Maybe ThreadMember
channelThreadMetadata :: Maybe ThreadMetadata
channelParentId :: Maybe ParentId
channelLastMessage :: Maybe MessageId
channelUserRateLimitThread :: Maybe Integer
channelThreadName :: Maybe Text
channelGuild :: GuildId
channelId :: ChannelId
channelThreadMember :: Channel -> Maybe ThreadMember
channelThreadMetadata :: Channel -> Maybe ThreadMetadata
channelUserRateLimitThread :: Channel -> Maybe Integer
channelThreadName :: Channel -> Maybe Text
channelParentId :: Channel -> Maybe ParentId
channelLastMessage :: Channel -> Maybe MessageId
channelGuild :: Channel -> GuildId
channelId :: Channel -> ChannelId
..} = [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"type", Value -> Maybe Value
forall a. a -> Maybe a
Just (Scientific -> Value
Number Scientific
11))
              , (Text
"id",     ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelId)
              , (Text
"guild_id", GuildId -> Value
forall a. ToJSON a => a -> Value
toJSON (GuildId -> Value) -> Maybe GuildId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GuildId -> Maybe GuildId
forall (f :: * -> *) a. Applicative f => a -> f a
pure GuildId
channelGuild)
              , (Text
"name",  Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Text
channelThreadName)
              , (Text
"rate_limit_per_user", Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Integer
channelUserRateLimitThread)
              , (Text
"last_message_id",  MessageId -> Value
forall a. ToJSON a => a -> Value
toJSON (MessageId -> Value) -> Maybe MessageId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe MessageId
channelLastMessage)
              , (Text
"parent_id",  Maybe ParentId -> Value
forall a. ToJSON a => a -> Value
toJSON (Maybe ParentId -> Value) -> Maybe (Maybe ParentId) -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ParentId -> Maybe (Maybe ParentId)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe ParentId
channelParentId)
              , (Text
"thread_metadata", ThreadMetadata -> Value
forall a. ToJSON a => a -> Value
toJSON (ThreadMetadata -> Value) -> Maybe ThreadMetadata -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ThreadMetadata
channelThreadMetadata)
              , (Text
"member", ThreadMember -> Value
forall a. ToJSON a => a -> Value
toJSON (ThreadMember -> Value) -> Maybe ThreadMember -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ThreadMember
channelThreadMember)
              ] ]
  toJSON ChannelPrivateThread{Maybe Integer
Maybe Text
Maybe ParentId
Maybe MessageId
Maybe ThreadMember
Maybe ThreadMetadata
GuildId
ChannelId
channelThreadMember :: Maybe ThreadMember
channelThreadMetadata :: Maybe ThreadMetadata
channelParentId :: Maybe ParentId
channelLastMessage :: Maybe MessageId
channelUserRateLimitThread :: Maybe Integer
channelThreadName :: Maybe Text
channelGuild :: GuildId
channelId :: ChannelId
channelThreadMember :: Channel -> Maybe ThreadMember
channelThreadMetadata :: Channel -> Maybe ThreadMetadata
channelUserRateLimitThread :: Channel -> Maybe Integer
channelThreadName :: Channel -> Maybe Text
channelParentId :: Channel -> Maybe ParentId
channelLastMessage :: Channel -> Maybe MessageId
channelGuild :: Channel -> GuildId
channelId :: Channel -> ChannelId
..} = [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"type", Value -> Maybe Value
forall a. a -> Maybe a
Just (Scientific -> Value
Number Scientific
12))
              , (Text
"id",     ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelId)
              , (Text
"guild_id", GuildId -> Value
forall a. ToJSON a => a -> Value
toJSON (GuildId -> Value) -> Maybe GuildId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GuildId -> Maybe GuildId
forall (f :: * -> *) a. Applicative f => a -> f a
pure GuildId
channelGuild)
              , (Text
"name",  Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Text
channelThreadName)
              , (Text
"rate_limit_per_user", Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Integer
channelUserRateLimitThread)
              , (Text
"last_message_id",  MessageId -> Value
forall a. ToJSON a => a -> Value
toJSON (MessageId -> Value) -> Maybe MessageId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe MessageId
channelLastMessage)
              , (Text
"parent_id",  Maybe ParentId -> Value
forall a. ToJSON a => a -> Value
toJSON (Maybe ParentId -> Value) -> Maybe (Maybe ParentId) -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ParentId -> Maybe (Maybe ParentId)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe ParentId
channelParentId)
              , (Text
"thread_metadata", ThreadMetadata -> Value
forall a. ToJSON a => a -> Value
toJSON (ThreadMetadata -> Value) -> Maybe ThreadMetadata -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ThreadMetadata
channelThreadMetadata)
              , (Text
"member", ThreadMember -> Value
forall a. ToJSON a => a -> Value
toJSON (ThreadMember -> Value) -> Maybe ThreadMember -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ThreadMember
channelThreadMember)
              ] ]
  toJSON ChannelUnknownType{Text
ChannelId
channelJSON :: Text
channelId :: ChannelId
channelJSON :: Channel -> Text
channelId :: Channel -> ChannelId
..} = [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"id",     ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelId)
              , (Text
"json", Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
channelJSON)
              ] ]

-- | If the channel is part of a guild (has a guild id field)
channelIsInGuild :: Channel -> Bool
channelIsInGuild :: Channel -> Bool
channelIsInGuild Channel
c = case Channel
c of
        ChannelGuildCategory{} -> Bool
True
        ChannelText{} -> Bool
True
        ChannelVoice{} -> Bool
True
        ChannelNews{} -> Bool
True
        ChannelStorePage{} -> Bool
True
        ChannelNewsThread{} -> Bool
True
        ChannelPublicThread{} -> Bool
True
        ChannelPrivateThread{} -> Bool
True
        Channel
_ -> Bool
False

-- | Permission overwrites for a channel.
data Overwrite = Overwrite
  { Overwrite -> Either RoleId UserId
overwriteId    :: Either RoleId UserId -- ^ 'Role' or 'User' id
  , Overwrite -> Text
overwriteAllow :: T.Text               -- ^ Allowed permission bit set
  , Overwrite -> Text
overwriteDeny  :: T.Text               -- ^ Denied permission bit set
  } deriving (Int -> Overwrite -> ShowS
[Overwrite] -> ShowS
Overwrite -> String
(Int -> Overwrite -> ShowS)
-> (Overwrite -> String)
-> ([Overwrite] -> ShowS)
-> Show Overwrite
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Overwrite] -> ShowS
$cshowList :: [Overwrite] -> ShowS
show :: Overwrite -> String
$cshow :: Overwrite -> String
showsPrec :: Int -> Overwrite -> ShowS
$cshowsPrec :: Int -> Overwrite -> ShowS
Show, ReadPrec [Overwrite]
ReadPrec Overwrite
Int -> ReadS Overwrite
ReadS [Overwrite]
(Int -> ReadS Overwrite)
-> ReadS [Overwrite]
-> ReadPrec Overwrite
-> ReadPrec [Overwrite]
-> Read Overwrite
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Overwrite]
$creadListPrec :: ReadPrec [Overwrite]
readPrec :: ReadPrec Overwrite
$creadPrec :: ReadPrec Overwrite
readList :: ReadS [Overwrite]
$creadList :: ReadS [Overwrite]
readsPrec :: Int -> ReadS Overwrite
$creadsPrec :: Int -> ReadS Overwrite
Read, Overwrite -> Overwrite -> Bool
(Overwrite -> Overwrite -> Bool)
-> (Overwrite -> Overwrite -> Bool) -> Eq Overwrite
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Overwrite -> Overwrite -> Bool
$c/= :: Overwrite -> Overwrite -> Bool
== :: Overwrite -> Overwrite -> Bool
$c== :: Overwrite -> Overwrite -> Bool
Eq, Eq Overwrite
Eq Overwrite
-> (Overwrite -> Overwrite -> Ordering)
-> (Overwrite -> Overwrite -> Bool)
-> (Overwrite -> Overwrite -> Bool)
-> (Overwrite -> Overwrite -> Bool)
-> (Overwrite -> Overwrite -> Bool)
-> (Overwrite -> Overwrite -> Overwrite)
-> (Overwrite -> Overwrite -> Overwrite)
-> Ord Overwrite
Overwrite -> Overwrite -> Bool
Overwrite -> Overwrite -> Ordering
Overwrite -> Overwrite -> Overwrite
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Overwrite -> Overwrite -> Overwrite
$cmin :: Overwrite -> Overwrite -> Overwrite
max :: Overwrite -> Overwrite -> Overwrite
$cmax :: Overwrite -> Overwrite -> Overwrite
>= :: Overwrite -> Overwrite -> Bool
$c>= :: Overwrite -> Overwrite -> Bool
> :: Overwrite -> Overwrite -> Bool
$c> :: Overwrite -> Overwrite -> Bool
<= :: Overwrite -> Overwrite -> Bool
$c<= :: Overwrite -> Overwrite -> Bool
< :: Overwrite -> Overwrite -> Bool
$c< :: Overwrite -> Overwrite -> Bool
compare :: Overwrite -> Overwrite -> Ordering
$ccompare :: Overwrite -> Overwrite -> Ordering
$cp1Ord :: Eq Overwrite
Ord)

instance FromJSON Overwrite where
  parseJSON :: Value -> Parser Overwrite
parseJSON = String -> (Object -> Parser Overwrite) -> Value -> Parser Overwrite
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"Overwrite" ((Object -> Parser Overwrite) -> Value -> Parser Overwrite)
-> (Object -> Parser Overwrite) -> Value -> Parser Overwrite
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
    Int
t <- Object
o Object -> Text -> Parser Int
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"type"
    Either RoleId UserId
i <- case (Int
t :: Int) of
      Int
0 -> RoleId -> Either RoleId UserId
forall a b. a -> Either a b
Left (RoleId -> Either RoleId UserId)
-> Parser RoleId -> Parser (Either RoleId UserId)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser RoleId
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"id"
      Int
1 -> UserId -> Either RoleId UserId
forall a b. b -> Either a b
Right (UserId -> Either RoleId UserId)
-> Parser UserId -> Parser (Either RoleId UserId)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser UserId
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"id"
      Int
_ -> String -> Parser (Either RoleId UserId)
forall a. HasCallStack => String -> a
error String
"Type field can only be 0 (role id) or 1 (user id)"
    Either RoleId UserId -> Text -> Text -> Overwrite
Overwrite Either RoleId UserId
i
              (Text -> Text -> Overwrite)
-> Parser Text -> Parser (Text -> Overwrite)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"allow"
              Parser (Text -> Overwrite) -> Parser Text -> Parser Overwrite
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"deny"

instance ToJSON Overwrite where
  toJSON :: Overwrite -> Value
toJSON Overwrite{Either RoleId UserId
Text
overwriteDeny :: Text
overwriteAllow :: Text
overwriteId :: Either RoleId UserId
overwriteDeny :: Overwrite -> Text
overwriteAllow :: Overwrite -> Text
overwriteId :: Overwrite -> Either RoleId UserId
..} = [Pair] -> Value
object
              [ (Text
"id",     Snowflake -> Value
forall a. ToJSON a => a -> Value
toJSON (Snowflake -> Value) -> Snowflake -> Value
forall a b. (a -> b) -> a -> b
$ (RoleId -> Snowflake)
-> (UserId -> Snowflake) -> Either RoleId UserId -> Snowflake
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either RoleId -> Snowflake
forall a. DiscordId a -> Snowflake
unId UserId -> Snowflake
forall a. DiscordId a -> Snowflake
unId Either RoleId UserId
overwriteId)
              , (Text
"type",   Int -> Value
forall a. ToJSON a => a -> Value
toJSON (Int -> Value) -> Int -> Value
forall a b. (a -> b) -> a -> b
$ ((RoleId -> Int) -> (UserId -> Int) -> Either RoleId UserId -> Int
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Int -> RoleId -> Int
forall a b. a -> b -> a
const Int
0) (Int -> UserId -> Int
forall a b. a -> b -> a
const Int
1) Either RoleId UserId
overwriteId :: Int))
              , (Text
"allow",  Text -> Value
forall a. ToJSON a => a -> Value
toJSON Text
overwriteAllow)
              , (Text
"deny",   Text -> Value
forall a. ToJSON a => a -> Value
toJSON Text
overwriteDeny)
              ]

-- | Metadata for threads.
data ThreadMetadata = ThreadMetadata
 { ThreadMetadata -> Bool
threadMetadataArchived :: Bool -- ^ Is the thread archived?
 , ThreadMetadata -> Integer
threadMetadataAutoArchive :: Integer -- ^ How long after activity should the thread auto archive
 , ThreadMetadata -> UTCTime
threadMetadataArchiveTime :: UTCTime -- ^ When was the last time the archive status changed?
 , ThreadMetadata -> Bool
threadMetadataLocked :: Bool -- ^ Is the thread locked? (only MANAGE_THREADS users can unarchive)
 , ThreadMetadata -> Maybe Bool
threadMetadataInvitable :: Maybe Bool -- ^ Can non-mods add other non-mods? (private threads only)
 , ThreadMetadata -> Maybe UTCTime
threadMetadataCreateTime :: Maybe UTCTime -- ^ When was the thread created?
 } deriving (Int -> ThreadMetadata -> ShowS
[ThreadMetadata] -> ShowS
ThreadMetadata -> String
(Int -> ThreadMetadata -> ShowS)
-> (ThreadMetadata -> String)
-> ([ThreadMetadata] -> ShowS)
-> Show ThreadMetadata
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ThreadMetadata] -> ShowS
$cshowList :: [ThreadMetadata] -> ShowS
show :: ThreadMetadata -> String
$cshow :: ThreadMetadata -> String
showsPrec :: Int -> ThreadMetadata -> ShowS
$cshowsPrec :: Int -> ThreadMetadata -> ShowS
Show, ReadPrec [ThreadMetadata]
ReadPrec ThreadMetadata
Int -> ReadS ThreadMetadata
ReadS [ThreadMetadata]
(Int -> ReadS ThreadMetadata)
-> ReadS [ThreadMetadata]
-> ReadPrec ThreadMetadata
-> ReadPrec [ThreadMetadata]
-> Read ThreadMetadata
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ThreadMetadata]
$creadListPrec :: ReadPrec [ThreadMetadata]
readPrec :: ReadPrec ThreadMetadata
$creadPrec :: ReadPrec ThreadMetadata
readList :: ReadS [ThreadMetadata]
$creadList :: ReadS [ThreadMetadata]
readsPrec :: Int -> ReadS ThreadMetadata
$creadsPrec :: Int -> ReadS ThreadMetadata
Read, ThreadMetadata -> ThreadMetadata -> Bool
(ThreadMetadata -> ThreadMetadata -> Bool)
-> (ThreadMetadata -> ThreadMetadata -> Bool) -> Eq ThreadMetadata
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ThreadMetadata -> ThreadMetadata -> Bool
$c/= :: ThreadMetadata -> ThreadMetadata -> Bool
== :: ThreadMetadata -> ThreadMetadata -> Bool
$c== :: ThreadMetadata -> ThreadMetadata -> Bool
Eq, Eq ThreadMetadata
Eq ThreadMetadata
-> (ThreadMetadata -> ThreadMetadata -> Ordering)
-> (ThreadMetadata -> ThreadMetadata -> Bool)
-> (ThreadMetadata -> ThreadMetadata -> Bool)
-> (ThreadMetadata -> ThreadMetadata -> Bool)
-> (ThreadMetadata -> ThreadMetadata -> Bool)
-> (ThreadMetadata -> ThreadMetadata -> ThreadMetadata)
-> (ThreadMetadata -> ThreadMetadata -> ThreadMetadata)
-> Ord ThreadMetadata
ThreadMetadata -> ThreadMetadata -> Bool
ThreadMetadata -> ThreadMetadata -> Ordering
ThreadMetadata -> ThreadMetadata -> ThreadMetadata
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ThreadMetadata -> ThreadMetadata -> ThreadMetadata
$cmin :: ThreadMetadata -> ThreadMetadata -> ThreadMetadata
max :: ThreadMetadata -> ThreadMetadata -> ThreadMetadata
$cmax :: ThreadMetadata -> ThreadMetadata -> ThreadMetadata
>= :: ThreadMetadata -> ThreadMetadata -> Bool
$c>= :: ThreadMetadata -> ThreadMetadata -> Bool
> :: ThreadMetadata -> ThreadMetadata -> Bool
$c> :: ThreadMetadata -> ThreadMetadata -> Bool
<= :: ThreadMetadata -> ThreadMetadata -> Bool
$c<= :: ThreadMetadata -> ThreadMetadata -> Bool
< :: ThreadMetadata -> ThreadMetadata -> Bool
$c< :: ThreadMetadata -> ThreadMetadata -> Bool
compare :: ThreadMetadata -> ThreadMetadata -> Ordering
$ccompare :: ThreadMetadata -> ThreadMetadata -> Ordering
$cp1Ord :: Eq ThreadMetadata
Ord)

instance FromJSON ThreadMetadata where
  parseJSON :: Value -> Parser ThreadMetadata
parseJSON = String
-> (Object -> Parser ThreadMetadata)
-> Value
-> Parser ThreadMetadata
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"ThreadMetadata" ((Object -> Parser ThreadMetadata)
 -> Value -> Parser ThreadMetadata)
-> (Object -> Parser ThreadMetadata)
-> Value
-> Parser ThreadMetadata
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    Bool
-> Integer
-> UTCTime
-> Bool
-> Maybe Bool
-> Maybe UTCTime
-> ThreadMetadata
ThreadMetadata (Bool
 -> Integer
 -> UTCTime
 -> Bool
 -> Maybe Bool
 -> Maybe UTCTime
 -> ThreadMetadata)
-> Parser Bool
-> Parser
     (Integer
      -> UTCTime
      -> Bool
      -> Maybe Bool
      -> Maybe UTCTime
      -> ThreadMetadata)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser Bool
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"archived"
                   Parser
  (Integer
   -> UTCTime
   -> Bool
   -> Maybe Bool
   -> Maybe UTCTime
   -> ThreadMetadata)
-> Parser Integer
-> Parser
     (UTCTime -> Bool -> Maybe Bool -> Maybe UTCTime -> ThreadMetadata)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"auto_archive_duration"
                   Parser
  (UTCTime -> Bool -> Maybe Bool -> Maybe UTCTime -> ThreadMetadata)
-> Parser UTCTime
-> Parser (Bool -> Maybe Bool -> Maybe UTCTime -> ThreadMetadata)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser UTCTime
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"archive_timestamp"
                   Parser (Bool -> Maybe Bool -> Maybe UTCTime -> ThreadMetadata)
-> Parser Bool
-> Parser (Maybe Bool -> Maybe UTCTime -> ThreadMetadata)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Bool
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"locked"
                   Parser (Maybe Bool -> Maybe UTCTime -> ThreadMetadata)
-> Parser (Maybe Bool) -> Parser (Maybe UTCTime -> ThreadMetadata)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"invitable"
                   Parser (Maybe UTCTime -> ThreadMetadata)
-> Parser (Maybe UTCTime) -> Parser ThreadMetadata
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe UTCTime)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"create_timestamp"

instance ToJSON ThreadMetadata where
  toJSON :: ThreadMetadata -> Value
toJSON ThreadMetadata{Bool
Integer
Maybe Bool
Maybe UTCTime
UTCTime
threadMetadataCreateTime :: Maybe UTCTime
threadMetadataInvitable :: Maybe Bool
threadMetadataLocked :: Bool
threadMetadataArchiveTime :: UTCTime
threadMetadataAutoArchive :: Integer
threadMetadataArchived :: Bool
threadMetadataCreateTime :: ThreadMetadata -> Maybe UTCTime
threadMetadataInvitable :: ThreadMetadata -> Maybe Bool
threadMetadataLocked :: ThreadMetadata -> Bool
threadMetadataArchiveTime :: ThreadMetadata -> UTCTime
threadMetadataAutoArchive :: ThreadMetadata -> Integer
threadMetadataArchived :: ThreadMetadata -> Bool
..} =  [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"archived", Bool -> Value
forall a. ToJSON a => a -> Value
toJSON (Bool -> Value) -> Maybe Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> Maybe Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
threadMetadataArchived)
              , (Text
"auto_archive_duration", Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Integer -> Maybe Integer
forall (f :: * -> *) a. Applicative f => a -> f a
pure Integer
threadMetadataAutoArchive)
              , (Text
"archive_timestamp", UTCTime -> Value
forall a. ToJSON a => a -> Value
toJSON (UTCTime -> Value) -> Maybe UTCTime -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> UTCTime -> Maybe UTCTime
forall (f :: * -> *) a. Applicative f => a -> f a
pure UTCTime
threadMetadataArchiveTime)
              , (Text
"locked", Bool -> Value
forall a. ToJSON a => a -> Value
toJSON (Bool -> Value) -> Maybe Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> Maybe Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
threadMetadataLocked)
              , (Text
"invitable", Bool -> Value
forall a. ToJSON a => a -> Value
toJSON (Bool -> Value) -> Maybe Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Bool
threadMetadataInvitable)
              , (Text
"create_timestamp", Maybe UTCTime -> Value
forall a. ToJSON a => a -> Value
toJSON (Maybe UTCTime -> Value) -> Maybe (Maybe UTCTime) -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe UTCTime -> Maybe (Maybe UTCTime)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe UTCTime
threadMetadataCreateTime)
              ] ]

-- | A user in a thread
data ThreadMember = ThreadMember
 { ThreadMember -> Maybe ChannelId
threadMemberThreadId :: Maybe ChannelId -- ^ id of the thread
 , ThreadMember -> Maybe UserId
threadMemberUserId   :: Maybe UserId    -- ^ id of the user
 , ThreadMember -> UTCTime
threadMemberJoinTime :: UTCTime         -- ^ time the current user last joined the thread
 , ThreadMember -> Integer
threadMemberFlags    :: Integer         -- ^ user-thread settings
 } deriving (Int -> ThreadMember -> ShowS
[ThreadMember] -> ShowS
ThreadMember -> String
(Int -> ThreadMember -> ShowS)
-> (ThreadMember -> String)
-> ([ThreadMember] -> ShowS)
-> Show ThreadMember
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ThreadMember] -> ShowS
$cshowList :: [ThreadMember] -> ShowS
show :: ThreadMember -> String
$cshow :: ThreadMember -> String
showsPrec :: Int -> ThreadMember -> ShowS
$cshowsPrec :: Int -> ThreadMember -> ShowS
Show, ReadPrec [ThreadMember]
ReadPrec ThreadMember
Int -> ReadS ThreadMember
ReadS [ThreadMember]
(Int -> ReadS ThreadMember)
-> ReadS [ThreadMember]
-> ReadPrec ThreadMember
-> ReadPrec [ThreadMember]
-> Read ThreadMember
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ThreadMember]
$creadListPrec :: ReadPrec [ThreadMember]
readPrec :: ReadPrec ThreadMember
$creadPrec :: ReadPrec ThreadMember
readList :: ReadS [ThreadMember]
$creadList :: ReadS [ThreadMember]
readsPrec :: Int -> ReadS ThreadMember
$creadsPrec :: Int -> ReadS ThreadMember
Read, ThreadMember -> ThreadMember -> Bool
(ThreadMember -> ThreadMember -> Bool)
-> (ThreadMember -> ThreadMember -> Bool) -> Eq ThreadMember
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ThreadMember -> ThreadMember -> Bool
$c/= :: ThreadMember -> ThreadMember -> Bool
== :: ThreadMember -> ThreadMember -> Bool
$c== :: ThreadMember -> ThreadMember -> Bool
Eq, Eq ThreadMember
Eq ThreadMember
-> (ThreadMember -> ThreadMember -> Ordering)
-> (ThreadMember -> ThreadMember -> Bool)
-> (ThreadMember -> ThreadMember -> Bool)
-> (ThreadMember -> ThreadMember -> Bool)
-> (ThreadMember -> ThreadMember -> Bool)
-> (ThreadMember -> ThreadMember -> ThreadMember)
-> (ThreadMember -> ThreadMember -> ThreadMember)
-> Ord ThreadMember
ThreadMember -> ThreadMember -> Bool
ThreadMember -> ThreadMember -> Ordering
ThreadMember -> ThreadMember -> ThreadMember
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ThreadMember -> ThreadMember -> ThreadMember
$cmin :: ThreadMember -> ThreadMember -> ThreadMember
max :: ThreadMember -> ThreadMember -> ThreadMember
$cmax :: ThreadMember -> ThreadMember -> ThreadMember
>= :: ThreadMember -> ThreadMember -> Bool
$c>= :: ThreadMember -> ThreadMember -> Bool
> :: ThreadMember -> ThreadMember -> Bool
$c> :: ThreadMember -> ThreadMember -> Bool
<= :: ThreadMember -> ThreadMember -> Bool
$c<= :: ThreadMember -> ThreadMember -> Bool
< :: ThreadMember -> ThreadMember -> Bool
$c< :: ThreadMember -> ThreadMember -> Bool
compare :: ThreadMember -> ThreadMember -> Ordering
$ccompare :: ThreadMember -> ThreadMember -> Ordering
$cp1Ord :: Eq ThreadMember
Ord)

instance FromJSON ThreadMember where
  parseJSON :: Value -> Parser ThreadMember
parseJSON = String
-> (Object -> Parser ThreadMember) -> Value -> Parser ThreadMember
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"ThreadMember" ((Object -> Parser ThreadMember) -> Value -> Parser ThreadMember)
-> (Object -> Parser ThreadMember) -> Value -> Parser ThreadMember
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    Maybe ChannelId
-> Maybe UserId -> UTCTime -> Integer -> ThreadMember
ThreadMember (Maybe ChannelId
 -> Maybe UserId -> UTCTime -> Integer -> ThreadMember)
-> Parser (Maybe ChannelId)
-> Parser (Maybe UserId -> UTCTime -> Integer -> ThreadMember)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser (Maybe ChannelId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"id"
                 Parser (Maybe UserId -> UTCTime -> Integer -> ThreadMember)
-> Parser (Maybe UserId)
-> Parser (UTCTime -> Integer -> ThreadMember)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe UserId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"user_id"
                 Parser (UTCTime -> Integer -> ThreadMember)
-> Parser UTCTime -> Parser (Integer -> ThreadMember)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser UTCTime
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"join_timestamp"
                 Parser (Integer -> ThreadMember)
-> Parser Integer -> Parser ThreadMember
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"flags"

instance ToJSON ThreadMember where
  toJSON :: ThreadMember -> Value
toJSON ThreadMember{Integer
Maybe UserId
Maybe ChannelId
UTCTime
threadMemberFlags :: Integer
threadMemberJoinTime :: UTCTime
threadMemberUserId :: Maybe UserId
threadMemberThreadId :: Maybe ChannelId
threadMemberFlags :: ThreadMember -> Integer
threadMemberJoinTime :: ThreadMember -> UTCTime
threadMemberUserId :: ThreadMember -> Maybe UserId
threadMemberThreadId :: ThreadMember -> Maybe ChannelId
..} =  [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"id", ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ChannelId
threadMemberThreadId)
              , (Text
"user_id", UserId -> Value
forall a. ToJSON a => a -> Value
toJSON (UserId -> Value) -> Maybe UserId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe UserId
threadMemberUserId)
              , (Text
"join_timestamp", UTCTime -> Value
forall a. ToJSON a => a -> Value
toJSON (UTCTime -> Value) -> Maybe UTCTime -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> UTCTime -> Maybe UTCTime
forall (f :: * -> *) a. Applicative f => a -> f a
pure UTCTime
threadMemberJoinTime)
              , (Text
"flags", Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Integer -> Maybe Integer
forall (f :: * -> *) a. Applicative f => a -> f a
pure Integer
threadMemberFlags)
              ] ]


data ThreadListSyncFields = ThreadListSyncFields
  { ThreadListSyncFields -> GuildId
threadListSyncFieldsGuildId :: GuildId
  , ThreadListSyncFields -> Maybe [ChannelId]
threadListSyncFieldsChannelIds :: Maybe [ChannelId]
  , ThreadListSyncFields -> [Channel]
threadListSyncFieldsThreads :: [Channel]
  , ThreadListSyncFields -> [ThreadMember]
threadListSyncFieldsThreadMembers :: [ThreadMember]
  } deriving (Int -> ThreadListSyncFields -> ShowS
[ThreadListSyncFields] -> ShowS
ThreadListSyncFields -> String
(Int -> ThreadListSyncFields -> ShowS)
-> (ThreadListSyncFields -> String)
-> ([ThreadListSyncFields] -> ShowS)
-> Show ThreadListSyncFields
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ThreadListSyncFields] -> ShowS
$cshowList :: [ThreadListSyncFields] -> ShowS
show :: ThreadListSyncFields -> String
$cshow :: ThreadListSyncFields -> String
showsPrec :: Int -> ThreadListSyncFields -> ShowS
$cshowsPrec :: Int -> ThreadListSyncFields -> ShowS
Show, ReadPrec [ThreadListSyncFields]
ReadPrec ThreadListSyncFields
Int -> ReadS ThreadListSyncFields
ReadS [ThreadListSyncFields]
(Int -> ReadS ThreadListSyncFields)
-> ReadS [ThreadListSyncFields]
-> ReadPrec ThreadListSyncFields
-> ReadPrec [ThreadListSyncFields]
-> Read ThreadListSyncFields
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ThreadListSyncFields]
$creadListPrec :: ReadPrec [ThreadListSyncFields]
readPrec :: ReadPrec ThreadListSyncFields
$creadPrec :: ReadPrec ThreadListSyncFields
readList :: ReadS [ThreadListSyncFields]
$creadList :: ReadS [ThreadListSyncFields]
readsPrec :: Int -> ReadS ThreadListSyncFields
$creadsPrec :: Int -> ReadS ThreadListSyncFields
Read, ThreadListSyncFields -> ThreadListSyncFields -> Bool
(ThreadListSyncFields -> ThreadListSyncFields -> Bool)
-> (ThreadListSyncFields -> ThreadListSyncFields -> Bool)
-> Eq ThreadListSyncFields
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ThreadListSyncFields -> ThreadListSyncFields -> Bool
$c/= :: ThreadListSyncFields -> ThreadListSyncFields -> Bool
== :: ThreadListSyncFields -> ThreadListSyncFields -> Bool
$c== :: ThreadListSyncFields -> ThreadListSyncFields -> Bool
Eq, Eq ThreadListSyncFields
Eq ThreadListSyncFields
-> (ThreadListSyncFields -> ThreadListSyncFields -> Ordering)
-> (ThreadListSyncFields -> ThreadListSyncFields -> Bool)
-> (ThreadListSyncFields -> ThreadListSyncFields -> Bool)
-> (ThreadListSyncFields -> ThreadListSyncFields -> Bool)
-> (ThreadListSyncFields -> ThreadListSyncFields -> Bool)
-> (ThreadListSyncFields
    -> ThreadListSyncFields -> ThreadListSyncFields)
-> (ThreadListSyncFields
    -> ThreadListSyncFields -> ThreadListSyncFields)
-> Ord ThreadListSyncFields
ThreadListSyncFields -> ThreadListSyncFields -> Bool
ThreadListSyncFields -> ThreadListSyncFields -> Ordering
ThreadListSyncFields
-> ThreadListSyncFields -> ThreadListSyncFields
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ThreadListSyncFields
-> ThreadListSyncFields -> ThreadListSyncFields
$cmin :: ThreadListSyncFields
-> ThreadListSyncFields -> ThreadListSyncFields
max :: ThreadListSyncFields
-> ThreadListSyncFields -> ThreadListSyncFields
$cmax :: ThreadListSyncFields
-> ThreadListSyncFields -> ThreadListSyncFields
>= :: ThreadListSyncFields -> ThreadListSyncFields -> Bool
$c>= :: ThreadListSyncFields -> ThreadListSyncFields -> Bool
> :: ThreadListSyncFields -> ThreadListSyncFields -> Bool
$c> :: ThreadListSyncFields -> ThreadListSyncFields -> Bool
<= :: ThreadListSyncFields -> ThreadListSyncFields -> Bool
$c<= :: ThreadListSyncFields -> ThreadListSyncFields -> Bool
< :: ThreadListSyncFields -> ThreadListSyncFields -> Bool
$c< :: ThreadListSyncFields -> ThreadListSyncFields -> Bool
compare :: ThreadListSyncFields -> ThreadListSyncFields -> Ordering
$ccompare :: ThreadListSyncFields -> ThreadListSyncFields -> Ordering
$cp1Ord :: Eq ThreadListSyncFields
Ord)

instance FromJSON ThreadListSyncFields where
  parseJSON :: Value -> Parser ThreadListSyncFields
parseJSON = String
-> (Object -> Parser ThreadListSyncFields)
-> Value
-> Parser ThreadListSyncFields
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"ThreadListSyncFields" ((Object -> Parser ThreadListSyncFields)
 -> Value -> Parser ThreadListSyncFields)
-> (Object -> Parser ThreadListSyncFields)
-> Value
-> Parser ThreadListSyncFields
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    GuildId
-> Maybe [ChannelId]
-> [Channel]
-> [ThreadMember]
-> ThreadListSyncFields
ThreadListSyncFields (GuildId
 -> Maybe [ChannelId]
 -> [Channel]
 -> [ThreadMember]
 -> ThreadListSyncFields)
-> Parser GuildId
-> Parser
     (Maybe [ChannelId]
      -> [Channel] -> [ThreadMember] -> ThreadListSyncFields)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser GuildId
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"guild_id"
                         Parser
  (Maybe [ChannelId]
   -> [Channel] -> [ThreadMember] -> ThreadListSyncFields)
-> Parser (Maybe [ChannelId])
-> Parser ([Channel] -> [ThreadMember] -> ThreadListSyncFields)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe [ChannelId])
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"channel_ids"
                         Parser ([Channel] -> [ThreadMember] -> ThreadListSyncFields)
-> Parser [Channel]
-> Parser ([ThreadMember] -> ThreadListSyncFields)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser [Channel]
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"threads"
                         Parser ([ThreadMember] -> ThreadListSyncFields)
-> Parser [ThreadMember] -> Parser ThreadListSyncFields
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser [ThreadMember]
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"members"

data ThreadMembersUpdateFields = ThreadMembersUpdateFields
  { ThreadMembersUpdateFields -> ChannelId
threadMembersUpdateFieldsThreadId :: ChannelId
  , ThreadMembersUpdateFields -> GuildId
threadMembersUpdateFieldsGuildId :: GuildId
  , ThreadMembersUpdateFields -> Integer
threadMembersUpdateFieldsMemberCount :: Integer
  , ThreadMembersUpdateFields -> Maybe [ThreadMember]
threadMembersUpdateFieldsAddedMembers :: Maybe [ThreadMember]
  , ThreadMembersUpdateFields -> Maybe [UserId]
threadMembersUpdateFieldsRemovedMembers :: Maybe [UserId]
  } deriving (Int -> ThreadMembersUpdateFields -> ShowS
[ThreadMembersUpdateFields] -> ShowS
ThreadMembersUpdateFields -> String
(Int -> ThreadMembersUpdateFields -> ShowS)
-> (ThreadMembersUpdateFields -> String)
-> ([ThreadMembersUpdateFields] -> ShowS)
-> Show ThreadMembersUpdateFields
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ThreadMembersUpdateFields] -> ShowS
$cshowList :: [ThreadMembersUpdateFields] -> ShowS
show :: ThreadMembersUpdateFields -> String
$cshow :: ThreadMembersUpdateFields -> String
showsPrec :: Int -> ThreadMembersUpdateFields -> ShowS
$cshowsPrec :: Int -> ThreadMembersUpdateFields -> ShowS
Show, ReadPrec [ThreadMembersUpdateFields]
ReadPrec ThreadMembersUpdateFields
Int -> ReadS ThreadMembersUpdateFields
ReadS [ThreadMembersUpdateFields]
(Int -> ReadS ThreadMembersUpdateFields)
-> ReadS [ThreadMembersUpdateFields]
-> ReadPrec ThreadMembersUpdateFields
-> ReadPrec [ThreadMembersUpdateFields]
-> Read ThreadMembersUpdateFields
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ThreadMembersUpdateFields]
$creadListPrec :: ReadPrec [ThreadMembersUpdateFields]
readPrec :: ReadPrec ThreadMembersUpdateFields
$creadPrec :: ReadPrec ThreadMembersUpdateFields
readList :: ReadS [ThreadMembersUpdateFields]
$creadList :: ReadS [ThreadMembersUpdateFields]
readsPrec :: Int -> ReadS ThreadMembersUpdateFields
$creadsPrec :: Int -> ReadS ThreadMembersUpdateFields
Read, ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
(ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool)
-> (ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool)
-> Eq ThreadMembersUpdateFields
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
$c/= :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
== :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
$c== :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
Eq, Eq ThreadMembersUpdateFields
Eq ThreadMembersUpdateFields
-> (ThreadMembersUpdateFields
    -> ThreadMembersUpdateFields -> Ordering)
-> (ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool)
-> (ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool)
-> (ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool)
-> (ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool)
-> (ThreadMembersUpdateFields
    -> ThreadMembersUpdateFields -> ThreadMembersUpdateFields)
-> (ThreadMembersUpdateFields
    -> ThreadMembersUpdateFields -> ThreadMembersUpdateFields)
-> Ord ThreadMembersUpdateFields
ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Ordering
ThreadMembersUpdateFields
-> ThreadMembersUpdateFields -> ThreadMembersUpdateFields
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ThreadMembersUpdateFields
-> ThreadMembersUpdateFields -> ThreadMembersUpdateFields
$cmin :: ThreadMembersUpdateFields
-> ThreadMembersUpdateFields -> ThreadMembersUpdateFields
max :: ThreadMembersUpdateFields
-> ThreadMembersUpdateFields -> ThreadMembersUpdateFields
$cmax :: ThreadMembersUpdateFields
-> ThreadMembersUpdateFields -> ThreadMembersUpdateFields
>= :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
$c>= :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
> :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
$c> :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
<= :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
$c<= :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
< :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
$c< :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
compare :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Ordering
$ccompare :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Ordering
$cp1Ord :: Eq ThreadMembersUpdateFields
Ord)

instance FromJSON ThreadMembersUpdateFields where
  parseJSON :: Value -> Parser ThreadMembersUpdateFields
parseJSON = String
-> (Object -> Parser ThreadMembersUpdateFields)
-> Value
-> Parser ThreadMembersUpdateFields
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"ThreadMembersUpdateFields" ((Object -> Parser ThreadMembersUpdateFields)
 -> Value -> Parser ThreadMembersUpdateFields)
-> (Object -> Parser ThreadMembersUpdateFields)
-> Value
-> Parser ThreadMembersUpdateFields
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    ChannelId
-> GuildId
-> Integer
-> Maybe [ThreadMember]
-> Maybe [UserId]
-> ThreadMembersUpdateFields
ThreadMembersUpdateFields (ChannelId
 -> GuildId
 -> Integer
 -> Maybe [ThreadMember]
 -> Maybe [UserId]
 -> ThreadMembersUpdateFields)
-> Parser ChannelId
-> Parser
     (GuildId
      -> Integer
      -> Maybe [ThreadMember]
      -> Maybe [UserId]
      -> ThreadMembersUpdateFields)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"id"
                              Parser
  (GuildId
   -> Integer
   -> Maybe [ThreadMember]
   -> Maybe [UserId]
   -> ThreadMembersUpdateFields)
-> Parser GuildId
-> Parser
     (Integer
      -> Maybe [ThreadMember]
      -> Maybe [UserId]
      -> ThreadMembersUpdateFields)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser GuildId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"guild_id"
                              Parser
  (Integer
   -> Maybe [ThreadMember]
   -> Maybe [UserId]
   -> ThreadMembersUpdateFields)
-> Parser Integer
-> Parser
     (Maybe [ThreadMember]
      -> Maybe [UserId] -> ThreadMembersUpdateFields)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"member_count"
                              Parser
  (Maybe [ThreadMember]
   -> Maybe [UserId] -> ThreadMembersUpdateFields)
-> Parser (Maybe [ThreadMember])
-> Parser (Maybe [UserId] -> ThreadMembersUpdateFields)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe [ThreadMember])
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"added_members"
                              Parser (Maybe [UserId] -> ThreadMembersUpdateFields)
-> Parser (Maybe [UserId]) -> Parser ThreadMembersUpdateFields
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe [UserId])
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"removed_member_ids"

-- | Represents information about a message in a Discord channel.
data Message = Message
  { Message -> MessageId
messageId                 :: MessageId                -- ^ The id of the message
  , Message -> ChannelId
messageChannelId          :: ChannelId                -- ^ Id of the channel the message
                                                          --   was sent in
  , Message -> Maybe GuildId
messageGuildId            :: Maybe GuildId            -- ^ The guild the message went to
  , Message -> User
messageAuthor             :: User                     -- ^ The 'User' the message was sent
                                                          --   by
  , Message -> Maybe GuildMember
messageMember             :: Maybe GuildMember        -- ^ A partial guild member object
  , Message -> Text
messageContent            :: Text                     -- ^ Contents of the message
  , Message -> UTCTime
messageTimestamp          :: UTCTime                  -- ^ When the message was sent
  , Message -> Maybe UTCTime
messageEdited             :: Maybe UTCTime            -- ^ When/if the message was edited
  , Message -> Bool
messageTts                :: Bool                     -- ^ Whether this message was a TTS
                                                          --   message
  , Message -> Bool
messageEveryone           :: Bool                     -- ^ Whether this message mentions
                                                          --   everyone
  , Message -> [User]
messageMentions           :: [User]                   -- ^ 'User's specifically mentioned in
                                                          --   the message
  , Message -> [RoleId]
messageMentionRoles       :: [RoleId]                 -- ^ 'Role's specifically mentioned in
                                                          --   the message
  , Message -> [Attachment]
messageAttachments        :: [Attachment]             -- ^ Any attached files
  , Message -> [Embed]
messageEmbeds             :: [Embed]                  -- ^ Any embedded content
  , Message -> [MessageReaction]
messageReactions          :: [MessageReaction]        -- ^ Any reactions to message
  , Message -> Maybe Nonce
messageNonce              :: Maybe Nonce              -- ^ Used for validating if a message
                                                          --   was sent
  , Message -> Bool
messagePinned             :: Bool                     -- ^ Whether this message is pinned
  , Message -> Maybe WebhookId
messageWebhookId          :: Maybe WebhookId          -- ^ The webhook id of the webhook that made the message
  , Message -> MessageType
messageType               :: MessageType              -- ^ What type of message is this.
  , Message -> Maybe MessageActivity
messageActivity           :: Maybe MessageActivity    -- ^ sent with Rich Presence-related chat embeds
  , Message -> Maybe ApplicationId
messageApplicationId      :: Maybe ApplicationId      -- ^ if the message is a response to an Interaction, this is the id of the interaction's application
  , Message -> Maybe MessageReference
messageReference          :: Maybe MessageReference   -- ^ Reference IDs of the original message
  , Message -> Maybe MessageFlags
messageFlags              :: Maybe MessageFlags       -- ^ Various message flags
  , Message -> Maybe Message
messageReferencedMessage  :: Maybe Message            -- ^ The full original message
  , Message -> Maybe MessageInteraction
messageInteraction        :: Maybe MessageInteraction -- ^ sent if message is an interaction response
  , Message -> Maybe Channel
messageThread             :: Maybe Channel            -- ^ the thread that was started from this message, includes thread member object
  , Message -> Maybe [ActionRow]
messageComponents         :: Maybe [ActionRow]        -- ^ sent if the message contains components like buttons, action rows, or other interactive components
  , Message -> Maybe [StickerItem]
messageStickerItems       :: Maybe [StickerItem]      -- ^ sent if the message contains stickers
  } deriving (Int -> Message -> ShowS
[Message] -> ShowS
Message -> String
(Int -> Message -> ShowS)
-> (Message -> String) -> ([Message] -> ShowS) -> Show Message
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Message] -> ShowS
$cshowList :: [Message] -> ShowS
show :: Message -> String
$cshow :: Message -> String
showsPrec :: Int -> Message -> ShowS
$cshowsPrec :: Int -> Message -> ShowS
Show, ReadPrec [Message]
ReadPrec Message
Int -> ReadS Message
ReadS [Message]
(Int -> ReadS Message)
-> ReadS [Message]
-> ReadPrec Message
-> ReadPrec [Message]
-> Read Message
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Message]
$creadListPrec :: ReadPrec [Message]
readPrec :: ReadPrec Message
$creadPrec :: ReadPrec Message
readList :: ReadS [Message]
$creadList :: ReadS [Message]
readsPrec :: Int -> ReadS Message
$creadsPrec :: Int -> ReadS Message
Read, Message -> Message -> Bool
(Message -> Message -> Bool)
-> (Message -> Message -> Bool) -> Eq Message
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Message -> Message -> Bool
$c/= :: Message -> Message -> Bool
== :: Message -> Message -> Bool
$c== :: Message -> Message -> Bool
Eq, Eq Message
Eq Message
-> (Message -> Message -> Ordering)
-> (Message -> Message -> Bool)
-> (Message -> Message -> Bool)
-> (Message -> Message -> Bool)
-> (Message -> Message -> Bool)
-> (Message -> Message -> Message)
-> (Message -> Message -> Message)
-> Ord Message
Message -> Message -> Bool
Message -> Message -> Ordering
Message -> Message -> Message
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Message -> Message -> Message
$cmin :: Message -> Message -> Message
max :: Message -> Message -> Message
$cmax :: Message -> Message -> Message
>= :: Message -> Message -> Bool
$c>= :: Message -> Message -> Bool
> :: Message -> Message -> Bool
$c> :: Message -> Message -> Bool
<= :: Message -> Message -> Bool
$c<= :: Message -> Message -> Bool
< :: Message -> Message -> Bool
$c< :: Message -> Message -> Bool
compare :: Message -> Message -> Ordering
$ccompare :: Message -> Message -> Ordering
$cp1Ord :: Eq Message
Ord)

instance FromJSON Message where
  parseJSON :: Value -> Parser Message
parseJSON = String -> (Object -> Parser Message) -> Value -> Parser Message
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"Message" ((Object -> Parser Message) -> Value -> Parser Message)
-> (Object -> Parser Message) -> Value -> Parser Message
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    MessageId
-> ChannelId
-> Maybe GuildId
-> User
-> Maybe GuildMember
-> Text
-> UTCTime
-> Maybe UTCTime
-> Bool
-> Bool
-> [User]
-> [RoleId]
-> [Attachment]
-> [Embed]
-> [MessageReaction]
-> Maybe Nonce
-> Bool
-> Maybe WebhookId
-> MessageType
-> Maybe MessageActivity
-> Maybe ApplicationId
-> Maybe MessageReference
-> Maybe MessageFlags
-> Maybe Message
-> Maybe MessageInteraction
-> Maybe Channel
-> Maybe [ActionRow]
-> Maybe [StickerItem]
-> Message
Message (MessageId
 -> ChannelId
 -> Maybe GuildId
 -> User
 -> Maybe GuildMember
 -> Text
 -> UTCTime
 -> Maybe UTCTime
 -> Bool
 -> Bool
 -> [User]
 -> [RoleId]
 -> [Attachment]
 -> [Embed]
 -> [MessageReaction]
 -> Maybe Nonce
 -> Bool
 -> Maybe WebhookId
 -> MessageType
 -> Maybe MessageActivity
 -> Maybe ApplicationId
 -> Maybe MessageReference
 -> Maybe MessageFlags
 -> Maybe Message
 -> Maybe MessageInteraction
 -> Maybe Channel
 -> Maybe [ActionRow]
 -> Maybe [StickerItem]
 -> Message)
-> Parser MessageId
-> Parser
     (ChannelId
      -> Maybe GuildId
      -> User
      -> Maybe GuildMember
      -> Text
      -> UTCTime
      -> Maybe UTCTime
      -> Bool
      -> Bool
      -> [User]
      -> [RoleId]
      -> [Attachment]
      -> [Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe WebhookId
      -> MessageType
      -> Maybe MessageActivity
      -> Maybe ApplicationId
      -> Maybe MessageReference
      -> Maybe MessageFlags
      -> Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser MessageId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"id"
            Parser
  (ChannelId
   -> Maybe GuildId
   -> User
   -> Maybe GuildMember
   -> Text
   -> UTCTime
   -> Maybe UTCTime
   -> Bool
   -> Bool
   -> [User]
   -> [RoleId]
   -> [Attachment]
   -> [Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe WebhookId
   -> MessageType
   -> Maybe MessageActivity
   -> Maybe ApplicationId
   -> Maybe MessageReference
   -> Maybe MessageFlags
   -> Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser ChannelId
-> Parser
     (Maybe GuildId
      -> User
      -> Maybe GuildMember
      -> Text
      -> UTCTime
      -> Maybe UTCTime
      -> Bool
      -> Bool
      -> [User]
      -> [RoleId]
      -> [Attachment]
      -> [Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe WebhookId
      -> MessageType
      -> Maybe MessageActivity
      -> Maybe ApplicationId
      -> Maybe MessageReference
      -> Maybe MessageFlags
      -> Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"channel_id"
            Parser
  (Maybe GuildId
   -> User
   -> Maybe GuildMember
   -> Text
   -> UTCTime
   -> Maybe UTCTime
   -> Bool
   -> Bool
   -> [User]
   -> [RoleId]
   -> [Attachment]
   -> [Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe WebhookId
   -> MessageType
   -> Maybe MessageActivity
   -> Maybe ApplicationId
   -> Maybe MessageReference
   -> Maybe MessageFlags
   -> Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser (Maybe GuildId)
-> Parser
     (User
      -> Maybe GuildMember
      -> Text
      -> UTCTime
      -> Maybe UTCTime
      -> Bool
      -> Bool
      -> [User]
      -> [RoleId]
      -> [Attachment]
      -> [Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe WebhookId
      -> MessageType
      -> Maybe MessageActivity
      -> Maybe ApplicationId
      -> Maybe MessageReference
      -> Maybe MessageFlags
      -> Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe (Maybe GuildId))
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"guild_id" Parser (Maybe (Maybe GuildId))
-> Maybe GuildId -> Parser (Maybe GuildId)
forall a. Parser (Maybe a) -> a -> Parser a
.!= Maybe GuildId
forall a. Maybe a
Nothing
            Parser
  (User
   -> Maybe GuildMember
   -> Text
   -> UTCTime
   -> Maybe UTCTime
   -> Bool
   -> Bool
   -> [User]
   -> [RoleId]
   -> [Attachment]
   -> [Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe WebhookId
   -> MessageType
   -> Maybe MessageActivity
   -> Maybe ApplicationId
   -> Maybe MessageReference
   -> Maybe MessageFlags
   -> Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser User
-> Parser
     (Maybe GuildMember
      -> Text
      -> UTCTime
      -> Maybe UTCTime
      -> Bool
      -> Bool
      -> [User]
      -> [RoleId]
      -> [Attachment]
      -> [Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe WebhookId
      -> MessageType
      -> Maybe MessageActivity
      -> Maybe ApplicationId
      -> Maybe MessageReference
      -> Maybe MessageFlags
      -> Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (do Maybe WebhookId
isW <- Object
o Object -> Text -> Parser (Maybe WebhookId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"webhook_id"
                    User
a <- Object
o Object -> Text -> Parser User
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"author"
                    case Maybe WebhookId
isW :: Maybe WebhookId of
                      Maybe WebhookId
Nothing -> User -> Parser User
forall (f :: * -> *) a. Applicative f => a -> f a
pure User
a
                      Just WebhookId
_ -> User -> Parser User
forall (f :: * -> *) a. Applicative f => a -> f a
pure (User -> Parser User) -> User -> Parser User
forall a b. (a -> b) -> a -> b
$ User
a { userIsWebhook :: Bool
userIsWebhook = Bool
True })
            Parser
  (Maybe GuildMember
   -> Text
   -> UTCTime
   -> Maybe UTCTime
   -> Bool
   -> Bool
   -> [User]
   -> [RoleId]
   -> [Attachment]
   -> [Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe WebhookId
   -> MessageType
   -> Maybe MessageActivity
   -> Maybe ApplicationId
   -> Maybe MessageReference
   -> Maybe MessageFlags
   -> Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser (Maybe GuildMember)
-> Parser
     (Text
      -> UTCTime
      -> Maybe UTCTime
      -> Bool
      -> Bool
      -> [User]
      -> [RoleId]
      -> [Attachment]
      -> [Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe WebhookId
      -> MessageType
      -> Maybe MessageActivity
      -> Maybe ApplicationId
      -> Maybe MessageReference
      -> Maybe MessageFlags
      -> Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe GuildMember)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"member"
            Parser
  (Text
   -> UTCTime
   -> Maybe UTCTime
   -> Bool
   -> Bool
   -> [User]
   -> [RoleId]
   -> [Attachment]
   -> [Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe WebhookId
   -> MessageType
   -> Maybe MessageActivity
   -> Maybe ApplicationId
   -> Maybe MessageReference
   -> Maybe MessageFlags
   -> Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser Text
-> Parser
     (UTCTime
      -> Maybe UTCTime
      -> Bool
      -> Bool
      -> [User]
      -> [RoleId]
      -> [Attachment]
      -> [Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe WebhookId
      -> MessageType
      -> Maybe MessageActivity
      -> Maybe ApplicationId
      -> Maybe MessageReference
      -> Maybe MessageFlags
      -> Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"content" Parser (Maybe Text) -> Text -> Parser Text
forall a. Parser (Maybe a) -> a -> Parser a
.!= Text
""
            Parser
  (UTCTime
   -> Maybe UTCTime
   -> Bool
   -> Bool
   -> [User]
   -> [RoleId]
   -> [Attachment]
   -> [Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe WebhookId
   -> MessageType
   -> Maybe MessageActivity
   -> Maybe ApplicationId
   -> Maybe MessageReference
   -> Maybe MessageFlags
   -> Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser UTCTime
-> Parser
     (Maybe UTCTime
      -> Bool
      -> Bool
      -> [User]
      -> [RoleId]
      -> [Attachment]
      -> [Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe WebhookId
      -> MessageType
      -> Maybe MessageActivity
      -> Maybe ApplicationId
      -> Maybe MessageReference
      -> Maybe MessageFlags
      -> Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe UTCTime)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"timestamp" Parser (Maybe UTCTime) -> UTCTime -> Parser UTCTime
forall a. Parser (Maybe a) -> a -> Parser a
.!= UTCTime
epochTime
            Parser
  (Maybe UTCTime
   -> Bool
   -> Bool
   -> [User]
   -> [RoleId]
   -> [Attachment]
   -> [Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe WebhookId
   -> MessageType
   -> Maybe MessageActivity
   -> Maybe ApplicationId
   -> Maybe MessageReference
   -> Maybe MessageFlags
   -> Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser (Maybe UTCTime)
-> Parser
     (Bool
      -> Bool
      -> [User]
      -> [RoleId]
      -> [Attachment]
      -> [Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe WebhookId
      -> MessageType
      -> Maybe MessageActivity
      -> Maybe ApplicationId
      -> Maybe MessageReference
      -> Maybe MessageFlags
      -> Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe UTCTime)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"edited_timestamp"
            Parser
  (Bool
   -> Bool
   -> [User]
   -> [RoleId]
   -> [Attachment]
   -> [Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe WebhookId
   -> MessageType
   -> Maybe MessageActivity
   -> Maybe ApplicationId
   -> Maybe MessageReference
   -> Maybe MessageFlags
   -> Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser Bool
-> Parser
     (Bool
      -> [User]
      -> [RoleId]
      -> [Attachment]
      -> [Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe WebhookId
      -> MessageType
      -> Maybe MessageActivity
      -> Maybe ApplicationId
      -> Maybe MessageReference
      -> Maybe MessageFlags
      -> Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"tts" Parser (Maybe Bool) -> Bool -> Parser Bool
forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
False
            Parser
  (Bool
   -> [User]
   -> [RoleId]
   -> [Attachment]
   -> [Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe WebhookId
   -> MessageType
   -> Maybe MessageActivity
   -> Maybe ApplicationId
   -> Maybe MessageReference
   -> Maybe MessageFlags
   -> Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser Bool
-> Parser
     ([User]
      -> [RoleId]
      -> [Attachment]
      -> [Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe WebhookId
      -> MessageType
      -> Maybe MessageActivity
      -> Maybe ApplicationId
      -> Maybe MessageReference
      -> Maybe MessageFlags
      -> Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"mention_everyone" Parser (Maybe Bool) -> Bool -> Parser Bool
forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
False
            Parser
  ([User]
   -> [RoleId]
   -> [Attachment]
   -> [Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe WebhookId
   -> MessageType
   -> Maybe MessageActivity
   -> Maybe ApplicationId
   -> Maybe MessageReference
   -> Maybe MessageFlags
   -> Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser [User]
-> Parser
     ([RoleId]
      -> [Attachment]
      -> [Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe WebhookId
      -> MessageType
      -> Maybe MessageActivity
      -> Maybe ApplicationId
      -> Maybe MessageReference
      -> Maybe MessageFlags
      -> Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe [User])
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"mentions" Parser (Maybe [User]) -> [User] -> Parser [User]
forall a. Parser (Maybe a) -> a -> Parser a
.!= []
            Parser
  ([RoleId]
   -> [Attachment]
   -> [Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe WebhookId
   -> MessageType
   -> Maybe MessageActivity
   -> Maybe ApplicationId
   -> Maybe MessageReference
   -> Maybe MessageFlags
   -> Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser [RoleId]
-> Parser
     ([Attachment]
      -> [Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe WebhookId
      -> MessageType
      -> Maybe MessageActivity
      -> Maybe ApplicationId
      -> Maybe MessageReference
      -> Maybe MessageFlags
      -> Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe [RoleId])
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"mention_roles" Parser (Maybe [RoleId]) -> [RoleId] -> Parser [RoleId]
forall a. Parser (Maybe a) -> a -> Parser a
.!= []
            Parser
  ([Attachment]
   -> [Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe WebhookId
   -> MessageType
   -> Maybe MessageActivity
   -> Maybe ApplicationId
   -> Maybe MessageReference
   -> Maybe MessageFlags
   -> Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser [Attachment]
-> Parser
     ([Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe WebhookId
      -> MessageType
      -> Maybe MessageActivity
      -> Maybe ApplicationId
      -> Maybe MessageReference
      -> Maybe MessageFlags
      -> Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe [Attachment])
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"attachments" Parser (Maybe [Attachment]) -> [Attachment] -> Parser [Attachment]
forall a. Parser (Maybe a) -> a -> Parser a
.!= []
            Parser
  ([Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe WebhookId
   -> MessageType
   -> Maybe MessageActivity
   -> Maybe ApplicationId
   -> Maybe MessageReference
   -> Maybe MessageFlags
   -> Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser [Embed]
-> Parser
     ([MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe WebhookId
      -> MessageType
      -> Maybe MessageActivity
      -> Maybe ApplicationId
      -> Maybe MessageReference
      -> Maybe MessageFlags
      -> Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser [Embed]
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"embeds"
            Parser
  ([MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe WebhookId
   -> MessageType
   -> Maybe MessageActivity
   -> Maybe ApplicationId
   -> Maybe MessageReference
   -> Maybe MessageFlags
   -> Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser [MessageReaction]
-> Parser
     (Maybe Nonce
      -> Bool
      -> Maybe WebhookId
      -> MessageType
      -> Maybe MessageActivity
      -> Maybe ApplicationId
      -> Maybe MessageReference
      -> Maybe MessageFlags
      -> Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe [MessageReaction])
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"reactions" Parser (Maybe [MessageReaction])
-> [MessageReaction] -> Parser [MessageReaction]
forall a. Parser (Maybe a) -> a -> Parser a
.!= []
            Parser
  (Maybe Nonce
   -> Bool
   -> Maybe WebhookId
   -> MessageType
   -> Maybe MessageActivity
   -> Maybe ApplicationId
   -> Maybe MessageReference
   -> Maybe MessageFlags
   -> Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser (Maybe Nonce)
-> Parser
     (Bool
      -> Maybe WebhookId
      -> MessageType
      -> Maybe MessageActivity
      -> Maybe ApplicationId
      -> Maybe MessageReference
      -> Maybe MessageFlags
      -> Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Nonce)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"nonce"
            Parser
  (Bool
   -> Maybe WebhookId
   -> MessageType
   -> Maybe MessageActivity
   -> Maybe ApplicationId
   -> Maybe MessageReference
   -> Maybe MessageFlags
   -> Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser Bool
-> Parser
     (Maybe WebhookId
      -> MessageType
      -> Maybe MessageActivity
      -> Maybe ApplicationId
      -> Maybe MessageReference
      -> Maybe MessageFlags
      -> Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"pinned" Parser (Maybe Bool) -> Bool -> Parser Bool
forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
False
            Parser
  (Maybe WebhookId
   -> MessageType
   -> Maybe MessageActivity
   -> Maybe ApplicationId
   -> Maybe MessageReference
   -> Maybe MessageFlags
   -> Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser (Maybe WebhookId)
-> Parser
     (MessageType
      -> Maybe MessageActivity
      -> Maybe ApplicationId
      -> Maybe MessageReference
      -> Maybe MessageFlags
      -> Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe WebhookId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"webhook_id"
            Parser
  (MessageType
   -> Maybe MessageActivity
   -> Maybe ApplicationId
   -> Maybe MessageReference
   -> Maybe MessageFlags
   -> Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser MessageType
-> Parser
     (Maybe MessageActivity
      -> Maybe ApplicationId
      -> Maybe MessageReference
      -> Maybe MessageFlags
      -> Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser MessageType
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"type"
            Parser
  (Maybe MessageActivity
   -> Maybe ApplicationId
   -> Maybe MessageReference
   -> Maybe MessageFlags
   -> Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser (Maybe MessageActivity)
-> Parser
     (Maybe ApplicationId
      -> Maybe MessageReference
      -> Maybe MessageFlags
      -> Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe MessageActivity)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"activity"
            -- <*> o .:? "application"
            Parser
  (Maybe ApplicationId
   -> Maybe MessageReference
   -> Maybe MessageFlags
   -> Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser (Maybe ApplicationId)
-> Parser
     (Maybe MessageReference
      -> Maybe MessageFlags
      -> Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ApplicationId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"application_id"
            Parser
  (Maybe MessageReference
   -> Maybe MessageFlags
   -> Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser (Maybe MessageReference)
-> Parser
     (Maybe MessageFlags
      -> Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe (Maybe MessageReference))
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"message_reference" Parser (Maybe (Maybe MessageReference))
-> Maybe MessageReference -> Parser (Maybe MessageReference)
forall a. Parser (Maybe a) -> a -> Parser a
.!= Maybe MessageReference
forall a. Maybe a
Nothing
            Parser
  (Maybe MessageFlags
   -> Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser (Maybe MessageFlags)
-> Parser
     (Maybe Message
      -> Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe MessageFlags)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"flags"
            Parser
  (Maybe Message
   -> Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser (Maybe Message)
-> Parser
     (Maybe MessageInteraction
      -> Maybe Channel
      -> Maybe [ActionRow]
      -> Maybe [StickerItem]
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe (Maybe Message))
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"referenced_message" Parser (Maybe (Maybe Message))
-> Maybe Message -> Parser (Maybe Message)
forall a. Parser (Maybe a) -> a -> Parser a
.!= Maybe Message
forall a. Maybe a
Nothing
            Parser
  (Maybe MessageInteraction
   -> Maybe Channel
   -> Maybe [ActionRow]
   -> Maybe [StickerItem]
   -> Message)
-> Parser (Maybe MessageInteraction)
-> Parser
     (Maybe Channel
      -> Maybe [ActionRow] -> Maybe [StickerItem] -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe MessageInteraction)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"interaction"
            Parser
  (Maybe Channel
   -> Maybe [ActionRow] -> Maybe [StickerItem] -> Message)
-> Parser (Maybe Channel)
-> Parser (Maybe [ActionRow] -> Maybe [StickerItem] -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Channel)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"thread"
            Parser (Maybe [ActionRow] -> Maybe [StickerItem] -> Message)
-> Parser (Maybe [ActionRow])
-> Parser (Maybe [StickerItem] -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe [ActionRow])
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"components"
            Parser (Maybe [StickerItem] -> Message)
-> Parser (Maybe [StickerItem]) -> Parser Message
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe [StickerItem])
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"sticker_items"


instance ToJSON Message where
  toJSON :: Message -> Value
toJSON Message {Bool
[RoleId]
[Embed]
[User]
[Attachment]
[MessageReaction]
Maybe [StickerItem]
Maybe [ActionRow]
Maybe UTCTime
Maybe ApplicationId
Maybe WebhookId
Maybe GuildId
Maybe GuildMember
Maybe MessageInteraction
Maybe MessageFlags
Maybe MessageActivity
Maybe MessageReference
Maybe Nonce
Maybe Message
Maybe Channel
Text
UTCTime
MessageId
ChannelId
User
MessageType
messageStickerItems :: Maybe [StickerItem]
messageComponents :: Maybe [ActionRow]
messageThread :: Maybe Channel
messageInteraction :: Maybe MessageInteraction
messageReferencedMessage :: Maybe Message
messageFlags :: Maybe MessageFlags
messageReference :: Maybe MessageReference
messageApplicationId :: Maybe ApplicationId
messageActivity :: Maybe MessageActivity
messageType :: MessageType
messageWebhookId :: Maybe WebhookId
messagePinned :: Bool
messageNonce :: Maybe Nonce
messageReactions :: [MessageReaction]
messageEmbeds :: [Embed]
messageAttachments :: [Attachment]
messageMentionRoles :: [RoleId]
messageMentions :: [User]
messageEveryone :: Bool
messageTts :: Bool
messageEdited :: Maybe UTCTime
messageTimestamp :: UTCTime
messageContent :: Text
messageMember :: Maybe GuildMember
messageAuthor :: User
messageGuildId :: Maybe GuildId
messageChannelId :: ChannelId
messageId :: MessageId
messageStickerItems :: Message -> Maybe [StickerItem]
messageComponents :: Message -> Maybe [ActionRow]
messageThread :: Message -> Maybe Channel
messageInteraction :: Message -> Maybe MessageInteraction
messageReferencedMessage :: Message -> Maybe Message
messageFlags :: Message -> Maybe MessageFlags
messageReference :: Message -> Maybe MessageReference
messageApplicationId :: Message -> Maybe ApplicationId
messageActivity :: Message -> Maybe MessageActivity
messageType :: Message -> MessageType
messageWebhookId :: Message -> Maybe WebhookId
messagePinned :: Message -> Bool
messageNonce :: Message -> Maybe Nonce
messageReactions :: Message -> [MessageReaction]
messageEmbeds :: Message -> [Embed]
messageAttachments :: Message -> [Attachment]
messageMentionRoles :: Message -> [RoleId]
messageMentions :: Message -> [User]
messageEveryone :: Message -> Bool
messageTts :: Message -> Bool
messageEdited :: Message -> Maybe UTCTime
messageTimestamp :: Message -> UTCTime
messageContent :: Message -> Text
messageMember :: Message -> Maybe GuildMember
messageAuthor :: Message -> User
messageGuildId :: Message -> Maybe GuildId
messageChannelId :: Message -> ChannelId
messageId :: Message -> MessageId
..} = [Pair] -> Value
object [(Text
name, Value
value) | (Text
name, Just Value
value) <-
      [ (Text
"id",                  MessageId -> Value
forall a. ToJSON a => a -> Value
toJSON (MessageId -> Value) -> Maybe MessageId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MessageId -> Maybe MessageId
forall (f :: * -> *) a. Applicative f => a -> f a
pure MessageId
messageId)
      , (Text
"channel_id",          ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
messageChannelId)
      , (Text
"guild_id",            GuildId -> Value
forall a. ToJSON a => a -> Value
toJSON (GuildId -> Value) -> Maybe GuildId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>      Maybe GuildId
messageGuildId)
      , (Text
"author",              User -> Value
forall a. ToJSON a => a -> Value
toJSON (User -> Value) -> Maybe User -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> User -> Maybe User
forall (f :: * -> *) a. Applicative f => a -> f a
pure User
messageAuthor)
      , (Text
"member",              GuildMember -> Value
forall a. ToJSON a => a -> Value
toJSON (GuildMember -> Value) -> Maybe GuildMember -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>      Maybe GuildMember
messageMember)
      , (Text
"content",             Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
messageContent)
      , (Text
"timestamp",           UTCTime -> Value
forall a. ToJSON a => a -> Value
toJSON (UTCTime -> Value) -> Maybe UTCTime -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> UTCTime -> Maybe UTCTime
forall (f :: * -> *) a. Applicative f => a -> f a
pure UTCTime
messageTimestamp)
      , (Text
"edited_timestamp",    UTCTime -> Value
forall a. ToJSON a => a -> Value
toJSON (UTCTime -> Value) -> Maybe UTCTime -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>      Maybe UTCTime
messageEdited)
      , (Text
"tts",                 Bool -> Value
forall a. ToJSON a => a -> Value
toJSON (Bool -> Value) -> Maybe Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> Maybe Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
messageTts)
      , (Text
"mention_everyone",    Bool -> Value
forall a. ToJSON a => a -> Value
toJSON (Bool -> Value) -> Maybe Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> Maybe Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
messageEveryone)
      , (Text
"mentions",            [User] -> Value
forall a. ToJSON a => a -> Value
toJSON ([User] -> Value) -> Maybe [User] -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [User] -> Maybe [User]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [User]
messageMentions)
      , (Text
"mention_roles",       [RoleId] -> Value
forall a. ToJSON a => a -> Value
toJSON ([RoleId] -> Value) -> Maybe [RoleId] -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [RoleId] -> Maybe [RoleId]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [RoleId]
messageMentionRoles)
      , (Text
"attachments",         [Attachment] -> Value
forall a. ToJSON a => a -> Value
toJSON ([Attachment] -> Value) -> Maybe [Attachment] -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Attachment] -> Maybe [Attachment]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [Attachment]
messageAttachments)
      , (Text
"embeds",              [Embed] -> Value
forall a. ToJSON a => a -> Value
toJSON ([Embed] -> Value) -> Maybe [Embed] -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Embed] -> Maybe [Embed]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [Embed]
messageEmbeds)
      , (Text
"reactions",           [MessageReaction] -> Value
forall a. ToJSON a => a -> Value
toJSON ([MessageReaction] -> Value)
-> Maybe [MessageReaction] -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [MessageReaction] -> Maybe [MessageReaction]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [MessageReaction]
messageReactions)
      , (Text
"nonce",               Nonce -> Value
forall a. ToJSON a => a -> Value
toJSON (Nonce -> Value) -> Maybe Nonce -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>      Maybe Nonce
messageNonce)
      , (Text
"pinned",              Bool -> Value
forall a. ToJSON a => a -> Value
toJSON (Bool -> Value) -> Maybe Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> Maybe Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
messagePinned)
      , (Text
"webhook_id",          WebhookId -> Value
forall a. ToJSON a => a -> Value
toJSON (WebhookId -> Value) -> Maybe WebhookId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>      Maybe WebhookId
messageWebhookId)
      , (Text
"type",                MessageType -> Value
forall a. ToJSON a => a -> Value
toJSON (MessageType -> Value) -> Maybe MessageType -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MessageType -> Maybe MessageType
forall (f :: * -> *) a. Applicative f => a -> f a
pure MessageType
messageType)
      , (Text
"activity",            MessageActivity -> Value
forall a. ToJSON a => a -> Value
toJSON (MessageActivity -> Value) -> Maybe MessageActivity -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>      Maybe MessageActivity
messageActivity)
      -- , ("application",            toJSON <$>      messageApplication)
      , (Text
"application_id",      ApplicationId -> Value
forall a. ToJSON a => a -> Value
toJSON (ApplicationId -> Value) -> Maybe ApplicationId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>      Maybe ApplicationId
messageApplicationId)
      , (Text
"message_reference",   MessageReference -> Value
forall a. ToJSON a => a -> Value
toJSON (MessageReference -> Value)
-> Maybe MessageReference -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>      Maybe MessageReference
messageReference)
      , (Text
"flags",               MessageFlags -> Value
forall a. ToJSON a => a -> Value
toJSON (MessageFlags -> Value) -> Maybe MessageFlags -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>      Maybe MessageFlags
messageFlags)
      , (Text
"referenced_message",  Message -> Value
forall a. ToJSON a => a -> Value
toJSON (Message -> Value) -> Maybe Message -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>      Maybe Message
messageReferencedMessage)
      , (Text
"interaction",         MessageInteraction -> Value
forall a. ToJSON a => a -> Value
toJSON (MessageInteraction -> Value)
-> Maybe MessageInteraction -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>      Maybe MessageInteraction
messageInteraction)
      , (Text
"thread",              Channel -> Value
forall a. ToJSON a => a -> Value
toJSON (Channel -> Value) -> Maybe Channel -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>      Maybe Channel
messageThread)
      , (Text
"components",          [ActionRow] -> Value
forall a. ToJSON a => a -> Value
toJSON ([ActionRow] -> Value) -> Maybe [ActionRow] -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>      Maybe [ActionRow]
messageComponents)
      , (Text
"sticker_items",       [StickerItem] -> Value
forall a. ToJSON a => a -> Value
toJSON ([StickerItem] -> Value) -> Maybe [StickerItem] -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>      Maybe [StickerItem]
messageStickerItems)
      ] ]

-- | Data constructor for a part of MessageDetailedOpts.
data AllowedMentions = AllowedMentions
  { AllowedMentions -> Bool
mentionEveryone    :: Bool     -- ^ Can mention @\@everyone@
  , AllowedMentions -> Bool
mentionUsers       :: Bool     -- ^ Can mention any user
  , AllowedMentions -> Bool
mentionRoles       :: Bool     -- ^ Can mention any mentionable role
  , AllowedMentions -> [UserId]
mentionUserIds     :: [UserId] -- ^ List of users able to be mentionned
  , AllowedMentions -> [RoleId]
mentionRoleIds     :: [RoleId] -- ^ List of roles able to be mentioneed 
  , AllowedMentions -> Bool
mentionRepliedUser :: Bool     -- ^ Can mention the sender of the replied message 
  } deriving (Int -> AllowedMentions -> ShowS
[AllowedMentions] -> ShowS
AllowedMentions -> String
(Int -> AllowedMentions -> ShowS)
-> (AllowedMentions -> String)
-> ([AllowedMentions] -> ShowS)
-> Show AllowedMentions
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AllowedMentions] -> ShowS
$cshowList :: [AllowedMentions] -> ShowS
show :: AllowedMentions -> String
$cshow :: AllowedMentions -> String
showsPrec :: Int -> AllowedMentions -> ShowS
$cshowsPrec :: Int -> AllowedMentions -> ShowS
Show, ReadPrec [AllowedMentions]
ReadPrec AllowedMentions
Int -> ReadS AllowedMentions
ReadS [AllowedMentions]
(Int -> ReadS AllowedMentions)
-> ReadS [AllowedMentions]
-> ReadPrec AllowedMentions
-> ReadPrec [AllowedMentions]
-> Read AllowedMentions
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [AllowedMentions]
$creadListPrec :: ReadPrec [AllowedMentions]
readPrec :: ReadPrec AllowedMentions
$creadPrec :: ReadPrec AllowedMentions
readList :: ReadS [AllowedMentions]
$creadList :: ReadS [AllowedMentions]
readsPrec :: Int -> ReadS AllowedMentions
$creadsPrec :: Int -> ReadS AllowedMentions
Read, AllowedMentions -> AllowedMentions -> Bool
(AllowedMentions -> AllowedMentions -> Bool)
-> (AllowedMentions -> AllowedMentions -> Bool)
-> Eq AllowedMentions
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AllowedMentions -> AllowedMentions -> Bool
$c/= :: AllowedMentions -> AllowedMentions -> Bool
== :: AllowedMentions -> AllowedMentions -> Bool
$c== :: AllowedMentions -> AllowedMentions -> Bool
Eq, Eq AllowedMentions
Eq AllowedMentions
-> (AllowedMentions -> AllowedMentions -> Ordering)
-> (AllowedMentions -> AllowedMentions -> Bool)
-> (AllowedMentions -> AllowedMentions -> Bool)
-> (AllowedMentions -> AllowedMentions -> Bool)
-> (AllowedMentions -> AllowedMentions -> Bool)
-> (AllowedMentions -> AllowedMentions -> AllowedMentions)
-> (AllowedMentions -> AllowedMentions -> AllowedMentions)
-> Ord AllowedMentions
AllowedMentions -> AllowedMentions -> Bool
AllowedMentions -> AllowedMentions -> Ordering
AllowedMentions -> AllowedMentions -> AllowedMentions
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: AllowedMentions -> AllowedMentions -> AllowedMentions
$cmin :: AllowedMentions -> AllowedMentions -> AllowedMentions
max :: AllowedMentions -> AllowedMentions -> AllowedMentions
$cmax :: AllowedMentions -> AllowedMentions -> AllowedMentions
>= :: AllowedMentions -> AllowedMentions -> Bool
$c>= :: AllowedMentions -> AllowedMentions -> Bool
> :: AllowedMentions -> AllowedMentions -> Bool
$c> :: AllowedMentions -> AllowedMentions -> Bool
<= :: AllowedMentions -> AllowedMentions -> Bool
$c<= :: AllowedMentions -> AllowedMentions -> Bool
< :: AllowedMentions -> AllowedMentions -> Bool
$c< :: AllowedMentions -> AllowedMentions -> Bool
compare :: AllowedMentions -> AllowedMentions -> Ordering
$ccompare :: AllowedMentions -> AllowedMentions -> Ordering
$cp1Ord :: Eq AllowedMentions
Ord)

instance Default AllowedMentions where
  def :: AllowedMentions
def = AllowedMentions :: Bool
-> Bool -> Bool -> [UserId] -> [RoleId] -> Bool -> AllowedMentions
AllowedMentions { mentionEveryone :: Bool
mentionEveryone    = Bool
False
                        , mentionUsers :: Bool
mentionUsers       = Bool
True
                        , mentionRoles :: Bool
mentionRoles       = Bool
True
                        , mentionUserIds :: [UserId]
mentionUserIds     = []
                        , mentionRoleIds :: [RoleId]
mentionRoleIds     = []
                        , mentionRepliedUser :: Bool
mentionRepliedUser = Bool
True
                        }

instance ToJSON AllowedMentions where
  toJSON :: AllowedMentions -> Value
toJSON AllowedMentions{Bool
[RoleId]
[UserId]
mentionRepliedUser :: Bool
mentionRoleIds :: [RoleId]
mentionUserIds :: [UserId]
mentionRoles :: Bool
mentionUsers :: Bool
mentionEveryone :: Bool
mentionRepliedUser :: AllowedMentions -> Bool
mentionRoleIds :: AllowedMentions -> [RoleId]
mentionUserIds :: AllowedMentions -> [UserId]
mentionRoles :: AllowedMentions -> Bool
mentionUsers :: AllowedMentions -> Bool
mentionEveryone :: AllowedMentions -> Bool
..} = [Pair] -> Value
object [
                                 Text
"parse" Text -> [Text] -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= [Text
name :: T.Text | (Text
name, Bool
True) <-
                                    [ (Text
"everyone", Bool
mentionEveryone),
                                      (Text
"users",    Bool
mentionUsers Bool -> Bool -> Bool
&& [UserId] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [UserId]
mentionUserIds),
                                      (Text
"roles",    Bool
mentionRoles Bool -> Bool -> Bool
&& [RoleId] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [RoleId]
mentionRoleIds) ] ],
                                 -- https://discord.com/developers/docs/resources/channel#allowed-mentions-object
                                 --  parse.users and users list cannot both be active, prioritize id list
                                 Text
"roles"        Text -> [RoleId] -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= [RoleId]
mentionRoleIds,
                                 Text
"users"        Text -> [UserId] -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= [UserId]
mentionUserIds,
                                 Text
"replied_user" Text -> Bool -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Bool
mentionRepliedUser ]

-- | A reaction to a message
data MessageReaction = MessageReaction
  { MessageReaction -> Int
messageReactionCount :: Int 
  , MessageReaction -> Bool
messageReactionMeIncluded :: Bool
  , MessageReaction -> Emoji
messageReactionEmoji :: Emoji
  } deriving (Int -> MessageReaction -> ShowS
[MessageReaction] -> ShowS
MessageReaction -> String
(Int -> MessageReaction -> ShowS)
-> (MessageReaction -> String)
-> ([MessageReaction] -> ShowS)
-> Show MessageReaction
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MessageReaction] -> ShowS
$cshowList :: [MessageReaction] -> ShowS
show :: MessageReaction -> String
$cshow :: MessageReaction -> String
showsPrec :: Int -> MessageReaction -> ShowS
$cshowsPrec :: Int -> MessageReaction -> ShowS
Show, ReadPrec [MessageReaction]
ReadPrec MessageReaction
Int -> ReadS MessageReaction
ReadS [MessageReaction]
(Int -> ReadS MessageReaction)
-> ReadS [MessageReaction]
-> ReadPrec MessageReaction
-> ReadPrec [MessageReaction]
-> Read MessageReaction
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [MessageReaction]
$creadListPrec :: ReadPrec [MessageReaction]
readPrec :: ReadPrec MessageReaction
$creadPrec :: ReadPrec MessageReaction
readList :: ReadS [MessageReaction]
$creadList :: ReadS [MessageReaction]
readsPrec :: Int -> ReadS MessageReaction
$creadsPrec :: Int -> ReadS MessageReaction
Read, MessageReaction -> MessageReaction -> Bool
(MessageReaction -> MessageReaction -> Bool)
-> (MessageReaction -> MessageReaction -> Bool)
-> Eq MessageReaction
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MessageReaction -> MessageReaction -> Bool
$c/= :: MessageReaction -> MessageReaction -> Bool
== :: MessageReaction -> MessageReaction -> Bool
$c== :: MessageReaction -> MessageReaction -> Bool
Eq, Eq MessageReaction
Eq MessageReaction
-> (MessageReaction -> MessageReaction -> Ordering)
-> (MessageReaction -> MessageReaction -> Bool)
-> (MessageReaction -> MessageReaction -> Bool)
-> (MessageReaction -> MessageReaction -> Bool)
-> (MessageReaction -> MessageReaction -> Bool)
-> (MessageReaction -> MessageReaction -> MessageReaction)
-> (MessageReaction -> MessageReaction -> MessageReaction)
-> Ord MessageReaction
MessageReaction -> MessageReaction -> Bool
MessageReaction -> MessageReaction -> Ordering
MessageReaction -> MessageReaction -> MessageReaction
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: MessageReaction -> MessageReaction -> MessageReaction
$cmin :: MessageReaction -> MessageReaction -> MessageReaction
max :: MessageReaction -> MessageReaction -> MessageReaction
$cmax :: MessageReaction -> MessageReaction -> MessageReaction
>= :: MessageReaction -> MessageReaction -> Bool
$c>= :: MessageReaction -> MessageReaction -> Bool
> :: MessageReaction -> MessageReaction -> Bool
$c> :: MessageReaction -> MessageReaction -> Bool
<= :: MessageReaction -> MessageReaction -> Bool
$c<= :: MessageReaction -> MessageReaction -> Bool
< :: MessageReaction -> MessageReaction -> Bool
$c< :: MessageReaction -> MessageReaction -> Bool
compare :: MessageReaction -> MessageReaction -> Ordering
$ccompare :: MessageReaction -> MessageReaction -> Ordering
$cp1Ord :: Eq MessageReaction
Ord)

instance FromJSON MessageReaction where
  parseJSON :: Value -> Parser MessageReaction
parseJSON = String
-> (Object -> Parser MessageReaction)
-> Value
-> Parser MessageReaction
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"MessageReaction" ((Object -> Parser MessageReaction)
 -> Value -> Parser MessageReaction)
-> (Object -> Parser MessageReaction)
-> Value
-> Parser MessageReaction
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    Int -> Bool -> Emoji -> MessageReaction
MessageReaction (Int -> Bool -> Emoji -> MessageReaction)
-> Parser Int -> Parser (Bool -> Emoji -> MessageReaction)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser Int
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"count"
                    Parser (Bool -> Emoji -> MessageReaction)
-> Parser Bool -> Parser (Emoji -> MessageReaction)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Bool
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"me"
                    Parser (Emoji -> MessageReaction)
-> Parser Emoji -> Parser MessageReaction
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Emoji
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"emoji"

instance ToJSON MessageReaction where
  toJSON :: MessageReaction -> Value
toJSON MessageReaction{Bool
Int
Emoji
messageReactionEmoji :: Emoji
messageReactionMeIncluded :: Bool
messageReactionCount :: Int
messageReactionEmoji :: MessageReaction -> Emoji
messageReactionMeIncluded :: MessageReaction -> Bool
messageReactionCount :: MessageReaction -> Int
..} = [Pair] -> Value
object [(Text
name, Value
value) | (Text
name, Just Value
value) <-
      [ (Text
"count", Int -> Value
forall a. ToJSON a => a -> Value
toJSON (Int -> Value) -> Maybe Int -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Maybe Int
forall (f :: * -> *) a. Applicative f => a -> f a
pure Int
messageReactionCount)
      , (Text
"me",    Bool -> Value
forall a. ToJSON a => a -> Value
toJSON (Bool -> Value) -> Maybe Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> Maybe Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
messageReactionMeIncluded)
      , (Text
"emoji", Emoji -> Value
forall a. ToJSON a => a -> Value
toJSON (Emoji -> Value) -> Maybe Emoji -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Emoji -> Maybe Emoji
forall (f :: * -> *) a. Applicative f => a -> f a
pure Emoji
messageReactionEmoji)
      ]]

-- | Represents an attached to a message file.
data Attachment = Attachment
  { Attachment -> AttachmentId
attachmentId       :: AttachmentId     -- ^ Attachment id
  , Attachment -> Text
attachmentFilename :: T.Text        -- ^ Name of attached file
  , Attachment -> Integer
attachmentSize     :: Integer       -- ^ Size of file (in bytes)
  , Attachment -> Text
attachmentUrl      :: T.Text        -- ^ Source of file
  , Attachment -> Text
attachmentProxy    :: T.Text        -- ^ Proxied url of file
  , Attachment -> Maybe Integer
attachmentHeight   :: Maybe Integer -- ^ Height of file (if image)
  , Attachment -> Maybe Integer
attachmentWidth    :: Maybe Integer -- ^ Width of file (if image)
  } deriving (Int -> Attachment -> ShowS
[Attachment] -> ShowS
Attachment -> String
(Int -> Attachment -> ShowS)
-> (Attachment -> String)
-> ([Attachment] -> ShowS)
-> Show Attachment
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Attachment] -> ShowS
$cshowList :: [Attachment] -> ShowS
show :: Attachment -> String
$cshow :: Attachment -> String
showsPrec :: Int -> Attachment -> ShowS
$cshowsPrec :: Int -> Attachment -> ShowS
Show, ReadPrec [Attachment]
ReadPrec Attachment
Int -> ReadS Attachment
ReadS [Attachment]
(Int -> ReadS Attachment)
-> ReadS [Attachment]
-> ReadPrec Attachment
-> ReadPrec [Attachment]
-> Read Attachment
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Attachment]
$creadListPrec :: ReadPrec [Attachment]
readPrec :: ReadPrec Attachment
$creadPrec :: ReadPrec Attachment
readList :: ReadS [Attachment]
$creadList :: ReadS [Attachment]
readsPrec :: Int -> ReadS Attachment
$creadsPrec :: Int -> ReadS Attachment
Read, Attachment -> Attachment -> Bool
(Attachment -> Attachment -> Bool)
-> (Attachment -> Attachment -> Bool) -> Eq Attachment
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Attachment -> Attachment -> Bool
$c/= :: Attachment -> Attachment -> Bool
== :: Attachment -> Attachment -> Bool
$c== :: Attachment -> Attachment -> Bool
Eq, Eq Attachment
Eq Attachment
-> (Attachment -> Attachment -> Ordering)
-> (Attachment -> Attachment -> Bool)
-> (Attachment -> Attachment -> Bool)
-> (Attachment -> Attachment -> Bool)
-> (Attachment -> Attachment -> Bool)
-> (Attachment -> Attachment -> Attachment)
-> (Attachment -> Attachment -> Attachment)
-> Ord Attachment
Attachment -> Attachment -> Bool
Attachment -> Attachment -> Ordering
Attachment -> Attachment -> Attachment
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Attachment -> Attachment -> Attachment
$cmin :: Attachment -> Attachment -> Attachment
max :: Attachment -> Attachment -> Attachment
$cmax :: Attachment -> Attachment -> Attachment
>= :: Attachment -> Attachment -> Bool
$c>= :: Attachment -> Attachment -> Bool
> :: Attachment -> Attachment -> Bool
$c> :: Attachment -> Attachment -> Bool
<= :: Attachment -> Attachment -> Bool
$c<= :: Attachment -> Attachment -> Bool
< :: Attachment -> Attachment -> Bool
$c< :: Attachment -> Attachment -> Bool
compare :: Attachment -> Attachment -> Ordering
$ccompare :: Attachment -> Attachment -> Ordering
$cp1Ord :: Eq Attachment
Ord)

instance FromJSON Attachment where
  parseJSON :: Value -> Parser Attachment
parseJSON = String
-> (Object -> Parser Attachment) -> Value -> Parser Attachment
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"Attachment" ((Object -> Parser Attachment) -> Value -> Parser Attachment)
-> (Object -> Parser Attachment) -> Value -> Parser Attachment
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    AttachmentId
-> Text
-> Integer
-> Text
-> Text
-> Maybe Integer
-> Maybe Integer
-> Attachment
Attachment (AttachmentId
 -> Text
 -> Integer
 -> Text
 -> Text
 -> Maybe Integer
 -> Maybe Integer
 -> Attachment)
-> Parser AttachmentId
-> Parser
     (Text
      -> Integer
      -> Text
      -> Text
      -> Maybe Integer
      -> Maybe Integer
      -> Attachment)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser AttachmentId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"id"
               Parser
  (Text
   -> Integer
   -> Text
   -> Text
   -> Maybe Integer
   -> Maybe Integer
   -> Attachment)
-> Parser Text
-> Parser
     (Integer
      -> Text -> Text -> Maybe Integer -> Maybe Integer -> Attachment)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"filename"
               Parser
  (Integer
   -> Text -> Text -> Maybe Integer -> Maybe Integer -> Attachment)
-> Parser Integer
-> Parser
     (Text -> Text -> Maybe Integer -> Maybe Integer -> Attachment)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"size"
               Parser
  (Text -> Text -> Maybe Integer -> Maybe Integer -> Attachment)
-> Parser Text
-> Parser (Text -> Maybe Integer -> Maybe Integer -> Attachment)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"url"
               Parser (Text -> Maybe Integer -> Maybe Integer -> Attachment)
-> Parser Text
-> Parser (Maybe Integer -> Maybe Integer -> Attachment)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"proxy_url"
               Parser (Maybe Integer -> Maybe Integer -> Attachment)
-> Parser (Maybe Integer) -> Parser (Maybe Integer -> Attachment)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"height"
               Parser (Maybe Integer -> Attachment)
-> Parser (Maybe Integer) -> Parser Attachment
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"width"

instance ToJSON Attachment where
  toJSON :: Attachment -> Value
toJSON Attachment {Integer
Maybe Integer
Text
AttachmentId
attachmentWidth :: Maybe Integer
attachmentHeight :: Maybe Integer
attachmentProxy :: Text
attachmentUrl :: Text
attachmentSize :: Integer
attachmentFilename :: Text
attachmentId :: AttachmentId
attachmentWidth :: Attachment -> Maybe Integer
attachmentHeight :: Attachment -> Maybe Integer
attachmentProxy :: Attachment -> Text
attachmentUrl :: Attachment -> Text
attachmentSize :: Attachment -> Integer
attachmentFilename :: Attachment -> Text
attachmentId :: Attachment -> AttachmentId
..} = [Pair] -> Value
object [(Text
name, Value
value) | (Text
name, Just Value
value) <-
      [ (Text
"id",        AttachmentId -> Value
forall a. ToJSON a => a -> Value
toJSON (AttachmentId -> Value) -> Maybe AttachmentId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AttachmentId -> Maybe AttachmentId
forall (f :: * -> *) a. Applicative f => a -> f a
pure AttachmentId
attachmentId)
      , (Text
"filename",  Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
attachmentFilename)
      , (Text
"size",      Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Integer -> Maybe Integer
forall (f :: * -> *) a. Applicative f => a -> f a
pure Integer
attachmentSize)
      , (Text
"url",       Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
attachmentUrl)
      , (Text
"proxy_url", Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
attachmentProxy)
      , (Text
"height",    Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>      Maybe Integer
attachmentHeight)
      , (Text
"width",     Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>      Maybe Integer
attachmentWidth)
      ] ]

newtype Nonce = Nonce T.Text
  deriving (Int -> Nonce -> ShowS
[Nonce] -> ShowS
Nonce -> String
(Int -> Nonce -> ShowS)
-> (Nonce -> String) -> ([Nonce] -> ShowS) -> Show Nonce
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Nonce] -> ShowS
$cshowList :: [Nonce] -> ShowS
show :: Nonce -> String
$cshow :: Nonce -> String
showsPrec :: Int -> Nonce -> ShowS
$cshowsPrec :: Int -> Nonce -> ShowS
Show, ReadPrec [Nonce]
ReadPrec Nonce
Int -> ReadS Nonce
ReadS [Nonce]
(Int -> ReadS Nonce)
-> ReadS [Nonce]
-> ReadPrec Nonce
-> ReadPrec [Nonce]
-> Read Nonce
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Nonce]
$creadListPrec :: ReadPrec [Nonce]
readPrec :: ReadPrec Nonce
$creadPrec :: ReadPrec Nonce
readList :: ReadS [Nonce]
$creadList :: ReadS [Nonce]
readsPrec :: Int -> ReadS Nonce
$creadsPrec :: Int -> ReadS Nonce
Read, Nonce -> Nonce -> Bool
(Nonce -> Nonce -> Bool) -> (Nonce -> Nonce -> Bool) -> Eq Nonce
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Nonce -> Nonce -> Bool
$c/= :: Nonce -> Nonce -> Bool
== :: Nonce -> Nonce -> Bool
$c== :: Nonce -> Nonce -> Bool
Eq, Eq Nonce
Eq Nonce
-> (Nonce -> Nonce -> Ordering)
-> (Nonce -> Nonce -> Bool)
-> (Nonce -> Nonce -> Bool)
-> (Nonce -> Nonce -> Bool)
-> (Nonce -> Nonce -> Bool)
-> (Nonce -> Nonce -> Nonce)
-> (Nonce -> Nonce -> Nonce)
-> Ord Nonce
Nonce -> Nonce -> Bool
Nonce -> Nonce -> Ordering
Nonce -> Nonce -> Nonce
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Nonce -> Nonce -> Nonce
$cmin :: Nonce -> Nonce -> Nonce
max :: Nonce -> Nonce -> Nonce
$cmax :: Nonce -> Nonce -> Nonce
>= :: Nonce -> Nonce -> Bool
$c>= :: Nonce -> Nonce -> Bool
> :: Nonce -> Nonce -> Bool
$c> :: Nonce -> Nonce -> Bool
<= :: Nonce -> Nonce -> Bool
$c<= :: Nonce -> Nonce -> Bool
< :: Nonce -> Nonce -> Bool
$c< :: Nonce -> Nonce -> Bool
compare :: Nonce -> Nonce -> Ordering
$ccompare :: Nonce -> Nonce -> Ordering
$cp1Ord :: Eq Nonce
Ord)

instance FromJSON Nonce where
  parseJSON :: Value -> Parser Nonce
parseJSON (String Text
nonce) = Nonce -> Parser Nonce
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Nonce -> Parser Nonce) -> Nonce -> Parser Nonce
forall a b. (a -> b) -> a -> b
$ Text -> Nonce
Nonce Text
nonce
  parseJSON (Number Scientific
nonce) = Nonce -> Parser Nonce
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Nonce -> Parser Nonce)
-> (Scientific -> Nonce) -> Scientific -> Parser Nonce
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Nonce
Nonce (Text -> Nonce) -> (Scientific -> Text) -> Scientific -> Nonce
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack (String -> Text) -> (Scientific -> String) -> Scientific -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scientific -> String
forall a. Show a => a -> String
show (Scientific -> Parser Nonce) -> Scientific -> Parser Nonce
forall a b. (a -> b) -> a -> b
$ Scientific
nonce
  parseJSON Value
_ = Parser Nonce
forall (f :: * -> *) a. Alternative f => f a
empty

instance ToJSON Nonce where
  toJSON :: Nonce -> Value
toJSON (Nonce Text
t) = Text -> Value
String Text
t


-- | Represents a Message Reference
data MessageReference = MessageReference
  { MessageReference -> Maybe MessageId
referenceMessageId      :: Maybe MessageId  -- ^ id of the originating message
  , MessageReference -> Maybe ChannelId
referenceChannelId      :: Maybe ChannelId  -- ^ id of the originating message's channel
  , MessageReference -> Maybe GuildId
referenceGuildId        :: Maybe GuildId    -- ^ id of the originating message's guild
  , MessageReference -> Bool
failIfNotExists         :: Bool             -- ^ Whether to not send if reference not exist
  } deriving (Int -> MessageReference -> ShowS
[MessageReference] -> ShowS
MessageReference -> String
(Int -> MessageReference -> ShowS)
-> (MessageReference -> String)
-> ([MessageReference] -> ShowS)
-> Show MessageReference
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MessageReference] -> ShowS
$cshowList :: [MessageReference] -> ShowS
show :: MessageReference -> String
$cshow :: MessageReference -> String
showsPrec :: Int -> MessageReference -> ShowS
$cshowsPrec :: Int -> MessageReference -> ShowS
Show, ReadPrec [MessageReference]
ReadPrec MessageReference
Int -> ReadS MessageReference
ReadS [MessageReference]
(Int -> ReadS MessageReference)
-> ReadS [MessageReference]
-> ReadPrec MessageReference
-> ReadPrec [MessageReference]
-> Read MessageReference
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [MessageReference]
$creadListPrec :: ReadPrec [MessageReference]
readPrec :: ReadPrec MessageReference
$creadPrec :: ReadPrec MessageReference
readList :: ReadS [MessageReference]
$creadList :: ReadS [MessageReference]
readsPrec :: Int -> ReadS MessageReference
$creadsPrec :: Int -> ReadS MessageReference
Read, MessageReference -> MessageReference -> Bool
(MessageReference -> MessageReference -> Bool)
-> (MessageReference -> MessageReference -> Bool)
-> Eq MessageReference
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MessageReference -> MessageReference -> Bool
$c/= :: MessageReference -> MessageReference -> Bool
== :: MessageReference -> MessageReference -> Bool
$c== :: MessageReference -> MessageReference -> Bool
Eq, Eq MessageReference
Eq MessageReference
-> (MessageReference -> MessageReference -> Ordering)
-> (MessageReference -> MessageReference -> Bool)
-> (MessageReference -> MessageReference -> Bool)
-> (MessageReference -> MessageReference -> Bool)
-> (MessageReference -> MessageReference -> Bool)
-> (MessageReference -> MessageReference -> MessageReference)
-> (MessageReference -> MessageReference -> MessageReference)
-> Ord MessageReference
MessageReference -> MessageReference -> Bool
MessageReference -> MessageReference -> Ordering
MessageReference -> MessageReference -> MessageReference
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: MessageReference -> MessageReference -> MessageReference
$cmin :: MessageReference -> MessageReference -> MessageReference
max :: MessageReference -> MessageReference -> MessageReference
$cmax :: MessageReference -> MessageReference -> MessageReference
>= :: MessageReference -> MessageReference -> Bool
$c>= :: MessageReference -> MessageReference -> Bool
> :: MessageReference -> MessageReference -> Bool
$c> :: MessageReference -> MessageReference -> Bool
<= :: MessageReference -> MessageReference -> Bool
$c<= :: MessageReference -> MessageReference -> Bool
< :: MessageReference -> MessageReference -> Bool
$c< :: MessageReference -> MessageReference -> Bool
compare :: MessageReference -> MessageReference -> Ordering
$ccompare :: MessageReference -> MessageReference -> Ordering
$cp1Ord :: Eq MessageReference
Ord)

instance FromJSON MessageReference where
  parseJSON :: Value -> Parser MessageReference
parseJSON = String
-> (Object -> Parser MessageReference)
-> Value
-> Parser MessageReference
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"MessageReference" ((Object -> Parser MessageReference)
 -> Value -> Parser MessageReference)
-> (Object -> Parser MessageReference)
-> Value
-> Parser MessageReference
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    Maybe MessageId
-> Maybe ChannelId -> Maybe GuildId -> Bool -> MessageReference
MessageReference (Maybe MessageId
 -> Maybe ChannelId -> Maybe GuildId -> Bool -> MessageReference)
-> Parser (Maybe MessageId)
-> Parser
     (Maybe ChannelId -> Maybe GuildId -> Bool -> MessageReference)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser (Maybe MessageId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"message_id"
                     Parser
  (Maybe ChannelId -> Maybe GuildId -> Bool -> MessageReference)
-> Parser (Maybe ChannelId)
-> Parser (Maybe GuildId -> Bool -> MessageReference)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ChannelId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"channel_id"
                     Parser (Maybe GuildId -> Bool -> MessageReference)
-> Parser (Maybe GuildId) -> Parser (Bool -> MessageReference)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe GuildId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"guild_id"
                     Parser (Bool -> MessageReference)
-> Parser Bool -> Parser MessageReference
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"fail_if_not_exists" Parser (Maybe Bool) -> Bool -> Parser Bool
forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
True

instance ToJSON MessageReference where
  toJSON :: MessageReference -> Value
toJSON MessageReference{Bool
Maybe MessageId
Maybe GuildId
Maybe ChannelId
failIfNotExists :: Bool
referenceGuildId :: Maybe GuildId
referenceChannelId :: Maybe ChannelId
referenceMessageId :: Maybe MessageId
failIfNotExists :: MessageReference -> Bool
referenceGuildId :: MessageReference -> Maybe GuildId
referenceChannelId :: MessageReference -> Maybe ChannelId
referenceMessageId :: MessageReference -> Maybe MessageId
..} = [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"message_id",     Maybe MessageId -> Value
forall a. ToJSON a => a -> Value
toJSON (Maybe MessageId -> Value)
-> Maybe (Maybe MessageId) -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe MessageId -> Maybe (Maybe MessageId)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe MessageId
referenceMessageId)
              , (Text
"channel_id", Maybe ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (Maybe ChannelId -> Value)
-> Maybe (Maybe ChannelId) -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ChannelId -> Maybe (Maybe ChannelId)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe ChannelId
referenceChannelId)
              , (Text
"guild_id",  Maybe GuildId -> Value
forall a. ToJSON a => a -> Value
toJSON (Maybe GuildId -> Value) -> Maybe (Maybe GuildId) -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe GuildId -> Maybe (Maybe GuildId)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe GuildId
referenceGuildId)
              , (Text
"fail_if_not_exists",   Bool -> Value
forall a. ToJSON a => a -> Value
toJSON (Bool -> Value) -> Maybe Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> Maybe Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
failIfNotExists)
              ] ]

instance Default MessageReference where
  def :: MessageReference
def = MessageReference :: Maybe MessageId
-> Maybe ChannelId -> Maybe GuildId -> Bool -> MessageReference
MessageReference { referenceMessageId :: Maybe MessageId
referenceMessageId = Maybe MessageId
forall a. Maybe a
Nothing
                         , referenceChannelId :: Maybe ChannelId
referenceChannelId = Maybe ChannelId
forall a. Maybe a
Nothing
                         , referenceGuildId :: Maybe GuildId
referenceGuildId   = Maybe GuildId
forall a. Maybe a
Nothing
                         , failIfNotExists :: Bool
failIfNotExists    = Bool
False
                         }


data MessageType
  = MessageTypeDefault
  | MessageTypeRecipientAdd
  | MessageTypeRecipientRemove
  | MessageTypeCall
  | MessageTypeChannelNameChange
  | MessageTypeChannelIconChange
  | MessageTypeChannelPinnedMessage
  | MessageTypeGuildMemberJoin
  | MessageTypeUserPremiumGuildSubscription
  | MessageTypeUserPremiumGuildSubscriptionTier1
  | MessageTypeUserPremiumGuildSubscriptionTier2
  | MessageTypeUserPremiumGuildSubscriptionTier3
  | MessageTypeChannelFollowAdd
  | MessageTypeGuildDiscoveryDisqualified
  | MessageTypeGuildDiscoveryRequalified
  | MessageTypeGuildDiscoveryGracePeriodInitialWarning
  | MessageTypeGuildDiscoveryGracePeriodFinalWarning
  | MessageTypeThreadCreated
  | MessageTypeReply
  | MessageTypeChatInputCommand
  | MessageTypeThreadStarterMessage
  | MessageTypeGuildInviteReminder
  | MessageTypeContextMenuCommand
  deriving (Int -> MessageType -> ShowS
[MessageType] -> ShowS
MessageType -> String
(Int -> MessageType -> ShowS)
-> (MessageType -> String)
-> ([MessageType] -> ShowS)
-> Show MessageType
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MessageType] -> ShowS
$cshowList :: [MessageType] -> ShowS
show :: MessageType -> String
$cshow :: MessageType -> String
showsPrec :: Int -> MessageType -> ShowS
$cshowsPrec :: Int -> MessageType -> ShowS
Show, ReadPrec [MessageType]
ReadPrec MessageType
Int -> ReadS MessageType
ReadS [MessageType]
(Int -> ReadS MessageType)
-> ReadS [MessageType]
-> ReadPrec MessageType
-> ReadPrec [MessageType]
-> Read MessageType
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [MessageType]
$creadListPrec :: ReadPrec [MessageType]
readPrec :: ReadPrec MessageType
$creadPrec :: ReadPrec MessageType
readList :: ReadS [MessageType]
$creadList :: ReadS [MessageType]
readsPrec :: Int -> ReadS MessageType
$creadsPrec :: Int -> ReadS MessageType
Read, Typeable MessageType
DataType
Constr
Typeable MessageType
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> MessageType -> c MessageType)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c MessageType)
-> (MessageType -> Constr)
-> (MessageType -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c MessageType))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c MessageType))
-> ((forall b. Data b => b -> b) -> MessageType -> MessageType)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> MessageType -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> MessageType -> r)
-> (forall u. (forall d. Data d => d -> u) -> MessageType -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> MessageType -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> MessageType -> m MessageType)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> MessageType -> m MessageType)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> MessageType -> m MessageType)
-> Data MessageType
MessageType -> DataType
MessageType -> Constr
(forall b. Data b => b -> b) -> MessageType -> MessageType
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MessageType -> c MessageType
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageType
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> MessageType -> u
forall u. (forall d. Data d => d -> u) -> MessageType -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> MessageType -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> MessageType -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> MessageType -> m MessageType
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> MessageType -> m MessageType
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageType
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MessageType -> c MessageType
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c MessageType)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MessageType)
$cMessageTypeContextMenuCommand :: Constr
$cMessageTypeGuildInviteReminder :: Constr
$cMessageTypeThreadStarterMessage :: Constr
$cMessageTypeChatInputCommand :: Constr
$cMessageTypeReply :: Constr
$cMessageTypeThreadCreated :: Constr
$cMessageTypeGuildDiscoveryGracePeriodFinalWarning :: Constr
$cMessageTypeGuildDiscoveryGracePeriodInitialWarning :: Constr
$cMessageTypeGuildDiscoveryRequalified :: Constr
$cMessageTypeGuildDiscoveryDisqualified :: Constr
$cMessageTypeChannelFollowAdd :: Constr
$cMessageTypeUserPremiumGuildSubscriptionTier3 :: Constr
$cMessageTypeUserPremiumGuildSubscriptionTier2 :: Constr
$cMessageTypeUserPremiumGuildSubscriptionTier1 :: Constr
$cMessageTypeUserPremiumGuildSubscription :: Constr
$cMessageTypeGuildMemberJoin :: Constr
$cMessageTypeChannelPinnedMessage :: Constr
$cMessageTypeChannelIconChange :: Constr
$cMessageTypeChannelNameChange :: Constr
$cMessageTypeCall :: Constr
$cMessageTypeRecipientRemove :: Constr
$cMessageTypeRecipientAdd :: Constr
$cMessageTypeDefault :: Constr
$tMessageType :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> MessageType -> m MessageType
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> MessageType -> m MessageType
gmapMp :: (forall d. Data d => d -> m d) -> MessageType -> m MessageType
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> MessageType -> m MessageType
gmapM :: (forall d. Data d => d -> m d) -> MessageType -> m MessageType
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> MessageType -> m MessageType
gmapQi :: Int -> (forall d. Data d => d -> u) -> MessageType -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> MessageType -> u
gmapQ :: (forall d. Data d => d -> u) -> MessageType -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> MessageType -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> MessageType -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> MessageType -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> MessageType -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> MessageType -> r
gmapT :: (forall b. Data b => b -> b) -> MessageType -> MessageType
$cgmapT :: (forall b. Data b => b -> b) -> MessageType -> MessageType
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MessageType)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MessageType)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c MessageType)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c MessageType)
dataTypeOf :: MessageType -> DataType
$cdataTypeOf :: MessageType -> DataType
toConstr :: MessageType -> Constr
$ctoConstr :: MessageType -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageType
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageType
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MessageType -> c MessageType
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MessageType -> c MessageType
$cp1Data :: Typeable MessageType
Data, MessageType -> MessageType -> Bool
(MessageType -> MessageType -> Bool)
-> (MessageType -> MessageType -> Bool) -> Eq MessageType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MessageType -> MessageType -> Bool
$c/= :: MessageType -> MessageType -> Bool
== :: MessageType -> MessageType -> Bool
$c== :: MessageType -> MessageType -> Bool
Eq, Eq MessageType
Eq MessageType
-> (MessageType -> MessageType -> Ordering)
-> (MessageType -> MessageType -> Bool)
-> (MessageType -> MessageType -> Bool)
-> (MessageType -> MessageType -> Bool)
-> (MessageType -> MessageType -> Bool)
-> (MessageType -> MessageType -> MessageType)
-> (MessageType -> MessageType -> MessageType)
-> Ord MessageType
MessageType -> MessageType -> Bool
MessageType -> MessageType -> Ordering
MessageType -> MessageType -> MessageType
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: MessageType -> MessageType -> MessageType
$cmin :: MessageType -> MessageType -> MessageType
max :: MessageType -> MessageType -> MessageType
$cmax :: MessageType -> MessageType -> MessageType
>= :: MessageType -> MessageType -> Bool
$c>= :: MessageType -> MessageType -> Bool
> :: MessageType -> MessageType -> Bool
$c> :: MessageType -> MessageType -> Bool
<= :: MessageType -> MessageType -> Bool
$c<= :: MessageType -> MessageType -> Bool
< :: MessageType -> MessageType -> Bool
$c< :: MessageType -> MessageType -> Bool
compare :: MessageType -> MessageType -> Ordering
$ccompare :: MessageType -> MessageType -> Ordering
$cp1Ord :: Eq MessageType
Ord)

instance InternalDiscordEnum MessageType where
  discordTypeStartValue :: MessageType
discordTypeStartValue = MessageType
MessageTypeDefault
  fromDiscordType :: MessageType -> Int
fromDiscordType MessageType
MessageTypeDefault = Int
0
  fromDiscordType MessageType
MessageTypeRecipientAdd = Int
1
  fromDiscordType MessageType
MessageTypeRecipientRemove = Int
2
  fromDiscordType MessageType
MessageTypeCall = Int
3
  fromDiscordType MessageType
MessageTypeChannelNameChange = Int
4
  fromDiscordType MessageType
MessageTypeChannelIconChange = Int
5
  fromDiscordType MessageType
MessageTypeChannelPinnedMessage = Int
6
  fromDiscordType MessageType
MessageTypeGuildMemberJoin = Int
7
  fromDiscordType MessageType
MessageTypeUserPremiumGuildSubscription = Int
8
  fromDiscordType MessageType
MessageTypeUserPremiumGuildSubscriptionTier1 = Int
9
  fromDiscordType MessageType
MessageTypeUserPremiumGuildSubscriptionTier2 = Int
10
  fromDiscordType MessageType
MessageTypeUserPremiumGuildSubscriptionTier3 = Int
11
  fromDiscordType MessageType
MessageTypeChannelFollowAdd = Int
12
  fromDiscordType MessageType
MessageTypeGuildDiscoveryDisqualified = Int
14
  fromDiscordType MessageType
MessageTypeGuildDiscoveryRequalified = Int
15
  fromDiscordType MessageType
MessageTypeGuildDiscoveryGracePeriodInitialWarning = Int
16
  fromDiscordType MessageType
MessageTypeGuildDiscoveryGracePeriodFinalWarning = Int
17
  fromDiscordType MessageType
MessageTypeThreadCreated = Int
18
  fromDiscordType MessageType
MessageTypeReply = Int
19
  fromDiscordType MessageType
MessageTypeChatInputCommand = Int
20
  fromDiscordType MessageType
MessageTypeThreadStarterMessage = Int
21
  fromDiscordType MessageType
MessageTypeGuildInviteReminder = Int
22
  fromDiscordType MessageType
MessageTypeContextMenuCommand = Int
23

instance ToJSON MessageType where
  toJSON :: MessageType -> Value
toJSON = Int -> Value
forall a. ToJSON a => a -> Value
toJSON (Int -> Value) -> (MessageType -> Int) -> MessageType -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MessageType -> Int
forall a. InternalDiscordEnum a => a -> Int
fromDiscordType

instance FromJSON MessageType where
  parseJSON :: Value -> Parser MessageType
parseJSON = String -> Value -> Parser MessageType
forall a. InternalDiscordEnum a => String -> Value -> Parser a
discordTypeParseJSON String
"MessageType"

data MessageActivity = MessageActivity
  { MessageActivity -> MessageActivityType
messageActivityType :: MessageActivityType
  , MessageActivity -> Maybe Text
messageActivityPartyId :: Maybe T.Text
  }
  deriving (Int -> MessageActivity -> ShowS
[MessageActivity] -> ShowS
MessageActivity -> String
(Int -> MessageActivity -> ShowS)
-> (MessageActivity -> String)
-> ([MessageActivity] -> ShowS)
-> Show MessageActivity
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MessageActivity] -> ShowS
$cshowList :: [MessageActivity] -> ShowS
show :: MessageActivity -> String
$cshow :: MessageActivity -> String
showsPrec :: Int -> MessageActivity -> ShowS
$cshowsPrec :: Int -> MessageActivity -> ShowS
Show, ReadPrec [MessageActivity]
ReadPrec MessageActivity
Int -> ReadS MessageActivity
ReadS [MessageActivity]
(Int -> ReadS MessageActivity)
-> ReadS [MessageActivity]
-> ReadPrec MessageActivity
-> ReadPrec [MessageActivity]
-> Read MessageActivity
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [MessageActivity]
$creadListPrec :: ReadPrec [MessageActivity]
readPrec :: ReadPrec MessageActivity
$creadPrec :: ReadPrec MessageActivity
readList :: ReadS [MessageActivity]
$creadList :: ReadS [MessageActivity]
readsPrec :: Int -> ReadS MessageActivity
$creadsPrec :: Int -> ReadS MessageActivity
Read, Typeable MessageActivity
DataType
Constr
Typeable MessageActivity
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> MessageActivity -> c MessageActivity)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c MessageActivity)
-> (MessageActivity -> Constr)
-> (MessageActivity -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c MessageActivity))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c MessageActivity))
-> ((forall b. Data b => b -> b)
    -> MessageActivity -> MessageActivity)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> MessageActivity -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> MessageActivity -> r)
-> (forall u.
    (forall d. Data d => d -> u) -> MessageActivity -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> MessageActivity -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d)
    -> MessageActivity -> m MessageActivity)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d)
    -> MessageActivity -> m MessageActivity)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d)
    -> MessageActivity -> m MessageActivity)
-> Data MessageActivity
MessageActivity -> DataType
MessageActivity -> Constr
(forall b. Data b => b -> b) -> MessageActivity -> MessageActivity
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MessageActivity -> c MessageActivity
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageActivity
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u.
Int -> (forall d. Data d => d -> u) -> MessageActivity -> u
forall u. (forall d. Data d => d -> u) -> MessageActivity -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> MessageActivity -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> MessageActivity -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> MessageActivity -> m MessageActivity
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> MessageActivity -> m MessageActivity
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageActivity
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MessageActivity -> c MessageActivity
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c MessageActivity)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MessageActivity)
$cMessageActivity :: Constr
$tMessageActivity :: DataType
gmapMo :: (forall d. Data d => d -> m d)
-> MessageActivity -> m MessageActivity
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> MessageActivity -> m MessageActivity
gmapMp :: (forall d. Data d => d -> m d)
-> MessageActivity -> m MessageActivity
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> MessageActivity -> m MessageActivity
gmapM :: (forall d. Data d => d -> m d)
-> MessageActivity -> m MessageActivity
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> MessageActivity -> m MessageActivity
gmapQi :: Int -> (forall d. Data d => d -> u) -> MessageActivity -> u
$cgmapQi :: forall u.
Int -> (forall d. Data d => d -> u) -> MessageActivity -> u
gmapQ :: (forall d. Data d => d -> u) -> MessageActivity -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> MessageActivity -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> MessageActivity -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> MessageActivity -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> MessageActivity -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> MessageActivity -> r
gmapT :: (forall b. Data b => b -> b) -> MessageActivity -> MessageActivity
$cgmapT :: (forall b. Data b => b -> b) -> MessageActivity -> MessageActivity
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MessageActivity)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MessageActivity)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c MessageActivity)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c MessageActivity)
dataTypeOf :: MessageActivity -> DataType
$cdataTypeOf :: MessageActivity -> DataType
toConstr :: MessageActivity -> Constr
$ctoConstr :: MessageActivity -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageActivity
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageActivity
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MessageActivity -> c MessageActivity
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MessageActivity -> c MessageActivity
$cp1Data :: Typeable MessageActivity
Data, MessageActivity -> MessageActivity -> Bool
(MessageActivity -> MessageActivity -> Bool)
-> (MessageActivity -> MessageActivity -> Bool)
-> Eq MessageActivity
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MessageActivity -> MessageActivity -> Bool
$c/= :: MessageActivity -> MessageActivity -> Bool
== :: MessageActivity -> MessageActivity -> Bool
$c== :: MessageActivity -> MessageActivity -> Bool
Eq, Eq MessageActivity
Eq MessageActivity
-> (MessageActivity -> MessageActivity -> Ordering)
-> (MessageActivity -> MessageActivity -> Bool)
-> (MessageActivity -> MessageActivity -> Bool)
-> (MessageActivity -> MessageActivity -> Bool)
-> (MessageActivity -> MessageActivity -> Bool)
-> (MessageActivity -> MessageActivity -> MessageActivity)
-> (MessageActivity -> MessageActivity -> MessageActivity)
-> Ord MessageActivity
MessageActivity -> MessageActivity -> Bool
MessageActivity -> MessageActivity -> Ordering
MessageActivity -> MessageActivity -> MessageActivity
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: MessageActivity -> MessageActivity -> MessageActivity
$cmin :: MessageActivity -> MessageActivity -> MessageActivity
max :: MessageActivity -> MessageActivity -> MessageActivity
$cmax :: MessageActivity -> MessageActivity -> MessageActivity
>= :: MessageActivity -> MessageActivity -> Bool
$c>= :: MessageActivity -> MessageActivity -> Bool
> :: MessageActivity -> MessageActivity -> Bool
$c> :: MessageActivity -> MessageActivity -> Bool
<= :: MessageActivity -> MessageActivity -> Bool
$c<= :: MessageActivity -> MessageActivity -> Bool
< :: MessageActivity -> MessageActivity -> Bool
$c< :: MessageActivity -> MessageActivity -> Bool
compare :: MessageActivity -> MessageActivity -> Ordering
$ccompare :: MessageActivity -> MessageActivity -> Ordering
$cp1Ord :: Eq MessageActivity
Ord)

instance FromJSON MessageActivity where
  parseJSON :: Value -> Parser MessageActivity
parseJSON = String
-> (Object -> Parser MessageActivity)
-> Value
-> Parser MessageActivity
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"MessageActivity" ((Object -> Parser MessageActivity)
 -> Value -> Parser MessageActivity)
-> (Object -> Parser MessageActivity)
-> Value
-> Parser MessageActivity
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    MessageActivityType -> Maybe Text -> MessageActivity
MessageActivity (MessageActivityType -> Maybe Text -> MessageActivity)
-> Parser MessageActivityType
-> Parser (Maybe Text -> MessageActivity)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser MessageActivityType
forall a. FromJSON a => Object -> Text -> Parser a
.:   Text
"type"
                     Parser (Maybe Text -> MessageActivity)
-> Parser (Maybe Text) -> Parser MessageActivity
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"party_id"

instance ToJSON MessageActivity where
  toJSON :: MessageActivity -> Value
toJSON MessageActivity{Maybe Text
MessageActivityType
messageActivityPartyId :: Maybe Text
messageActivityType :: MessageActivityType
messageActivityPartyId :: MessageActivity -> Maybe Text
messageActivityType :: MessageActivity -> MessageActivityType
..} = [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"type",     MessageActivityType -> Value
forall a. ToJSON a => a -> Value
toJSON (MessageActivityType -> Value)
-> Maybe MessageActivityType -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MessageActivityType -> Maybe MessageActivityType
forall (f :: * -> *) a. Applicative f => a -> f a
pure MessageActivityType
messageActivityType)
              , (Text
"party_id", Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>      Maybe Text
messageActivityPartyId)
              ] ]

data MessageActivityType
  = MessageActivityTypeJoin -- ^ Join a Rich Presence event
  | MessageActivityTypeSpectate -- ^ Spectate a Rich Presence event
  | MessageActivityTypeListen -- ^ Listen to a Rich Presence event
  | MessageActivityTypeJoinRequest -- ^ Request to join a Rich Presence event
  deriving (Int -> MessageActivityType -> ShowS
[MessageActivityType] -> ShowS
MessageActivityType -> String
(Int -> MessageActivityType -> ShowS)
-> (MessageActivityType -> String)
-> ([MessageActivityType] -> ShowS)
-> Show MessageActivityType
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MessageActivityType] -> ShowS
$cshowList :: [MessageActivityType] -> ShowS
show :: MessageActivityType -> String
$cshow :: MessageActivityType -> String
showsPrec :: Int -> MessageActivityType -> ShowS
$cshowsPrec :: Int -> MessageActivityType -> ShowS
Show, ReadPrec [MessageActivityType]
ReadPrec MessageActivityType
Int -> ReadS MessageActivityType
ReadS [MessageActivityType]
(Int -> ReadS MessageActivityType)
-> ReadS [MessageActivityType]
-> ReadPrec MessageActivityType
-> ReadPrec [MessageActivityType]
-> Read MessageActivityType
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [MessageActivityType]
$creadListPrec :: ReadPrec [MessageActivityType]
readPrec :: ReadPrec MessageActivityType
$creadPrec :: ReadPrec MessageActivityType
readList :: ReadS [MessageActivityType]
$creadList :: ReadS [MessageActivityType]
readsPrec :: Int -> ReadS MessageActivityType
$creadsPrec :: Int -> ReadS MessageActivityType
Read, Typeable MessageActivityType
DataType
Constr
Typeable MessageActivityType
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g)
    -> MessageActivityType
    -> c MessageActivityType)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c MessageActivityType)
-> (MessageActivityType -> Constr)
-> (MessageActivityType -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c MessageActivityType))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c MessageActivityType))
-> ((forall b. Data b => b -> b)
    -> MessageActivityType -> MessageActivityType)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> MessageActivityType -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> MessageActivityType -> r)
-> (forall u.
    (forall d. Data d => d -> u) -> MessageActivityType -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> MessageActivityType -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d)
    -> MessageActivityType -> m MessageActivityType)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d)
    -> MessageActivityType -> m MessageActivityType)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d)
    -> MessageActivityType -> m MessageActivityType)
-> Data MessageActivityType
MessageActivityType -> DataType
MessageActivityType -> Constr
(forall b. Data b => b -> b)
-> MessageActivityType -> MessageActivityType
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g)
-> MessageActivityType
-> c MessageActivityType
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageActivityType
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u.
Int -> (forall d. Data d => d -> u) -> MessageActivityType -> u
forall u.
(forall d. Data d => d -> u) -> MessageActivityType -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> MessageActivityType -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> MessageActivityType -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> MessageActivityType -> m MessageActivityType
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> MessageActivityType -> m MessageActivityType
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageActivityType
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g)
-> MessageActivityType
-> c MessageActivityType
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c MessageActivityType)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MessageActivityType)
$cMessageActivityTypeJoinRequest :: Constr
$cMessageActivityTypeListen :: Constr
$cMessageActivityTypeSpectate :: Constr
$cMessageActivityTypeJoin :: Constr
$tMessageActivityType :: DataType
gmapMo :: (forall d. Data d => d -> m d)
-> MessageActivityType -> m MessageActivityType
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> MessageActivityType -> m MessageActivityType
gmapMp :: (forall d. Data d => d -> m d)
-> MessageActivityType -> m MessageActivityType
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> MessageActivityType -> m MessageActivityType
gmapM :: (forall d. Data d => d -> m d)
-> MessageActivityType -> m MessageActivityType
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> MessageActivityType -> m MessageActivityType
gmapQi :: Int -> (forall d. Data d => d -> u) -> MessageActivityType -> u
$cgmapQi :: forall u.
Int -> (forall d. Data d => d -> u) -> MessageActivityType -> u
gmapQ :: (forall d. Data d => d -> u) -> MessageActivityType -> [u]
$cgmapQ :: forall u.
(forall d. Data d => d -> u) -> MessageActivityType -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> MessageActivityType -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> MessageActivityType -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> MessageActivityType -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> MessageActivityType -> r
gmapT :: (forall b. Data b => b -> b)
-> MessageActivityType -> MessageActivityType
$cgmapT :: (forall b. Data b => b -> b)
-> MessageActivityType -> MessageActivityType
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MessageActivityType)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MessageActivityType)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c MessageActivityType)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c MessageActivityType)
dataTypeOf :: MessageActivityType -> DataType
$cdataTypeOf :: MessageActivityType -> DataType
toConstr :: MessageActivityType -> Constr
$ctoConstr :: MessageActivityType -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageActivityType
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageActivityType
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g)
-> MessageActivityType
-> c MessageActivityType
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g)
-> MessageActivityType
-> c MessageActivityType
$cp1Data :: Typeable MessageActivityType
Data, MessageActivityType -> MessageActivityType -> Bool
(MessageActivityType -> MessageActivityType -> Bool)
-> (MessageActivityType -> MessageActivityType -> Bool)
-> Eq MessageActivityType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MessageActivityType -> MessageActivityType -> Bool
$c/= :: MessageActivityType -> MessageActivityType -> Bool
== :: MessageActivityType -> MessageActivityType -> Bool
$c== :: MessageActivityType -> MessageActivityType -> Bool
Eq, Eq MessageActivityType
Eq MessageActivityType
-> (MessageActivityType -> MessageActivityType -> Ordering)
-> (MessageActivityType -> MessageActivityType -> Bool)
-> (MessageActivityType -> MessageActivityType -> Bool)
-> (MessageActivityType -> MessageActivityType -> Bool)
-> (MessageActivityType -> MessageActivityType -> Bool)
-> (MessageActivityType
    -> MessageActivityType -> MessageActivityType)
-> (MessageActivityType
    -> MessageActivityType -> MessageActivityType)
-> Ord MessageActivityType
MessageActivityType -> MessageActivityType -> Bool
MessageActivityType -> MessageActivityType -> Ordering
MessageActivityType -> MessageActivityType -> MessageActivityType
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: MessageActivityType -> MessageActivityType -> MessageActivityType
$cmin :: MessageActivityType -> MessageActivityType -> MessageActivityType
max :: MessageActivityType -> MessageActivityType -> MessageActivityType
$cmax :: MessageActivityType -> MessageActivityType -> MessageActivityType
>= :: MessageActivityType -> MessageActivityType -> Bool
$c>= :: MessageActivityType -> MessageActivityType -> Bool
> :: MessageActivityType -> MessageActivityType -> Bool
$c> :: MessageActivityType -> MessageActivityType -> Bool
<= :: MessageActivityType -> MessageActivityType -> Bool
$c<= :: MessageActivityType -> MessageActivityType -> Bool
< :: MessageActivityType -> MessageActivityType -> Bool
$c< :: MessageActivityType -> MessageActivityType -> Bool
compare :: MessageActivityType -> MessageActivityType -> Ordering
$ccompare :: MessageActivityType -> MessageActivityType -> Ordering
$cp1Ord :: Eq MessageActivityType
Ord)

instance InternalDiscordEnum MessageActivityType where
  discordTypeStartValue :: MessageActivityType
discordTypeStartValue = MessageActivityType
MessageActivityTypeJoin
  fromDiscordType :: MessageActivityType -> Int
fromDiscordType MessageActivityType
MessageActivityTypeJoin = Int
1
  fromDiscordType MessageActivityType
MessageActivityTypeSpectate = Int
2
  fromDiscordType MessageActivityType
MessageActivityTypeListen = Int
3
  fromDiscordType MessageActivityType
MessageActivityTypeJoinRequest = Int
4

instance ToJSON MessageActivityType where
  toJSON :: MessageActivityType -> Value
toJSON = Int -> Value
forall a. ToJSON a => a -> Value
toJSON (Int -> Value)
-> (MessageActivityType -> Int) -> MessageActivityType -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MessageActivityType -> Int
forall a. InternalDiscordEnum a => a -> Int
fromDiscordType

instance FromJSON MessageActivityType where
  parseJSON :: Value -> Parser MessageActivityType
parseJSON = String -> Value -> Parser MessageActivityType
forall a. InternalDiscordEnum a => String -> Value -> Parser a
discordTypeParseJSON String
"MessageActivityType"

-- | Types of flags to attach to the message.
data MessageFlag =
    MessageFlagCrossposted
  | MessageFlagIsCrosspost
  | MessageFlagSupressEmbeds
  | MessageFlagSourceMessageDeleted
  | MessageFlagUrgent
  | MessageFlagHasThread
  | MessageFlagEphemeral
  | MessageFlagLoading
  | MessageFlagFailedToMentionRollesInThread
  deriving (Int -> MessageFlag -> ShowS
[MessageFlag] -> ShowS
MessageFlag -> String
(Int -> MessageFlag -> ShowS)
-> (MessageFlag -> String)
-> ([MessageFlag] -> ShowS)
-> Show MessageFlag
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MessageFlag] -> ShowS
$cshowList :: [MessageFlag] -> ShowS
show :: MessageFlag -> String
$cshow :: MessageFlag -> String
showsPrec :: Int -> MessageFlag -> ShowS
$cshowsPrec :: Int -> MessageFlag -> ShowS
Show, ReadPrec [MessageFlag]
ReadPrec MessageFlag
Int -> ReadS MessageFlag
ReadS [MessageFlag]
(Int -> ReadS MessageFlag)
-> ReadS [MessageFlag]
-> ReadPrec MessageFlag
-> ReadPrec [MessageFlag]
-> Read MessageFlag
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [MessageFlag]
$creadListPrec :: ReadPrec [MessageFlag]
readPrec :: ReadPrec MessageFlag
$creadPrec :: ReadPrec MessageFlag
readList :: ReadS [MessageFlag]
$creadList :: ReadS [MessageFlag]
readsPrec :: Int -> ReadS MessageFlag
$creadsPrec :: Int -> ReadS MessageFlag
Read, MessageFlag -> MessageFlag -> Bool
(MessageFlag -> MessageFlag -> Bool)
-> (MessageFlag -> MessageFlag -> Bool) -> Eq MessageFlag
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MessageFlag -> MessageFlag -> Bool
$c/= :: MessageFlag -> MessageFlag -> Bool
== :: MessageFlag -> MessageFlag -> Bool
$c== :: MessageFlag -> MessageFlag -> Bool
Eq, Typeable MessageFlag
DataType
Constr
Typeable MessageFlag
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> MessageFlag -> c MessageFlag)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c MessageFlag)
-> (MessageFlag -> Constr)
-> (MessageFlag -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c MessageFlag))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c MessageFlag))
-> ((forall b. Data b => b -> b) -> MessageFlag -> MessageFlag)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> MessageFlag -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> MessageFlag -> r)
-> (forall u. (forall d. Data d => d -> u) -> MessageFlag -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> MessageFlag -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> MessageFlag -> m MessageFlag)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> MessageFlag -> m MessageFlag)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> MessageFlag -> m MessageFlag)
-> Data MessageFlag
MessageFlag -> DataType
MessageFlag -> Constr
(forall b. Data b => b -> b) -> MessageFlag -> MessageFlag
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MessageFlag -> c MessageFlag
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageFlag
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> MessageFlag -> u
forall u. (forall d. Data d => d -> u) -> MessageFlag -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> MessageFlag -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> MessageFlag -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> MessageFlag -> m MessageFlag
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> MessageFlag -> m MessageFlag
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageFlag
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MessageFlag -> c MessageFlag
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c MessageFlag)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MessageFlag)
$cMessageFlagFailedToMentionRollesInThread :: Constr
$cMessageFlagLoading :: Constr
$cMessageFlagEphemeral :: Constr
$cMessageFlagHasThread :: Constr
$cMessageFlagUrgent :: Constr
$cMessageFlagSourceMessageDeleted :: Constr
$cMessageFlagSupressEmbeds :: Constr
$cMessageFlagIsCrosspost :: Constr
$cMessageFlagCrossposted :: Constr
$tMessageFlag :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> MessageFlag -> m MessageFlag
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> MessageFlag -> m MessageFlag
gmapMp :: (forall d. Data d => d -> m d) -> MessageFlag -> m MessageFlag
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> MessageFlag -> m MessageFlag
gmapM :: (forall d. Data d => d -> m d) -> MessageFlag -> m MessageFlag
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> MessageFlag -> m MessageFlag
gmapQi :: Int -> (forall d. Data d => d -> u) -> MessageFlag -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> MessageFlag -> u
gmapQ :: (forall d. Data d => d -> u) -> MessageFlag -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> MessageFlag -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> MessageFlag -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> MessageFlag -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> MessageFlag -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> MessageFlag -> r
gmapT :: (forall b. Data b => b -> b) -> MessageFlag -> MessageFlag
$cgmapT :: (forall b. Data b => b -> b) -> MessageFlag -> MessageFlag
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MessageFlag)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MessageFlag)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c MessageFlag)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c MessageFlag)
dataTypeOf :: MessageFlag -> DataType
$cdataTypeOf :: MessageFlag -> DataType
toConstr :: MessageFlag -> Constr
$ctoConstr :: MessageFlag -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageFlag
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageFlag
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MessageFlag -> c MessageFlag
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MessageFlag -> c MessageFlag
$cp1Data :: Typeable MessageFlag
Data, Eq MessageFlag
Eq MessageFlag
-> (MessageFlag -> MessageFlag -> Ordering)
-> (MessageFlag -> MessageFlag -> Bool)
-> (MessageFlag -> MessageFlag -> Bool)
-> (MessageFlag -> MessageFlag -> Bool)
-> (MessageFlag -> MessageFlag -> Bool)
-> (MessageFlag -> MessageFlag -> MessageFlag)
-> (MessageFlag -> MessageFlag -> MessageFlag)
-> Ord MessageFlag
MessageFlag -> MessageFlag -> Bool
MessageFlag -> MessageFlag -> Ordering
MessageFlag -> MessageFlag -> MessageFlag
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: MessageFlag -> MessageFlag -> MessageFlag
$cmin :: MessageFlag -> MessageFlag -> MessageFlag
max :: MessageFlag -> MessageFlag -> MessageFlag
$cmax :: MessageFlag -> MessageFlag -> MessageFlag
>= :: MessageFlag -> MessageFlag -> Bool
$c>= :: MessageFlag -> MessageFlag -> Bool
> :: MessageFlag -> MessageFlag -> Bool
$c> :: MessageFlag -> MessageFlag -> Bool
<= :: MessageFlag -> MessageFlag -> Bool
$c<= :: MessageFlag -> MessageFlag -> Bool
< :: MessageFlag -> MessageFlag -> Bool
$c< :: MessageFlag -> MessageFlag -> Bool
compare :: MessageFlag -> MessageFlag -> Ordering
$ccompare :: MessageFlag -> MessageFlag -> Ordering
$cp1Ord :: Eq MessageFlag
Ord)

newtype MessageFlags = MessageFlags [MessageFlag]
  deriving (Int -> MessageFlags -> ShowS
[MessageFlags] -> ShowS
MessageFlags -> String
(Int -> MessageFlags -> ShowS)
-> (MessageFlags -> String)
-> ([MessageFlags] -> ShowS)
-> Show MessageFlags
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MessageFlags] -> ShowS
$cshowList :: [MessageFlags] -> ShowS
show :: MessageFlags -> String
$cshow :: MessageFlags -> String
showsPrec :: Int -> MessageFlags -> ShowS
$cshowsPrec :: Int -> MessageFlags -> ShowS
Show, ReadPrec [MessageFlags]
ReadPrec MessageFlags
Int -> ReadS MessageFlags
ReadS [MessageFlags]
(Int -> ReadS MessageFlags)
-> ReadS [MessageFlags]
-> ReadPrec MessageFlags
-> ReadPrec [MessageFlags]
-> Read MessageFlags
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [MessageFlags]
$creadListPrec :: ReadPrec [MessageFlags]
readPrec :: ReadPrec MessageFlags
$creadPrec :: ReadPrec MessageFlags
readList :: ReadS [MessageFlags]
$creadList :: ReadS [MessageFlags]
readsPrec :: Int -> ReadS MessageFlags
$creadsPrec :: Int -> ReadS MessageFlags
Read, MessageFlags -> MessageFlags -> Bool
(MessageFlags -> MessageFlags -> Bool)
-> (MessageFlags -> MessageFlags -> Bool) -> Eq MessageFlags
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MessageFlags -> MessageFlags -> Bool
$c/= :: MessageFlags -> MessageFlags -> Bool
== :: MessageFlags -> MessageFlags -> Bool
$c== :: MessageFlags -> MessageFlags -> Bool
Eq, Eq MessageFlags
Eq MessageFlags
-> (MessageFlags -> MessageFlags -> Ordering)
-> (MessageFlags -> MessageFlags -> Bool)
-> (MessageFlags -> MessageFlags -> Bool)
-> (MessageFlags -> MessageFlags -> Bool)
-> (MessageFlags -> MessageFlags -> Bool)
-> (MessageFlags -> MessageFlags -> MessageFlags)
-> (MessageFlags -> MessageFlags -> MessageFlags)
-> Ord MessageFlags
MessageFlags -> MessageFlags -> Bool
MessageFlags -> MessageFlags -> Ordering
MessageFlags -> MessageFlags -> MessageFlags
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: MessageFlags -> MessageFlags -> MessageFlags
$cmin :: MessageFlags -> MessageFlags -> MessageFlags
max :: MessageFlags -> MessageFlags -> MessageFlags
$cmax :: MessageFlags -> MessageFlags -> MessageFlags
>= :: MessageFlags -> MessageFlags -> Bool
$c>= :: MessageFlags -> MessageFlags -> Bool
> :: MessageFlags -> MessageFlags -> Bool
$c> :: MessageFlags -> MessageFlags -> Bool
<= :: MessageFlags -> MessageFlags -> Bool
$c<= :: MessageFlags -> MessageFlags -> Bool
< :: MessageFlags -> MessageFlags -> Bool
$c< :: MessageFlags -> MessageFlags -> Bool
compare :: MessageFlags -> MessageFlags -> Ordering
$ccompare :: MessageFlags -> MessageFlags -> Ordering
$cp1Ord :: Eq MessageFlags
Ord)

instance InternalDiscordEnum MessageFlag where
  discordTypeStartValue :: MessageFlag
discordTypeStartValue = MessageFlag
MessageFlagCrossposted
  fromDiscordType :: MessageFlag -> Int
fromDiscordType MessageFlag
MessageFlagCrossposted = Int
1 Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shift` Int
0
  fromDiscordType MessageFlag
MessageFlagIsCrosspost = Int
1 Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shift` Int
1
  fromDiscordType MessageFlag
MessageFlagSupressEmbeds = Int
1 Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shift` Int
2
  fromDiscordType MessageFlag
MessageFlagSourceMessageDeleted = Int
1 Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shift` Int
3
  fromDiscordType MessageFlag
MessageFlagUrgent = Int
1 Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shift` Int
4
  fromDiscordType MessageFlag
MessageFlagHasThread = Int
1 Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shift` Int
5
  fromDiscordType MessageFlag
MessageFlagEphemeral = Int
1 Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shift` Int
6
  fromDiscordType MessageFlag
MessageFlagLoading = Int
1 Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shift` Int
7
  fromDiscordType MessageFlag
MessageFlagFailedToMentionRollesInThread = Int
1 Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shift` Int
8

instance ToJSON MessageFlags where
  toJSON :: MessageFlags -> Value
toJSON (MessageFlags [MessageFlag]
fs) = Scientific -> Value
Number (Scientific -> Value) -> Scientific -> Value
forall a b. (a -> b) -> a -> b
$ Integer -> Scientific
forall a. Num a => Integer -> a
fromInteger (Integer -> Scientific) -> Integer -> Scientific
forall a b. (a -> b) -> a -> b
$ Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$ (Int -> Int -> Int) -> Int -> [Int] -> Int
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Int -> Int -> Int
forall a. Bits a => a -> a -> a
(.|.) Int
0 (MessageFlag -> Int
forall a. InternalDiscordEnum a => a -> Int
fromDiscordType (MessageFlag -> Int) -> [MessageFlag] -> [Int]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [MessageFlag]
fs)

-- TODO: maybe make this a type class or something - the ability to handle flags automatically would be Very Good.

instance FromJSON MessageFlags where
  parseJSON :: Value -> Parser MessageFlags
parseJSON = String
-> (Scientific -> Parser MessageFlags)
-> Value
-> Parser MessageFlags
forall a. String -> (Scientific -> Parser a) -> Value -> Parser a
withScientific String
"MessageFlags" ((Scientific -> Parser MessageFlags)
 -> Value -> Parser MessageFlags)
-> (Scientific -> Parser MessageFlags)
-> Value
-> Parser MessageFlags
forall a b. (a -> b) -> a -> b
$ \Scientific
s ->
      let i :: Int
i = Scientific -> Int
forall a b. (RealFrac a, Integral b) => a -> b
round Scientific
s
          -- TODO check to see that we know about all the flags
          -- if i /= (i .&. range)
          -- range = sum $ fst <$> (discordTypeTable @MessageFlag)
      in MessageFlags -> Parser MessageFlags
forall (m :: * -> *) a. Monad m => a -> m a
return (MessageFlags -> Parser MessageFlags)
-> MessageFlags -> Parser MessageFlags
forall a b. (a -> b) -> a -> b
$ [MessageFlag] -> MessageFlags
MessageFlags ((Int, MessageFlag) -> MessageFlag
forall a b. (a, b) -> b
snd ((Int, MessageFlag) -> MessageFlag)
-> [(Int, MessageFlag)] -> [MessageFlag]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((Int, MessageFlag) -> Bool)
-> [(Int, MessageFlag)] -> [(Int, MessageFlag)]
forall a. (a -> Bool) -> [a] -> [a]
filter (\(Int
i',MessageFlag
_) -> Int
i Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
i' Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
i') [(Int, MessageFlag)]
forall a. InternalDiscordEnum a => [(Int, a)]
discordTypeTable)

-- | This is sent on the message object when the message is a response to an Interaction without an existing message (i.e., any non-component interaction).
data MessageInteraction = MessageInteraction
  { MessageInteraction -> InteractionId
messageInteractionId :: InteractionId -- ^ Id of the interaction
  , MessageInteraction -> Integer
messageInteractionType :: Integer -- ^ Type of the interaction (liekly always application command)
  , MessageInteraction -> Text
messageInteractionName :: T.Text -- ^ Name of the interaction
  , MessageInteraction -> User
messageInteractionUser :: User -- ^ User who invoked the interaction
  } deriving (Int -> MessageInteraction -> ShowS
[MessageInteraction] -> ShowS
MessageInteraction -> String
(Int -> MessageInteraction -> ShowS)
-> (MessageInteraction -> String)
-> ([MessageInteraction] -> ShowS)
-> Show MessageInteraction
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MessageInteraction] -> ShowS
$cshowList :: [MessageInteraction] -> ShowS
show :: MessageInteraction -> String
$cshow :: MessageInteraction -> String
showsPrec :: Int -> MessageInteraction -> ShowS
$cshowsPrec :: Int -> MessageInteraction -> ShowS
Show, ReadPrec [MessageInteraction]
ReadPrec MessageInteraction
Int -> ReadS MessageInteraction
ReadS [MessageInteraction]
(Int -> ReadS MessageInteraction)
-> ReadS [MessageInteraction]
-> ReadPrec MessageInteraction
-> ReadPrec [MessageInteraction]
-> Read MessageInteraction
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [MessageInteraction]
$creadListPrec :: ReadPrec [MessageInteraction]
readPrec :: ReadPrec MessageInteraction
$creadPrec :: ReadPrec MessageInteraction
readList :: ReadS [MessageInteraction]
$creadList :: ReadS [MessageInteraction]
readsPrec :: Int -> ReadS MessageInteraction
$creadsPrec :: Int -> ReadS MessageInteraction
Read, MessageInteraction -> MessageInteraction -> Bool
(MessageInteraction -> MessageInteraction -> Bool)
-> (MessageInteraction -> MessageInteraction -> Bool)
-> Eq MessageInteraction
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MessageInteraction -> MessageInteraction -> Bool
$c/= :: MessageInteraction -> MessageInteraction -> Bool
== :: MessageInteraction -> MessageInteraction -> Bool
$c== :: MessageInteraction -> MessageInteraction -> Bool
Eq, Eq MessageInteraction
Eq MessageInteraction
-> (MessageInteraction -> MessageInteraction -> Ordering)
-> (MessageInteraction -> MessageInteraction -> Bool)
-> (MessageInteraction -> MessageInteraction -> Bool)
-> (MessageInteraction -> MessageInteraction -> Bool)
-> (MessageInteraction -> MessageInteraction -> Bool)
-> (MessageInteraction -> MessageInteraction -> MessageInteraction)
-> (MessageInteraction -> MessageInteraction -> MessageInteraction)
-> Ord MessageInteraction
MessageInteraction -> MessageInteraction -> Bool
MessageInteraction -> MessageInteraction -> Ordering
MessageInteraction -> MessageInteraction -> MessageInteraction
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: MessageInteraction -> MessageInteraction -> MessageInteraction
$cmin :: MessageInteraction -> MessageInteraction -> MessageInteraction
max :: MessageInteraction -> MessageInteraction -> MessageInteraction
$cmax :: MessageInteraction -> MessageInteraction -> MessageInteraction
>= :: MessageInteraction -> MessageInteraction -> Bool
$c>= :: MessageInteraction -> MessageInteraction -> Bool
> :: MessageInteraction -> MessageInteraction -> Bool
$c> :: MessageInteraction -> MessageInteraction -> Bool
<= :: MessageInteraction -> MessageInteraction -> Bool
$c<= :: MessageInteraction -> MessageInteraction -> Bool
< :: MessageInteraction -> MessageInteraction -> Bool
$c< :: MessageInteraction -> MessageInteraction -> Bool
compare :: MessageInteraction -> MessageInteraction -> Ordering
$ccompare :: MessageInteraction -> MessageInteraction -> Ordering
$cp1Ord :: Eq MessageInteraction
Ord)

instance ToJSON MessageInteraction where
  toJSON :: MessageInteraction -> Value
toJSON MessageInteraction{Integer
Text
InteractionId
User
messageInteractionUser :: User
messageInteractionName :: Text
messageInteractionType :: Integer
messageInteractionId :: InteractionId
messageInteractionUser :: MessageInteraction -> User
messageInteractionName :: MessageInteraction -> Text
messageInteractionType :: MessageInteraction -> Integer
messageInteractionId :: MessageInteraction -> InteractionId
..} = [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"id",     InteractionId -> Value
forall a. ToJSON a => a -> Value
toJSON (InteractionId -> Value) -> Maybe InteractionId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> InteractionId -> Maybe InteractionId
forall (f :: * -> *) a. Applicative f => a -> f a
pure InteractionId
messageInteractionId)
              , (Text
"type",   Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Integer -> Maybe Integer
forall (f :: * -> *) a. Applicative f => a -> f a
pure Integer
messageInteractionType)
              , (Text
"name",   Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
messageInteractionName)
              , (Text
"user",   User -> Value
forall a. ToJSON a => a -> Value
toJSON (User -> Value) -> Maybe User -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> User -> Maybe User
forall (f :: * -> *) a. Applicative f => a -> f a
pure User
messageInteractionUser)
              ] ]


instance FromJSON MessageInteraction where
  parseJSON :: Value -> Parser MessageInteraction
parseJSON = String
-> (Object -> Parser MessageInteraction)
-> Value
-> Parser MessageInteraction
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"MessageInteraction" ((Object -> Parser MessageInteraction)
 -> Value -> Parser MessageInteraction)
-> (Object -> Parser MessageInteraction)
-> Value
-> Parser MessageInteraction
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    InteractionId -> Integer -> Text -> User -> MessageInteraction
MessageInteraction (InteractionId -> Integer -> Text -> User -> MessageInteraction)
-> Parser InteractionId
-> Parser (Integer -> Text -> User -> MessageInteraction)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser InteractionId
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"id"
                       Parser (Integer -> Text -> User -> MessageInteraction)
-> Parser Integer -> Parser (Text -> User -> MessageInteraction)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"type"
                       Parser (Text -> User -> MessageInteraction)
-> Parser Text -> Parser (User -> MessageInteraction)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"name"
                       Parser (User -> MessageInteraction)
-> Parser User -> Parser MessageInteraction
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser User
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"user"