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

-- | Data structures pertaining to Discord Channels
module Discord.Internal.Types.Channel (
    Channel (..)
  , channelIsInGuild
  , Overwrite (..)
  , ThreadMetadata (..)
  , ThreadMember (..)
  , ThreadMemberUpdateFields (..)
  , ThreadListSyncFields (..)
  , ThreadMembersUpdateFields (..)
  , Message (..)
  , AllowedMentions (..)
  , MessageReaction (..)
  , Attachment (..)
  , Nonce (..)
  , MessageReference (..)
  , MessageType (..)
  , MessageActivity (..)
  , MessageActivityType (..)
  , MessageFlag (..)
  , MessageFlags (..)
  , MessageInteraction (..)
  
  , ChannelTypeOption (..)
  ) 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
$cshowsPrec :: Int -> Channel -> ShowS
showsPrec :: Int -> Channel -> ShowS
$cshow :: Channel -> String
show :: Channel -> String
$cshowList :: [Channel] -> ShowS
showList :: [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
$creadsPrec :: Int -> ReadS Channel
readsPrec :: Int -> ReadS Channel
$creadList :: ReadS [Channel]
readList :: ReadS [Channel]
$creadPrec :: ReadPrec Channel
readPrec :: ReadPrec Channel
$creadListPrec :: ReadPrec [Channel]
readListPrec :: ReadPrec [Channel]
Read, Channel -> Channel -> Bool
(Channel -> Channel -> Bool)
-> (Channel -> Channel -> Bool) -> Eq Channel
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Channel -> Channel -> Bool
== :: Channel -> Channel -> Bool
$c/= :: Channel -> Channel -> Bool
/= :: 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
$ccompare :: Channel -> Channel -> Ordering
compare :: Channel -> Channel -> Ordering
$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
>= :: Channel -> Channel -> Bool
$cmax :: Channel -> Channel -> Channel
max :: Channel -> Channel -> Channel
$cmin :: Channel -> Channel -> Channel
min :: Channel -> Channel -> 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 -> Key -> Parser Int
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"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 -> Key -> Parser ChannelId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser GuildId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"guild_id"
                     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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"position"
                     Parser
  ([Overwrite]
   -> Integer
   -> Bool
   -> Text
   -> Maybe MessageId
   -> Maybe ParentId
   -> Channel)
-> Parser [Overwrite]
-> Parser
     (Integer
      -> Bool -> Text -> Maybe MessageId -> Maybe ParentId -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser [Overwrite]
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"permission_overwrites"
                     Parser
  (Integer
   -> Bool -> Text -> Maybe MessageId -> Maybe ParentId -> Channel)
-> Parser Integer
-> Parser
     (Bool -> Text -> Maybe MessageId -> Maybe ParentId -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"rate_limit_per_user"
                     Parser
  (Bool -> Text -> Maybe MessageId -> Maybe ParentId -> Channel)
-> Parser Bool
-> Parser (Text -> Maybe MessageId -> Maybe ParentId -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe MessageId)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"last_message_id"
                     Parser (Maybe ParentId -> Channel)
-> Parser (Maybe ParentId) -> Parser Channel
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe ParentId)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 -> Key -> Parser ChannelId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"id"
                             Parser ([User] -> Maybe MessageId -> Channel)
-> Parser [User] -> Parser (Maybe MessageId -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser [User]
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"recipients"
                             Parser (Maybe MessageId -> Channel)
-> Parser (Maybe MessageId) -> Parser Channel
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe MessageId)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 -> Key -> Parser ChannelId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser GuildId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"guild_id"
                     Parser
  (Text
   -> Integer
   -> [Overwrite]
   -> Bool
   -> Integer
   -> Integer
   -> Maybe ParentId
   -> Channel)
-> Parser Text
-> Parser
     (Integer
      -> [Overwrite]
      -> Bool
      -> Integer
      -> Integer
      -> Maybe ParentId
      -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"name"
                     Parser
  (Integer
   -> [Overwrite]
   -> Bool
   -> Integer
   -> Integer
   -> Maybe ParentId
   -> Channel)
-> Parser Integer
-> Parser
     ([Overwrite]
      -> Bool -> Integer -> Integer -> Maybe ParentId -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"position"
                     Parser
  ([Overwrite]
   -> Bool -> Integer -> Integer -> Maybe ParentId -> Channel)
-> Parser [Overwrite]
-> Parser (Bool -> Integer -> Integer -> Maybe ParentId -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser [Overwrite]
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"permission_overwrites"
                     Parser (Bool -> Integer -> Integer -> Maybe ParentId -> Channel)
-> Parser Bool
-> Parser (Integer -> Integer -> Maybe ParentId -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"bitrate"
                     Parser (Integer -> Maybe ParentId -> Channel)
-> Parser Integer -> Parser (Maybe ParentId -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"user_limit"
                     Parser (Maybe ParentId -> Channel)
-> Parser (Maybe ParentId) -> Parser Channel
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe ParentId)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 -> Key -> Parser ChannelId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"id"
                       Parser ([User] -> Maybe MessageId -> Channel)
-> Parser [User] -> Parser (Maybe MessageId -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser [User]
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"recipients"
                       Parser (Maybe MessageId -> Channel)
-> Parser (Maybe MessageId) -> Parser Channel
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe MessageId)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 -> Key -> Parser ChannelId
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"id"
                             Parser (GuildId -> Text -> Integer -> [Overwrite] -> Channel)
-> Parser GuildId
-> Parser (Text -> Integer -> [Overwrite] -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser GuildId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"guild_id"
                             Parser (Text -> Integer -> [Overwrite] -> Channel)
-> Parser Text -> Parser (Integer -> [Overwrite] -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"name"
                             Parser (Integer -> [Overwrite] -> Channel)
-> Parser Integer -> Parser ([Overwrite] -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"position"
                             Parser ([Overwrite] -> Channel)
-> Parser [Overwrite] -> Parser Channel
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser [Overwrite]
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"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 -> Key -> Parser ChannelId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser GuildId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"guild_id"
                    Parser
  (Text
   -> Integer
   -> [Overwrite]
   -> Bool
   -> Text
   -> Maybe MessageId
   -> Maybe ParentId
   -> Channel)
-> Parser Text
-> Parser
     (Integer
      -> [Overwrite]
      -> Bool
      -> Text
      -> Maybe MessageId
      -> Maybe ParentId
      -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"name"
                    Parser
  (Integer
   -> [Overwrite]
   -> Bool
   -> Text
   -> Maybe MessageId
   -> Maybe ParentId
   -> Channel)
-> Parser Integer
-> Parser
     ([Overwrite]
      -> Bool -> Text -> Maybe MessageId -> Maybe ParentId -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"position"
                    Parser
  ([Overwrite]
   -> Bool -> Text -> Maybe MessageId -> Maybe ParentId -> Channel)
-> Parser [Overwrite]
-> Parser
     (Bool -> Text -> Maybe MessageId -> Maybe ParentId -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser [Overwrite]
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"permission_overwrites"
                    Parser
  (Bool -> Text -> Maybe MessageId -> Maybe ParentId -> Channel)
-> Parser Bool
-> Parser (Text -> Maybe MessageId -> Maybe ParentId -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe MessageId)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"last_message_id"
                    Parser (Maybe ParentId -> Channel)
-> Parser (Maybe ParentId) -> Parser Channel
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe ParentId)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 -> Key -> Parser ChannelId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"id"
                         Parser
  (GuildId
   -> Text
   -> Integer
   -> Bool
   -> [Overwrite]
   -> Maybe ParentId
   -> Channel)
-> Parser GuildId
-> Parser
     (Text
      -> Integer -> Bool -> [Overwrite] -> Maybe ParentId -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser GuildId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"guild_id"
                         Parser
  (Text
   -> Integer -> Bool -> [Overwrite] -> Maybe ParentId -> Channel)
-> Parser Text
-> Parser
     (Integer -> Bool -> [Overwrite] -> Maybe ParentId -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"name"
                         Parser
  (Integer -> Bool -> [Overwrite] -> Maybe ParentId -> Channel)
-> Parser Integer
-> Parser (Bool -> [Overwrite] -> Maybe ParentId -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"position"
                         Parser (Bool -> [Overwrite] -> Maybe ParentId -> Channel)
-> Parser Bool -> Parser ([Overwrite] -> Maybe ParentId -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser [Overwrite]
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"permission_overwrites"
                         Parser (Maybe ParentId -> Channel)
-> Parser (Maybe ParentId) -> Parser Channel
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe ParentId)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 -> Key -> Parser ChannelId
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser GuildId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"guild_id"
                              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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe MessageId)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"last_message_id"
                              Parser
  (Maybe ParentId
   -> Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
-> Parser (Maybe ParentId)
-> Parser (Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe ParentId)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"parent_id"
                              Parser (Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
-> Parser (Maybe ThreadMetadata)
-> Parser (Maybe ThreadMember -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe ThreadMetadata)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"thread_metadata"
                              Parser (Maybe ThreadMember -> Channel)
-> Parser (Maybe ThreadMember) -> Parser Channel
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe ThreadMember)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 -> Key -> Parser ChannelId
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser GuildId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"guild_id"
                                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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe MessageId)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"last_message_id"
                                Parser
  (Maybe ParentId
   -> Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
-> Parser (Maybe ParentId)
-> Parser (Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe ParentId)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"parent_id"
                                Parser (Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
-> Parser (Maybe ThreadMetadata)
-> Parser (Maybe ThreadMember -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe ThreadMetadata)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"thread_metadata"
                                Parser (Maybe ThreadMember -> Channel)
-> Parser (Maybe ThreadMember) -> Parser Channel
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe ThreadMember)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 -> Key -> Parser ChannelId
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser GuildId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"guild_id"
                                 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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe MessageId)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"last_message_id"
                                 Parser
  (Maybe ParentId
   -> Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
-> Parser (Maybe ParentId)
-> Parser (Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe ParentId)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"parent_id"
                                 Parser (Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
-> Parser (Maybe ThreadMetadata)
-> Parser (Maybe ThreadMember -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe ThreadMetadata)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"thread_metadata"
                                 Parser (Maybe ThreadMember -> Channel)
-> Parser (Maybe ThreadMember) -> Parser Channel
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe ThreadMember)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 -> Key -> Parser ChannelId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"id"
                     Parser (GuildId -> StageId -> Text -> Channel)
-> Parser GuildId -> Parser (StageId -> Text -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser GuildId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"guild_id"
                     Parser (StageId -> Text -> Channel)
-> Parser StageId -> Parser (Text -> Channel)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser StageId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"id"
                     Parser (Text -> Channel) -> Parser Text -> Parser Channel
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 -> Key -> Parser ChannelId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"id"
                              Parser (Text -> Channel) -> Parser Text -> Parser Channel
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text -> Parser Text
forall a. a -> Parser a
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
channelId :: Channel -> ChannelId
channelGuild :: Channel -> GuildId
channelName :: Channel -> Text
channelPosition :: Channel -> Integer
channelPermissions :: Channel -> [Overwrite]
channelUserRateLimit :: Channel -> Integer
channelNSFW :: Channel -> Bool
channelTopic :: Channel -> Text
channelLastMessage :: Channel -> Maybe MessageId
channelParentId :: Channel -> Maybe ParentId
channelId :: ChannelId
channelGuild :: GuildId
channelName :: Text
channelPosition :: Integer
channelPermissions :: [Overwrite]
channelUserRateLimit :: Integer
channelNSFW :: Bool
channelTopic :: Text
channelLastMessage :: Maybe MessageId
channelParentId :: Maybe ParentId
..} = [Maybe Pair] -> Value
objectFromMaybes
              [ Key
"type" Key -> Value -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Scientific -> Value
Number Scientific
0
              , Key
"id" Key -> ChannelId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== ChannelId
channelId
              , Key
"guild_id" Key -> GuildId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== GuildId
channelGuild
              , Key
"name" Key -> Text -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Text
channelName
              , Key
"position" Key -> Integer -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Integer
channelPosition
              , Key
"rate_limit_per_user" Key -> Integer -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Integer
channelUserRateLimit
              , Key
"nsfw" Key -> Bool -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Bool
channelNSFW
              , Key
"permission_overwrites" Key -> [Overwrite] -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== [Overwrite]
channelPermissions
              , Key
"topic" Key -> Text -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Text
channelTopic
              , Key
"last_message_id" Key -> Maybe MessageId -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe MessageId
channelLastMessage
              , Key
"parent_id" Key -> Maybe ParentId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Maybe ParentId
channelParentId
              ]
  toJSON ChannelNews{Bool
Integer
[Overwrite]
Maybe ParentId
Maybe MessageId
Text
GuildId
ChannelId
channelId :: Channel -> ChannelId
channelGuild :: Channel -> GuildId
channelName :: Channel -> Text
channelPosition :: Channel -> Integer
channelPermissions :: Channel -> [Overwrite]
channelNSFW :: Channel -> Bool
channelTopic :: Channel -> Text
channelLastMessage :: Channel -> Maybe MessageId
channelParentId :: Channel -> Maybe ParentId
channelId :: ChannelId
channelGuild :: GuildId
channelName :: Text
channelPosition :: Integer
channelPermissions :: [Overwrite]
channelNSFW :: Bool
channelTopic :: Text
channelLastMessage :: Maybe MessageId
channelParentId :: Maybe ParentId
..} = [Maybe Pair] -> Value
objectFromMaybes
              [ Key
"type" Key -> Value -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Scientific -> Value
Number Scientific
5
              , Key
"id" Key -> ChannelId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== ChannelId
channelId
              , Key
"guild_id" Key -> GuildId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== GuildId
channelGuild
              , Key
"name" Key -> Text -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Text
channelName
              , Key
"position" Key -> Integer -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Integer
channelPosition
              , Key
"permission_overwrites" Key -> [Overwrite] -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== [Overwrite]
channelPermissions
              , Key
"nsfw" Key -> Bool -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Bool
channelNSFW
              , Key
"topic" Key -> Text -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Text
channelTopic
              , Key
"last_message_id" Key -> Maybe MessageId -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe MessageId
channelLastMessage
              , Key
"parent_id" Key -> Maybe ParentId -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe ParentId
channelParentId
              ]
  toJSON ChannelStorePage{Bool
Integer
[Overwrite]
Maybe ParentId
Text
GuildId
ChannelId
channelId :: Channel -> ChannelId
channelGuild :: Channel -> GuildId
channelName :: Channel -> Text
channelPosition :: Channel -> Integer
channelPermissions :: Channel -> [Overwrite]
channelNSFW :: Channel -> Bool
channelParentId :: Channel -> Maybe ParentId
channelId :: ChannelId
channelGuild :: GuildId
channelName :: Text
channelPosition :: Integer
channelNSFW :: Bool
channelPermissions :: [Overwrite]
channelParentId :: Maybe ParentId
..} = [Maybe Pair] -> Value
objectFromMaybes
              [ Key
"type" Key -> Value -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Scientific -> Value
Number Scientific
6
              , Key
"id" Key -> ChannelId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== ChannelId
channelId
              , Key
"guild_id" Key -> GuildId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== GuildId
channelGuild
              , Key
"name" Key -> Text -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Text
channelName
              , Key
"nsfw" Key -> Bool -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Bool
channelNSFW
              , Key
"position" Key -> Integer -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Integer
channelPosition
              , Key
"permission_overwrites" Key -> [Overwrite] -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== [Overwrite]
channelPermissions
              ]
  toJSON ChannelDirectMessage{[User]
Maybe MessageId
ChannelId
channelId :: Channel -> ChannelId
channelLastMessage :: Channel -> Maybe MessageId
channelRecipients :: Channel -> [User]
channelId :: ChannelId
channelRecipients :: [User]
channelLastMessage :: Maybe MessageId
..} = [Maybe Pair] -> Value
objectFromMaybes
              [ Key
"type" Key -> Value -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Scientific -> Value
Number Scientific
1
              , Key
"id" Key -> ChannelId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== ChannelId
channelId
              , Key
"recipients" Key -> [User] -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== [User]
channelRecipients
              , Key
"last_message_id" Key -> Maybe MessageId -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe MessageId
channelLastMessage
              ]
  toJSON ChannelVoice{Bool
Integer
[Overwrite]
Maybe ParentId
Text
GuildId
ChannelId
channelId :: Channel -> ChannelId
channelGuild :: Channel -> GuildId
channelName :: Channel -> Text
channelPosition :: Channel -> Integer
channelPermissions :: Channel -> [Overwrite]
channelNSFW :: Channel -> Bool
channelParentId :: Channel -> Maybe ParentId
channelBitRate :: Channel -> Integer
channelUserLimit :: Channel -> Integer
channelId :: ChannelId
channelGuild :: GuildId
channelName :: Text
channelPosition :: Integer
channelPermissions :: [Overwrite]
channelNSFW :: Bool
channelBitRate :: Integer
channelUserLimit :: Integer
channelParentId :: Maybe ParentId
..} = [Maybe Pair] -> Value
objectFromMaybes
              [ Key
"type" Key -> Value -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Scientific -> Value
Number Scientific
2
              , Key
"id" Key -> ChannelId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== ChannelId
channelId
              , Key
"guild_id" Key -> GuildId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== GuildId
channelGuild
              , Key
"name" Key -> Text -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Text
channelName
              , Key
"position" Key -> Integer -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Integer
channelPosition
              , Key
"nsfw" Key -> Bool -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Bool
channelNSFW
              , Key
"permission_overwrites" Key -> [Overwrite] -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== [Overwrite]
channelPermissions
              , Key
"bitrate" Key -> Integer -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Integer
channelBitRate
              , Key
"user_limit" Key -> Integer -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Integer
channelUserLimit
              ]
  toJSON ChannelGroupDM{[User]
Maybe MessageId
ChannelId
channelId :: Channel -> ChannelId
channelLastMessage :: Channel -> Maybe MessageId
channelRecipients :: Channel -> [User]
channelId :: ChannelId
channelRecipients :: [User]
channelLastMessage :: Maybe MessageId
..} = [Maybe Pair] -> Value
objectFromMaybes
              [ Key
"type" Key -> Value -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Scientific -> Value
Number Scientific
3
              , Key
"id" Key -> ChannelId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== ChannelId
channelId
              , Key
"recipients" Key -> [User] -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== [User]
channelRecipients
              , Key
"last_message_id" Key -> Maybe MessageId -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe MessageId
channelLastMessage
              ]
  toJSON ChannelGuildCategory{Integer
[Overwrite]
Text
GuildId
ChannelId
channelId :: Channel -> ChannelId
channelGuild :: Channel -> GuildId
channelName :: Channel -> Text
channelPosition :: Channel -> Integer
channelPermissions :: Channel -> [Overwrite]
channelId :: ChannelId
channelGuild :: GuildId
channelName :: Text
channelPosition :: Integer
channelPermissions :: [Overwrite]
..} = [Maybe Pair] -> Value
objectFromMaybes
              [ Key
"type" Key -> Value -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Scientific -> Value
Number Scientific
4
              , Key
"id" Key -> ChannelId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== ChannelId
channelId
              , Key
"name" Key -> Text -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Text
channelName
              , Key
"guild_id" Key -> GuildId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== GuildId
channelGuild
              ]
  toJSON ChannelStage{Text
GuildId
StageId
ChannelId
channelId :: Channel -> ChannelId
channelGuild :: Channel -> GuildId
channelStageId :: Channel -> StageId
channelStageTopic :: Channel -> Text
channelId :: ChannelId
channelGuild :: GuildId
channelStageId :: StageId
channelStageTopic :: Text
..} = [Maybe Pair] -> Value
objectFromMaybes
              [ Key
"type" Key -> Value -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Scientific -> Value
Number Scientific
13
              , Key
"id" Key -> ChannelId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== ChannelId
channelId
              , Key
"guild_id" Key -> GuildId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== GuildId
channelGuild
              , Key
"channel_id" Key -> StageId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== StageId
channelStageId
              , Key
"topic" Key -> Text -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Text
channelStageTopic
              ]
  toJSON ChannelNewsThread{Maybe Integer
Maybe Text
Maybe ParentId
Maybe MessageId
Maybe ThreadMember
Maybe ThreadMetadata
GuildId
ChannelId
channelId :: Channel -> ChannelId
channelGuild :: Channel -> GuildId
channelLastMessage :: Channel -> Maybe MessageId
channelParentId :: Channel -> Maybe ParentId
channelThreadName :: Channel -> Maybe Text
channelUserRateLimitThread :: Channel -> Maybe Integer
channelThreadMetadata :: Channel -> Maybe ThreadMetadata
channelThreadMember :: Channel -> Maybe ThreadMember
channelId :: ChannelId
channelGuild :: GuildId
channelThreadName :: Maybe Text
channelUserRateLimitThread :: Maybe Integer
channelLastMessage :: Maybe MessageId
channelParentId :: Maybe ParentId
channelThreadMetadata :: Maybe ThreadMetadata
channelThreadMember :: Maybe ThreadMember
..} = [Maybe Pair] -> Value
objectFromMaybes
              [ Key
"type" Key -> Value -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Scientific -> Value
Number Scientific
10
              , Key
"id" Key -> ChannelId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== ChannelId
channelId
              , Key
"guild_id" Key -> GuildId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== GuildId
channelGuild
              , Key
"name" Key -> Maybe Text -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe Text
channelThreadName
              , Key
"rate_limit_per_user" Key -> Maybe Integer -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe Integer
channelUserRateLimitThread
              , Key
"last_message_id" Key -> Maybe MessageId -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe MessageId
channelLastMessage
              , Key
"parent_id" Key -> Maybe ParentId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Maybe ParentId
channelParentId
              , Key
"thread_metadata" Key -> Maybe ThreadMetadata -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe ThreadMetadata
channelThreadMetadata
              , Key
"member" Key -> Maybe ThreadMember -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe ThreadMember
channelThreadMember
              ]
  toJSON ChannelPublicThread{Maybe Integer
Maybe Text
Maybe ParentId
Maybe MessageId
Maybe ThreadMember
Maybe ThreadMetadata
GuildId
ChannelId
channelId :: Channel -> ChannelId
channelGuild :: Channel -> GuildId
channelLastMessage :: Channel -> Maybe MessageId
channelParentId :: Channel -> Maybe ParentId
channelThreadName :: Channel -> Maybe Text
channelUserRateLimitThread :: Channel -> Maybe Integer
channelThreadMetadata :: Channel -> Maybe ThreadMetadata
channelThreadMember :: Channel -> Maybe ThreadMember
channelId :: ChannelId
channelGuild :: GuildId
channelThreadName :: Maybe Text
channelUserRateLimitThread :: Maybe Integer
channelLastMessage :: Maybe MessageId
channelParentId :: Maybe ParentId
channelThreadMetadata :: Maybe ThreadMetadata
channelThreadMember :: Maybe ThreadMember
..} = [Maybe Pair] -> Value
objectFromMaybes
              [ Key
"type" Key -> Value -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Scientific -> Value
Number Scientific
11
              , Key
"id" Key -> ChannelId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== ChannelId
channelId
              , Key
"guild_id" Key -> GuildId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== GuildId
channelGuild
              , Key
"name" Key -> Maybe Text -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe Text
channelThreadName
              , Key
"rate_limit_per_user" Key -> Maybe Integer -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe Integer
channelUserRateLimitThread
              , Key
"last_message_id" Key -> Maybe MessageId -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe MessageId
channelLastMessage
              , Key
"parent_id" Key -> Maybe ParentId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Maybe ParentId
channelParentId
              , Key
"thread_metadata" Key -> Maybe ThreadMetadata -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe ThreadMetadata
channelThreadMetadata
              , Key
"member" Key -> Maybe ThreadMember -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe ThreadMember
channelThreadMember
              ]
  toJSON ChannelPrivateThread{Maybe Integer
Maybe Text
Maybe ParentId
Maybe MessageId
Maybe ThreadMember
Maybe ThreadMetadata
GuildId
ChannelId
channelId :: Channel -> ChannelId
channelGuild :: Channel -> GuildId
channelLastMessage :: Channel -> Maybe MessageId
channelParentId :: Channel -> Maybe ParentId
channelThreadName :: Channel -> Maybe Text
channelUserRateLimitThread :: Channel -> Maybe Integer
channelThreadMetadata :: Channel -> Maybe ThreadMetadata
channelThreadMember :: Channel -> Maybe ThreadMember
channelId :: ChannelId
channelGuild :: GuildId
channelThreadName :: Maybe Text
channelUserRateLimitThread :: Maybe Integer
channelLastMessage :: Maybe MessageId
channelParentId :: Maybe ParentId
channelThreadMetadata :: Maybe ThreadMetadata
channelThreadMember :: Maybe ThreadMember
..} = [Maybe Pair] -> Value
objectFromMaybes
              [ Key
"type" Key -> Value -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Scientific -> Value
Number Scientific
12
              , Key
"id" Key -> ChannelId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== ChannelId
channelId
              , Key
"guild_id" Key -> GuildId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== GuildId
channelGuild
              , Key
"name" Key -> Maybe Text -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe Text
channelThreadName
              , Key
"rate_limit_per_user" Key -> Maybe Integer -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe Integer
channelUserRateLimitThread
              , Key
"last_message_id" Key -> Maybe MessageId -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe MessageId
channelLastMessage
              , Key
"parent_id" Key -> Maybe ParentId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Maybe ParentId
channelParentId
              , Key
"thread_metadata" Key -> Maybe ThreadMetadata -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe ThreadMetadata
channelThreadMetadata
              , Key
"member" Key -> Maybe ThreadMember -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe ThreadMember
channelThreadMember
              ]
  toJSON ChannelUnknownType{Text
ChannelId
channelId :: Channel -> ChannelId
channelJSON :: Channel -> Text
channelId :: ChannelId
channelJSON :: Text
..} = [Maybe Pair] -> Value
objectFromMaybes
              [ Key
"id" Key -> ChannelId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== ChannelId
channelId
              , Key
"json" Key -> Text -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== 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
$cshowsPrec :: Int -> Overwrite -> ShowS
showsPrec :: Int -> Overwrite -> ShowS
$cshow :: Overwrite -> String
show :: Overwrite -> String
$cshowList :: [Overwrite] -> ShowS
showList :: [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
$creadsPrec :: Int -> ReadS Overwrite
readsPrec :: Int -> ReadS Overwrite
$creadList :: ReadS [Overwrite]
readList :: ReadS [Overwrite]
$creadPrec :: ReadPrec Overwrite
readPrec :: ReadPrec Overwrite
$creadListPrec :: ReadPrec [Overwrite]
readListPrec :: ReadPrec [Overwrite]
Read, Overwrite -> Overwrite -> Bool
(Overwrite -> Overwrite -> Bool)
-> (Overwrite -> Overwrite -> Bool) -> Eq Overwrite
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Overwrite -> Overwrite -> Bool
== :: Overwrite -> Overwrite -> Bool
$c/= :: Overwrite -> Overwrite -> Bool
/= :: 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
$ccompare :: Overwrite -> Overwrite -> Ordering
compare :: Overwrite -> Overwrite -> Ordering
$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
>= :: Overwrite -> Overwrite -> Bool
$cmax :: Overwrite -> Overwrite -> Overwrite
max :: Overwrite -> Overwrite -> Overwrite
$cmin :: Overwrite -> Overwrite -> Overwrite
min :: Overwrite -> Overwrite -> 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 -> Key -> Parser Int
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"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 -> Key -> Parser RoleId
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"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 -> Key -> Parser UserId
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"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 -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"allow"
              Parser (Text -> Overwrite) -> Parser Text -> Parser Overwrite
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"deny"

instance ToJSON Overwrite where
  toJSON :: Overwrite -> Value
toJSON Overwrite{Either RoleId UserId
Text
overwriteId :: Overwrite -> Either RoleId UserId
overwriteAllow :: Overwrite -> Text
overwriteDeny :: Overwrite -> Text
overwriteId :: Either RoleId UserId
overwriteAllow :: Text
overwriteDeny :: Text
..} = [Pair] -> Value
object
              [ (Key
"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)
              , (Key
"type",   Int -> Value
forall a. ToJSON a => a -> Value
toJSON ((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))
              , (Key
"allow",  Text -> Value
forall a. ToJSON a => a -> Value
toJSON Text
overwriteAllow)
              , (Key
"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
$cshowsPrec :: Int -> ThreadMetadata -> ShowS
showsPrec :: Int -> ThreadMetadata -> ShowS
$cshow :: ThreadMetadata -> String
show :: ThreadMetadata -> String
$cshowList :: [ThreadMetadata] -> ShowS
showList :: [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
$creadsPrec :: Int -> ReadS ThreadMetadata
readsPrec :: Int -> ReadS ThreadMetadata
$creadList :: ReadS [ThreadMetadata]
readList :: ReadS [ThreadMetadata]
$creadPrec :: ReadPrec ThreadMetadata
readPrec :: ReadPrec ThreadMetadata
$creadListPrec :: ReadPrec [ThreadMetadata]
readListPrec :: ReadPrec [ThreadMetadata]
Read, ThreadMetadata -> ThreadMetadata -> Bool
(ThreadMetadata -> ThreadMetadata -> Bool)
-> (ThreadMetadata -> ThreadMetadata -> Bool) -> Eq ThreadMetadata
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ThreadMetadata -> ThreadMetadata -> Bool
== :: ThreadMetadata -> ThreadMetadata -> Bool
$c/= :: ThreadMetadata -> ThreadMetadata -> Bool
/= :: 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
$ccompare :: ThreadMetadata -> ThreadMetadata -> Ordering
compare :: ThreadMetadata -> ThreadMetadata -> Ordering
$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
>= :: ThreadMetadata -> ThreadMetadata -> Bool
$cmax :: ThreadMetadata -> ThreadMetadata -> ThreadMetadata
max :: ThreadMetadata -> ThreadMetadata -> ThreadMetadata
$cmin :: ThreadMetadata -> ThreadMetadata -> ThreadMetadata
min :: ThreadMetadata -> ThreadMetadata -> 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 -> Key -> Parser Bool
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"archived"
                   Parser
  (Integer
   -> UTCTime
   -> Bool
   -> Maybe Bool
   -> Maybe UTCTime
   -> ThreadMetadata)
-> Parser Integer
-> Parser
     (UTCTime -> Bool -> Maybe Bool -> Maybe UTCTime -> ThreadMetadata)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"auto_archive_duration"
                   Parser
  (UTCTime -> Bool -> Maybe Bool -> Maybe UTCTime -> ThreadMetadata)
-> Parser UTCTime
-> Parser (Bool -> Maybe Bool -> Maybe UTCTime -> ThreadMetadata)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser UTCTime
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"archive_timestamp"
                   Parser (Bool -> Maybe Bool -> Maybe UTCTime -> ThreadMetadata)
-> Parser Bool
-> Parser (Maybe Bool -> Maybe UTCTime -> ThreadMetadata)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Bool
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"locked"
                   Parser (Maybe Bool -> Maybe UTCTime -> ThreadMetadata)
-> Parser (Maybe Bool) -> Parser (Maybe UTCTime -> ThreadMetadata)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"invitable"
                   Parser (Maybe UTCTime -> ThreadMetadata)
-> Parser (Maybe UTCTime) -> Parser ThreadMetadata
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe UTCTime)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"create_timestamp"

instance ToJSON ThreadMetadata where
  toJSON :: ThreadMetadata -> Value
toJSON ThreadMetadata{Bool
Integer
Maybe Bool
Maybe UTCTime
UTCTime
threadMetadataArchived :: ThreadMetadata -> Bool
threadMetadataAutoArchive :: ThreadMetadata -> Integer
threadMetadataArchiveTime :: ThreadMetadata -> UTCTime
threadMetadataLocked :: ThreadMetadata -> Bool
threadMetadataInvitable :: ThreadMetadata -> Maybe Bool
threadMetadataCreateTime :: ThreadMetadata -> Maybe UTCTime
threadMetadataArchived :: Bool
threadMetadataAutoArchive :: Integer
threadMetadataArchiveTime :: UTCTime
threadMetadataLocked :: Bool
threadMetadataInvitable :: Maybe Bool
threadMetadataCreateTime :: Maybe UTCTime
..} = [Maybe Pair] -> Value
objectFromMaybes
              [ Key
"archived" Key -> Bool -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Bool
threadMetadataArchived
              , Key
"auto_archive_duration" Key -> Integer -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Integer
threadMetadataAutoArchive
              , Key
"archive_timestamp" Key -> UTCTime -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== UTCTime
threadMetadataArchiveTime
              , Key
"locked" Key -> Bool -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Bool
threadMetadataLocked
              , Key
"invitable" Key -> Maybe Bool -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe Bool
threadMetadataInvitable
              , Key
"create_timestamp" Key -> Maybe UTCTime -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== 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
$cshowsPrec :: Int -> ThreadMember -> ShowS
showsPrec :: Int -> ThreadMember -> ShowS
$cshow :: ThreadMember -> String
show :: ThreadMember -> String
$cshowList :: [ThreadMember] -> ShowS
showList :: [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
$creadsPrec :: Int -> ReadS ThreadMember
readsPrec :: Int -> ReadS ThreadMember
$creadList :: ReadS [ThreadMember]
readList :: ReadS [ThreadMember]
$creadPrec :: ReadPrec ThreadMember
readPrec :: ReadPrec ThreadMember
$creadListPrec :: ReadPrec [ThreadMember]
readListPrec :: ReadPrec [ThreadMember]
Read, ThreadMember -> ThreadMember -> Bool
(ThreadMember -> ThreadMember -> Bool)
-> (ThreadMember -> ThreadMember -> Bool) -> Eq ThreadMember
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ThreadMember -> ThreadMember -> Bool
== :: ThreadMember -> ThreadMember -> Bool
$c/= :: ThreadMember -> ThreadMember -> Bool
/= :: 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
$ccompare :: ThreadMember -> ThreadMember -> Ordering
compare :: ThreadMember -> ThreadMember -> Ordering
$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
>= :: ThreadMember -> ThreadMember -> Bool
$cmax :: ThreadMember -> ThreadMember -> ThreadMember
max :: ThreadMember -> ThreadMember -> ThreadMember
$cmin :: ThreadMember -> ThreadMember -> ThreadMember
min :: ThreadMember -> ThreadMember -> 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 -> Key -> Parser (Maybe ChannelId)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"id"
                 Parser (Maybe UserId -> UTCTime -> Integer -> ThreadMember)
-> Parser (Maybe UserId)
-> Parser (UTCTime -> Integer -> ThreadMember)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe UserId)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"user_id"
                 Parser (UTCTime -> Integer -> ThreadMember)
-> Parser UTCTime -> Parser (Integer -> ThreadMember)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser UTCTime
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"join_timestamp"
                 Parser (Integer -> ThreadMember)
-> Parser Integer -> Parser ThreadMember
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"flags"

instance ToJSON ThreadMember where
  toJSON :: ThreadMember -> Value
toJSON ThreadMember{Integer
Maybe UserId
Maybe ChannelId
UTCTime
threadMemberThreadId :: ThreadMember -> Maybe ChannelId
threadMemberUserId :: ThreadMember -> Maybe UserId
threadMemberJoinTime :: ThreadMember -> UTCTime
threadMemberFlags :: ThreadMember -> Integer
threadMemberThreadId :: Maybe ChannelId
threadMemberUserId :: Maybe UserId
threadMemberJoinTime :: UTCTime
threadMemberFlags :: Integer
..} = [Maybe Pair] -> Value
objectFromMaybes
              [ Key
"id" Key -> Maybe ChannelId -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe ChannelId
threadMemberThreadId
              , Key
"user_id" Key -> Maybe UserId -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe UserId
threadMemberUserId
              , Key
"join_timestamp" Key -> UTCTime -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== UTCTime
threadMemberJoinTime
              , Key
"flags" Key -> Integer -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Integer
threadMemberFlags
              ]

data ThreadMemberUpdateFields = ThreadMemberUpdateFields
  { ThreadMemberUpdateFields -> Maybe ChannelId
threadMemberUpdateFieldsThreadId :: Maybe ChannelId -- ^ id of the thread
  , ThreadMemberUpdateFields -> Maybe UserId
threadMemberUpdateFieldsUserId   :: Maybe UserId    -- ^ id of the user
  , ThreadMemberUpdateFields -> UTCTime
threadMemberUpdateFieldsJoinTime :: UTCTime         -- ^ time the current user last joined the thread
  , ThreadMemberUpdateFields -> Integer
threadMemberUpdateFieldsFlags    :: Integer         -- ^ user-thread settings
  , ThreadMemberUpdateFields -> GuildId
threadMemberUpdateFieldsGuildId  :: GuildId         -- ^ id of the guild
  } deriving (Int -> ThreadMemberUpdateFields -> ShowS
[ThreadMemberUpdateFields] -> ShowS
ThreadMemberUpdateFields -> String
(Int -> ThreadMemberUpdateFields -> ShowS)
-> (ThreadMemberUpdateFields -> String)
-> ([ThreadMemberUpdateFields] -> ShowS)
-> Show ThreadMemberUpdateFields
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ThreadMemberUpdateFields -> ShowS
showsPrec :: Int -> ThreadMemberUpdateFields -> ShowS
$cshow :: ThreadMemberUpdateFields -> String
show :: ThreadMemberUpdateFields -> String
$cshowList :: [ThreadMemberUpdateFields] -> ShowS
showList :: [ThreadMemberUpdateFields] -> ShowS
Show, ReadPrec [ThreadMemberUpdateFields]
ReadPrec ThreadMemberUpdateFields
Int -> ReadS ThreadMemberUpdateFields
ReadS [ThreadMemberUpdateFields]
(Int -> ReadS ThreadMemberUpdateFields)
-> ReadS [ThreadMemberUpdateFields]
-> ReadPrec ThreadMemberUpdateFields
-> ReadPrec [ThreadMemberUpdateFields]
-> Read ThreadMemberUpdateFields
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS ThreadMemberUpdateFields
readsPrec :: Int -> ReadS ThreadMemberUpdateFields
$creadList :: ReadS [ThreadMemberUpdateFields]
readList :: ReadS [ThreadMemberUpdateFields]
$creadPrec :: ReadPrec ThreadMemberUpdateFields
readPrec :: ReadPrec ThreadMemberUpdateFields
$creadListPrec :: ReadPrec [ThreadMemberUpdateFields]
readListPrec :: ReadPrec [ThreadMemberUpdateFields]
Read, ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Bool
(ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Bool)
-> (ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Bool)
-> Eq ThreadMemberUpdateFields
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Bool
== :: ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Bool
$c/= :: ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Bool
/= :: ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Bool
Eq, Eq ThreadMemberUpdateFields
Eq ThreadMemberUpdateFields =>
(ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Ordering)
-> (ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Bool)
-> (ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Bool)
-> (ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Bool)
-> (ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Bool)
-> (ThreadMemberUpdateFields
    -> ThreadMemberUpdateFields -> ThreadMemberUpdateFields)
-> (ThreadMemberUpdateFields
    -> ThreadMemberUpdateFields -> ThreadMemberUpdateFields)
-> Ord ThreadMemberUpdateFields
ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Bool
ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Ordering
ThreadMemberUpdateFields
-> ThreadMemberUpdateFields -> ThreadMemberUpdateFields
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
$ccompare :: ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Ordering
compare :: ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Ordering
$c< :: ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Bool
< :: ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Bool
$c<= :: ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Bool
<= :: ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Bool
$c> :: ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Bool
> :: ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Bool
$c>= :: ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Bool
>= :: ThreadMemberUpdateFields -> ThreadMemberUpdateFields -> Bool
$cmax :: ThreadMemberUpdateFields
-> ThreadMemberUpdateFields -> ThreadMemberUpdateFields
max :: ThreadMemberUpdateFields
-> ThreadMemberUpdateFields -> ThreadMemberUpdateFields
$cmin :: ThreadMemberUpdateFields
-> ThreadMemberUpdateFields -> ThreadMemberUpdateFields
min :: ThreadMemberUpdateFields
-> ThreadMemberUpdateFields -> ThreadMemberUpdateFields
Ord)

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

instance ToJSON ThreadMemberUpdateFields where
  toJSON :: ThreadMemberUpdateFields -> Value
toJSON ThreadMemberUpdateFields{Integer
Maybe UserId
Maybe ChannelId
UTCTime
GuildId
threadMemberUpdateFieldsThreadId :: ThreadMemberUpdateFields -> Maybe ChannelId
threadMemberUpdateFieldsUserId :: ThreadMemberUpdateFields -> Maybe UserId
threadMemberUpdateFieldsJoinTime :: ThreadMemberUpdateFields -> UTCTime
threadMemberUpdateFieldsFlags :: ThreadMemberUpdateFields -> Integer
threadMemberUpdateFieldsGuildId :: ThreadMemberUpdateFields -> GuildId
threadMemberUpdateFieldsThreadId :: Maybe ChannelId
threadMemberUpdateFieldsUserId :: Maybe UserId
threadMemberUpdateFieldsJoinTime :: UTCTime
threadMemberUpdateFieldsFlags :: Integer
threadMemberUpdateFieldsGuildId :: GuildId
..} = [Maybe Pair] -> Value
objectFromMaybes
              [ Key
"id" Key -> Maybe ChannelId -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe ChannelId
threadMemberUpdateFieldsThreadId
              , Key
"user_id" Key -> Maybe UserId -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe UserId
threadMemberUpdateFieldsUserId
              , Key
"join_timestamp" Key -> UTCTime -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== UTCTime
threadMemberUpdateFieldsJoinTime
              , Key
"flags" Key -> Integer -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Integer
threadMemberUpdateFieldsFlags
              , Key
"guild_id" Key -> GuildId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== GuildId
threadMemberUpdateFieldsGuildId
              ]

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
$cshowsPrec :: Int -> ThreadListSyncFields -> ShowS
showsPrec :: Int -> ThreadListSyncFields -> ShowS
$cshow :: ThreadListSyncFields -> String
show :: ThreadListSyncFields -> String
$cshowList :: [ThreadListSyncFields] -> ShowS
showList :: [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
$creadsPrec :: Int -> ReadS ThreadListSyncFields
readsPrec :: Int -> ReadS ThreadListSyncFields
$creadList :: ReadS [ThreadListSyncFields]
readList :: ReadS [ThreadListSyncFields]
$creadPrec :: ReadPrec ThreadListSyncFields
readPrec :: ReadPrec ThreadListSyncFields
$creadListPrec :: ReadPrec [ThreadListSyncFields]
readListPrec :: ReadPrec [ThreadListSyncFields]
Read, ThreadListSyncFields -> ThreadListSyncFields -> Bool
(ThreadListSyncFields -> ThreadListSyncFields -> Bool)
-> (ThreadListSyncFields -> ThreadListSyncFields -> Bool)
-> Eq ThreadListSyncFields
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ThreadListSyncFields -> ThreadListSyncFields -> Bool
== :: ThreadListSyncFields -> ThreadListSyncFields -> Bool
$c/= :: ThreadListSyncFields -> ThreadListSyncFields -> Bool
/= :: 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
$ccompare :: ThreadListSyncFields -> ThreadListSyncFields -> Ordering
compare :: ThreadListSyncFields -> ThreadListSyncFields -> Ordering
$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
>= :: ThreadListSyncFields -> ThreadListSyncFields -> Bool
$cmax :: ThreadListSyncFields
-> ThreadListSyncFields -> ThreadListSyncFields
max :: ThreadListSyncFields
-> ThreadListSyncFields -> ThreadListSyncFields
$cmin :: ThreadListSyncFields
-> ThreadListSyncFields -> ThreadListSyncFields
min :: ThreadListSyncFields
-> ThreadListSyncFields -> 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 -> Key -> Parser GuildId
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"guild_id"
                         Parser
  (Maybe [ChannelId]
   -> [Channel] -> [ThreadMember] -> ThreadListSyncFields)
-> Parser (Maybe [ChannelId])
-> Parser ([Channel] -> [ThreadMember] -> ThreadListSyncFields)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe [ChannelId])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"channel_ids"
                         Parser ([Channel] -> [ThreadMember] -> ThreadListSyncFields)
-> Parser [Channel]
-> Parser ([ThreadMember] -> ThreadListSyncFields)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser [Channel]
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"threads"
                         Parser ([ThreadMember] -> ThreadListSyncFields)
-> Parser [ThreadMember] -> Parser ThreadListSyncFields
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser [ThreadMember]
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"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
$cshowsPrec :: Int -> ThreadMembersUpdateFields -> ShowS
showsPrec :: Int -> ThreadMembersUpdateFields -> ShowS
$cshow :: ThreadMembersUpdateFields -> String
show :: ThreadMembersUpdateFields -> String
$cshowList :: [ThreadMembersUpdateFields] -> ShowS
showList :: [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
$creadsPrec :: Int -> ReadS ThreadMembersUpdateFields
readsPrec :: Int -> ReadS ThreadMembersUpdateFields
$creadList :: ReadS [ThreadMembersUpdateFields]
readList :: ReadS [ThreadMembersUpdateFields]
$creadPrec :: ReadPrec ThreadMembersUpdateFields
readPrec :: ReadPrec ThreadMembersUpdateFields
$creadListPrec :: ReadPrec [ThreadMembersUpdateFields]
readListPrec :: ReadPrec [ThreadMembersUpdateFields]
Read, ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
(ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool)
-> (ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool)
-> Eq ThreadMembersUpdateFields
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
== :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
$c/= :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
/= :: 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
$ccompare :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Ordering
compare :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Ordering
$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
>= :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
$cmax :: ThreadMembersUpdateFields
-> ThreadMembersUpdateFields -> ThreadMembersUpdateFields
max :: ThreadMembersUpdateFields
-> ThreadMembersUpdateFields -> ThreadMembersUpdateFields
$cmin :: ThreadMembersUpdateFields
-> ThreadMembersUpdateFields -> ThreadMembersUpdateFields
min :: ThreadMembersUpdateFields
-> ThreadMembersUpdateFields -> 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 -> Key -> Parser ChannelId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"id"
                              Parser
  (GuildId
   -> Integer
   -> Maybe [ThreadMember]
   -> Maybe [UserId]
   -> ThreadMembersUpdateFields)
-> Parser GuildId
-> Parser
     (Integer
      -> Maybe [ThreadMember]
      -> Maybe [UserId]
      -> ThreadMembersUpdateFields)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser GuildId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"guild_id"
                              Parser
  (Integer
   -> Maybe [ThreadMember]
   -> Maybe [UserId]
   -> ThreadMembersUpdateFields)
-> Parser Integer
-> Parser
     (Maybe [ThreadMember]
      -> Maybe [UserId] -> ThreadMembersUpdateFields)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"member_count"
                              Parser
  (Maybe [ThreadMember]
   -> Maybe [UserId] -> ThreadMembersUpdateFields)
-> Parser (Maybe [ThreadMember])
-> Parser (Maybe [UserId] -> ThreadMembersUpdateFields)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe [ThreadMember])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"added_members"
                              Parser (Maybe [UserId] -> ThreadMembersUpdateFields)
-> Parser (Maybe [UserId]) -> Parser ThreadMembersUpdateFields
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe [UserId])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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
$cshowsPrec :: Int -> Message -> ShowS
showsPrec :: Int -> Message -> ShowS
$cshow :: Message -> String
show :: Message -> String
$cshowList :: [Message] -> ShowS
showList :: [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
$creadsPrec :: Int -> ReadS Message
readsPrec :: Int -> ReadS Message
$creadList :: ReadS [Message]
readList :: ReadS [Message]
$creadPrec :: ReadPrec Message
readPrec :: ReadPrec Message
$creadListPrec :: ReadPrec [Message]
readListPrec :: ReadPrec [Message]
Read, Message -> Message -> Bool
(Message -> Message -> Bool)
-> (Message -> Message -> Bool) -> Eq Message
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Message -> Message -> Bool
== :: Message -> Message -> Bool
$c/= :: Message -> Message -> Bool
/= :: 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
$ccompare :: Message -> Message -> Ordering
compare :: Message -> Message -> Ordering
$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
>= :: Message -> Message -> Bool
$cmax :: Message -> Message -> Message
max :: Message -> Message -> Message
$cmin :: Message -> Message -> Message
min :: Message -> Message -> 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 -> Key -> Parser MessageId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser ChannelId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe (Maybe GuildId))
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (do Maybe WebhookId
isW <- Object
o Object -> Key -> Parser (Maybe WebhookId)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"webhook_id"
                    User
a <- Object
o Object -> Key -> Parser User
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"author"
                    case Maybe WebhookId
isW :: Maybe WebhookId of
                      Maybe WebhookId
Nothing -> User -> Parser User
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure User
a
                      Just WebhookId
_ -> User -> Parser User
forall a. a -> Parser a
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 = 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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe GuildMember)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe UTCTime)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe UTCTime)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe [User])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe [RoleId])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe [Attachment])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser [Embed]
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe [MessageReaction])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Nonce)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe WebhookId)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser MessageType
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe MessageActivity)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe ApplicationId)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe (Maybe MessageReference))
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe MessageFlags)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe (Maybe Message))
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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 a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe MessageInteraction)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"interaction"
            Parser
  (Maybe Channel
   -> Maybe [ActionRow] -> Maybe [StickerItem] -> Message)
-> Parser (Maybe Channel)
-> Parser (Maybe [ActionRow] -> Maybe [StickerItem] -> Message)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Channel)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"thread"
            Parser (Maybe [ActionRow] -> Maybe [StickerItem] -> Message)
-> Parser (Maybe [ActionRow])
-> Parser (Maybe [StickerItem] -> Message)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe [ActionRow])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"components"
            Parser (Maybe [StickerItem] -> Message)
-> Parser (Maybe [StickerItem]) -> Parser Message
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe [StickerItem])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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
messageId :: Message -> MessageId
messageChannelId :: Message -> ChannelId
messageGuildId :: Message -> Maybe GuildId
messageAuthor :: Message -> User
messageMember :: Message -> Maybe GuildMember
messageContent :: Message -> Text
messageTimestamp :: Message -> UTCTime
messageEdited :: Message -> Maybe UTCTime
messageTts :: Message -> Bool
messageEveryone :: Message -> Bool
messageMentions :: Message -> [User]
messageMentionRoles :: Message -> [RoleId]
messageAttachments :: Message -> [Attachment]
messageEmbeds :: Message -> [Embed]
messageReactions :: Message -> [MessageReaction]
messageNonce :: Message -> Maybe Nonce
messagePinned :: Message -> Bool
messageWebhookId :: Message -> Maybe WebhookId
messageType :: Message -> MessageType
messageActivity :: Message -> Maybe MessageActivity
messageApplicationId :: Message -> Maybe ApplicationId
messageReference :: Message -> Maybe MessageReference
messageFlags :: Message -> Maybe MessageFlags
messageReferencedMessage :: Message -> Maybe Message
messageInteraction :: Message -> Maybe MessageInteraction
messageThread :: Message -> Maybe Channel
messageComponents :: Message -> Maybe [ActionRow]
messageStickerItems :: Message -> Maybe [StickerItem]
messageId :: MessageId
messageChannelId :: ChannelId
messageGuildId :: Maybe GuildId
messageAuthor :: User
messageMember :: Maybe GuildMember
messageContent :: Text
messageTimestamp :: UTCTime
messageEdited :: Maybe UTCTime
messageTts :: Bool
messageEveryone :: Bool
messageMentions :: [User]
messageMentionRoles :: [RoleId]
messageAttachments :: [Attachment]
messageEmbeds :: [Embed]
messageReactions :: [MessageReaction]
messageNonce :: Maybe Nonce
messagePinned :: Bool
messageWebhookId :: Maybe WebhookId
messageType :: MessageType
messageActivity :: Maybe MessageActivity
messageApplicationId :: Maybe ApplicationId
messageReference :: Maybe MessageReference
messageFlags :: Maybe MessageFlags
messageReferencedMessage :: Maybe Message
messageInteraction :: Maybe MessageInteraction
messageThread :: Maybe Channel
messageComponents :: Maybe [ActionRow]
messageStickerItems :: Maybe [StickerItem]
..} = [Maybe Pair] -> Value
objectFromMaybes
      [ Key
"id" Key -> MessageId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== MessageId
messageId
      , Key
"channel_id" Key -> ChannelId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== ChannelId
messageChannelId
      , Key
"guild_id" Key -> Maybe GuildId -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe GuildId
messageGuildId
      , Key
"author" Key -> User -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== User
messageAuthor
      , Key
"member" Key -> Maybe GuildMember -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe GuildMember
messageMember
      , Key
"content" Key -> Text -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Text
messageContent
      , Key
"timestamp" Key -> UTCTime -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== UTCTime
messageTimestamp
      , Key
"edited_timestamp" Key -> Maybe UTCTime -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe UTCTime
messageEdited
      , Key
"tts" Key -> Bool -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Bool
messageTts
      , Key
"mention_everyone" Key -> Bool -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Bool
messageEveryone
      , Key
"mentions" Key -> [User] -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== [User]
messageMentions
      , Key
"mention_roles" Key -> [RoleId] -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== [RoleId]
messageMentionRoles
      , Key
"attachments" Key -> [Attachment] -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== [Attachment]
messageAttachments
      , Key
"embeds" Key -> [Embed] -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== [Embed]
messageEmbeds
      , Key
"reactions" Key -> [MessageReaction] -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== [MessageReaction]
messageReactions
      , Key
"nonce" Key -> Maybe Nonce -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe Nonce
messageNonce
      , Key
"pinned" Key -> Bool -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Bool
messagePinned
      , Key
"webhook_id" Key -> Maybe WebhookId -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe WebhookId
messageWebhookId
      , Key
"type" Key -> MessageType -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== MessageType
messageType
      , Key
"activity" Key -> Maybe MessageActivity -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe MessageActivity
messageActivity
      -- , ("application",            toJSON <$>      messageApplication)
      , Key
"application_id" Key -> Maybe ApplicationId -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe ApplicationId
messageApplicationId
      , Key
"message_reference" Key -> Maybe MessageReference -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe MessageReference
messageReference
      , Key
"flags" Key -> Maybe MessageFlags -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe MessageFlags
messageFlags
      , Key
"referenced_message" Key -> Maybe Message -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe Message
messageReferencedMessage
      , Key
"interaction" Key -> Maybe MessageInteraction -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe MessageInteraction
messageInteraction
      , Key
"thread" Key -> Maybe Channel -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe Channel
messageThread
      , Key
"components" Key -> Maybe [ActionRow] -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe [ActionRow]
messageComponents
      , Key
"sticker_items" Key -> Maybe [StickerItem] -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? 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
$cshowsPrec :: Int -> AllowedMentions -> ShowS
showsPrec :: Int -> AllowedMentions -> ShowS
$cshow :: AllowedMentions -> String
show :: AllowedMentions -> String
$cshowList :: [AllowedMentions] -> ShowS
showList :: [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
$creadsPrec :: Int -> ReadS AllowedMentions
readsPrec :: Int -> ReadS AllowedMentions
$creadList :: ReadS [AllowedMentions]
readList :: ReadS [AllowedMentions]
$creadPrec :: ReadPrec AllowedMentions
readPrec :: ReadPrec AllowedMentions
$creadListPrec :: ReadPrec [AllowedMentions]
readListPrec :: ReadPrec [AllowedMentions]
Read, AllowedMentions -> AllowedMentions -> Bool
(AllowedMentions -> AllowedMentions -> Bool)
-> (AllowedMentions -> AllowedMentions -> Bool)
-> Eq AllowedMentions
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AllowedMentions -> AllowedMentions -> Bool
== :: AllowedMentions -> AllowedMentions -> Bool
$c/= :: AllowedMentions -> AllowedMentions -> Bool
/= :: 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
$ccompare :: AllowedMentions -> AllowedMentions -> Ordering
compare :: AllowedMentions -> AllowedMentions -> Ordering
$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
>= :: AllowedMentions -> AllowedMentions -> Bool
$cmax :: AllowedMentions -> AllowedMentions -> AllowedMentions
max :: AllowedMentions -> AllowedMentions -> AllowedMentions
$cmin :: AllowedMentions -> AllowedMentions -> AllowedMentions
min :: AllowedMentions -> AllowedMentions -> AllowedMentions
Ord)

instance Default AllowedMentions where
  def :: AllowedMentions
def = 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]
mentionEveryone :: AllowedMentions -> Bool
mentionUsers :: AllowedMentions -> Bool
mentionRoles :: AllowedMentions -> Bool
mentionUserIds :: AllowedMentions -> [UserId]
mentionRoleIds :: AllowedMentions -> [RoleId]
mentionRepliedUser :: AllowedMentions -> Bool
mentionEveryone :: Bool
mentionUsers :: Bool
mentionRoles :: Bool
mentionUserIds :: [UserId]
mentionRoleIds :: [RoleId]
mentionRepliedUser :: Bool
..} = [Pair] -> Value
object [
                                 Key
"parse" Key -> [Text] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Text
name :: T.Text | (Text
name, Bool
True) <-
                                    [ (Text
"everyone", Bool
mentionEveryone),
                                      (Text
"users",    Bool
mentionUsers Bool -> Bool -> Bool
&& [UserId] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [UserId]
mentionUserIds),
                                      (Text
"roles",    Bool
mentionRoles Bool -> Bool -> Bool
&& [RoleId] -> Bool
forall a. [a] -> 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
                                 Key
"roles"        Key -> [RoleId] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [RoleId]
mentionRoleIds,
                                 Key
"users"        Key -> [UserId] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [UserId]
mentionUserIds,
                                 Key
"replied_user" Key -> Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> 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
$cshowsPrec :: Int -> MessageReaction -> ShowS
showsPrec :: Int -> MessageReaction -> ShowS
$cshow :: MessageReaction -> String
show :: MessageReaction -> String
$cshowList :: [MessageReaction] -> ShowS
showList :: [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
$creadsPrec :: Int -> ReadS MessageReaction
readsPrec :: Int -> ReadS MessageReaction
$creadList :: ReadS [MessageReaction]
readList :: ReadS [MessageReaction]
$creadPrec :: ReadPrec MessageReaction
readPrec :: ReadPrec MessageReaction
$creadListPrec :: ReadPrec [MessageReaction]
readListPrec :: ReadPrec [MessageReaction]
Read, MessageReaction -> MessageReaction -> Bool
(MessageReaction -> MessageReaction -> Bool)
-> (MessageReaction -> MessageReaction -> Bool)
-> Eq MessageReaction
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MessageReaction -> MessageReaction -> Bool
== :: MessageReaction -> MessageReaction -> Bool
$c/= :: MessageReaction -> MessageReaction -> Bool
/= :: 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
$ccompare :: MessageReaction -> MessageReaction -> Ordering
compare :: MessageReaction -> MessageReaction -> Ordering
$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
>= :: MessageReaction -> MessageReaction -> Bool
$cmax :: MessageReaction -> MessageReaction -> MessageReaction
max :: MessageReaction -> MessageReaction -> MessageReaction
$cmin :: MessageReaction -> MessageReaction -> MessageReaction
min :: MessageReaction -> MessageReaction -> 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 -> Key -> Parser Int
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"count"
                    Parser (Bool -> Emoji -> MessageReaction)
-> Parser Bool -> Parser (Emoji -> MessageReaction)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Bool
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"me"
                    Parser (Emoji -> MessageReaction)
-> Parser Emoji -> Parser MessageReaction
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Emoji
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"emoji"

instance ToJSON MessageReaction where
  toJSON :: MessageReaction -> Value
toJSON MessageReaction{Bool
Int
Emoji
messageReactionCount :: MessageReaction -> Int
messageReactionMeIncluded :: MessageReaction -> Bool
messageReactionEmoji :: MessageReaction -> Emoji
messageReactionCount :: Int
messageReactionMeIncluded :: Bool
messageReactionEmoji :: Emoji
..} = [Maybe Pair] -> Value
objectFromMaybes
      [ Key
"count" Key -> Int -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Int
messageReactionCount
      , Key
"me" Key -> Bool -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Bool
messageReactionMeIncluded
      , Key
"emoji" Key -> Emoji -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== 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
$cshowsPrec :: Int -> Attachment -> ShowS
showsPrec :: Int -> Attachment -> ShowS
$cshow :: Attachment -> String
show :: Attachment -> String
$cshowList :: [Attachment] -> ShowS
showList :: [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
$creadsPrec :: Int -> ReadS Attachment
readsPrec :: Int -> ReadS Attachment
$creadList :: ReadS [Attachment]
readList :: ReadS [Attachment]
$creadPrec :: ReadPrec Attachment
readPrec :: ReadPrec Attachment
$creadListPrec :: ReadPrec [Attachment]
readListPrec :: ReadPrec [Attachment]
Read, Attachment -> Attachment -> Bool
(Attachment -> Attachment -> Bool)
-> (Attachment -> Attachment -> Bool) -> Eq Attachment
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Attachment -> Attachment -> Bool
== :: Attachment -> Attachment -> Bool
$c/= :: Attachment -> Attachment -> Bool
/= :: 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
$ccompare :: Attachment -> Attachment -> Ordering
compare :: Attachment -> Attachment -> Ordering
$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
>= :: Attachment -> Attachment -> Bool
$cmax :: Attachment -> Attachment -> Attachment
max :: Attachment -> Attachment -> Attachment
$cmin :: Attachment -> Attachment -> Attachment
min :: Attachment -> Attachment -> 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 -> Key -> Parser AttachmentId
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"id"
               Parser
  (Text
   -> Integer
   -> Text
   -> Text
   -> Maybe Integer
   -> Maybe Integer
   -> Attachment)
-> Parser Text
-> Parser
     (Integer
      -> Text -> Text -> Maybe Integer -> Maybe Integer -> Attachment)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"filename"
               Parser
  (Integer
   -> Text -> Text -> Maybe Integer -> Maybe Integer -> Attachment)
-> Parser Integer
-> Parser
     (Text -> Text -> Maybe Integer -> Maybe Integer -> Attachment)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"size"
               Parser
  (Text -> Text -> Maybe Integer -> Maybe Integer -> Attachment)
-> Parser Text
-> Parser (Text -> Maybe Integer -> Maybe Integer -> Attachment)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"url"
               Parser (Text -> Maybe Integer -> Maybe Integer -> Attachment)
-> Parser Text
-> Parser (Maybe Integer -> Maybe Integer -> Attachment)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"proxy_url"
               Parser (Maybe Integer -> Maybe Integer -> Attachment)
-> Parser (Maybe Integer) -> Parser (Maybe Integer -> Attachment)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"height"
               Parser (Maybe Integer -> Attachment)
-> Parser (Maybe Integer) -> Parser Attachment
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"width"

instance ToJSON Attachment where
  toJSON :: Attachment -> Value
toJSON Attachment {Integer
Maybe Integer
Text
AttachmentId
attachmentId :: Attachment -> AttachmentId
attachmentFilename :: Attachment -> Text
attachmentSize :: Attachment -> Integer
attachmentUrl :: Attachment -> Text
attachmentProxy :: Attachment -> Text
attachmentHeight :: Attachment -> Maybe Integer
attachmentWidth :: Attachment -> Maybe Integer
attachmentId :: AttachmentId
attachmentFilename :: Text
attachmentSize :: Integer
attachmentUrl :: Text
attachmentProxy :: Text
attachmentHeight :: Maybe Integer
attachmentWidth :: Maybe Integer
..} = [Maybe Pair] -> Value
objectFromMaybes
      [ Key
"id" Key -> AttachmentId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== AttachmentId
attachmentId
      , Key
"filename" Key -> Text -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Text
attachmentFilename
      , Key
"size" Key -> Integer -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Integer
attachmentSize
      , Key
"url" Key -> Text -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Text
attachmentUrl
      , Key
"proxy_url" Key -> Text -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Text
attachmentProxy
      , Key
"height" Key -> Maybe Integer -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe Integer
attachmentHeight
      , Key
"width" Key -> Maybe Integer -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? 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
$cshowsPrec :: Int -> Nonce -> ShowS
showsPrec :: Int -> Nonce -> ShowS
$cshow :: Nonce -> String
show :: Nonce -> String
$cshowList :: [Nonce] -> ShowS
showList :: [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
$creadsPrec :: Int -> ReadS Nonce
readsPrec :: Int -> ReadS Nonce
$creadList :: ReadS [Nonce]
readList :: ReadS [Nonce]
$creadPrec :: ReadPrec Nonce
readPrec :: ReadPrec Nonce
$creadListPrec :: ReadPrec [Nonce]
readListPrec :: ReadPrec [Nonce]
Read, Nonce -> Nonce -> Bool
(Nonce -> Nonce -> Bool) -> (Nonce -> Nonce -> Bool) -> Eq Nonce
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Nonce -> Nonce -> Bool
== :: Nonce -> Nonce -> Bool
$c/= :: Nonce -> Nonce -> Bool
/= :: 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
$ccompare :: Nonce -> Nonce -> Ordering
compare :: Nonce -> Nonce -> Ordering
$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
>= :: Nonce -> Nonce -> Bool
$cmax :: Nonce -> Nonce -> Nonce
max :: Nonce -> Nonce -> Nonce
$cmin :: Nonce -> Nonce -> Nonce
min :: Nonce -> Nonce -> Nonce
Ord)

instance FromJSON Nonce where
  parseJSON :: Value -> Parser Nonce
parseJSON (String Text
nonce) = Nonce -> Parser Nonce
forall a. a -> Parser a
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 a. a -> Parser a
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 a. Parser a
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
$cshowsPrec :: Int -> MessageReference -> ShowS
showsPrec :: Int -> MessageReference -> ShowS
$cshow :: MessageReference -> String
show :: MessageReference -> String
$cshowList :: [MessageReference] -> ShowS
showList :: [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
$creadsPrec :: Int -> ReadS MessageReference
readsPrec :: Int -> ReadS MessageReference
$creadList :: ReadS [MessageReference]
readList :: ReadS [MessageReference]
$creadPrec :: ReadPrec MessageReference
readPrec :: ReadPrec MessageReference
$creadListPrec :: ReadPrec [MessageReference]
readListPrec :: ReadPrec [MessageReference]
Read, MessageReference -> MessageReference -> Bool
(MessageReference -> MessageReference -> Bool)
-> (MessageReference -> MessageReference -> Bool)
-> Eq MessageReference
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MessageReference -> MessageReference -> Bool
== :: MessageReference -> MessageReference -> Bool
$c/= :: MessageReference -> MessageReference -> Bool
/= :: 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
$ccompare :: MessageReference -> MessageReference -> Ordering
compare :: MessageReference -> MessageReference -> Ordering
$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
>= :: MessageReference -> MessageReference -> Bool
$cmax :: MessageReference -> MessageReference -> MessageReference
max :: MessageReference -> MessageReference -> MessageReference
$cmin :: MessageReference -> MessageReference -> MessageReference
min :: MessageReference -> MessageReference -> 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 -> Key -> Parser (Maybe MessageId)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"message_id"
                     Parser
  (Maybe ChannelId -> Maybe GuildId -> Bool -> MessageReference)
-> Parser (Maybe ChannelId)
-> Parser (Maybe GuildId -> Bool -> MessageReference)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe ChannelId)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"channel_id"
                     Parser (Maybe GuildId -> Bool -> MessageReference)
-> Parser (Maybe GuildId) -> Parser (Bool -> MessageReference)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe GuildId)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"guild_id"
                     Parser (Bool -> MessageReference)
-> Parser Bool -> Parser MessageReference
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"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
referenceMessageId :: MessageReference -> Maybe MessageId
referenceChannelId :: MessageReference -> Maybe ChannelId
referenceGuildId :: MessageReference -> Maybe GuildId
failIfNotExists :: MessageReference -> Bool
referenceMessageId :: Maybe MessageId
referenceChannelId :: Maybe ChannelId
referenceGuildId :: Maybe GuildId
failIfNotExists :: Bool
..} = [Maybe Pair] -> Value
objectFromMaybes
              [ Key
"message_id" Key -> Maybe MessageId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Maybe MessageId
referenceMessageId
              , Key
"channel_id" Key -> Maybe ChannelId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Maybe ChannelId
referenceChannelId
              , Key
"guild_id" Key -> Maybe GuildId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Maybe GuildId
referenceGuildId
              , Key
"fail_if_not_exists" Key -> Bool -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Bool
failIfNotExists
              ]

instance Default MessageReference where
  def :: MessageReference
def = 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
$cshowsPrec :: Int -> MessageType -> ShowS
showsPrec :: Int -> MessageType -> ShowS
$cshow :: MessageType -> String
show :: MessageType -> String
$cshowList :: [MessageType] -> ShowS
showList :: [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
$creadsPrec :: Int -> ReadS MessageType
readsPrec :: Int -> ReadS MessageType
$creadList :: ReadS [MessageType]
readList :: ReadS [MessageType]
$creadPrec :: ReadPrec MessageType
readPrec :: ReadPrec MessageType
$creadListPrec :: ReadPrec [MessageType]
readListPrec :: ReadPrec [MessageType]
Read, Typeable MessageType
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 -> Constr
MessageType -> DataType
(forall b. Data b => b -> b) -> MessageType -> 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)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MessageType -> c MessageType
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MessageType -> c MessageType
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageType
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageType
$ctoConstr :: MessageType -> Constr
toConstr :: MessageType -> Constr
$cdataTypeOf :: MessageType -> DataType
dataTypeOf :: MessageType -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c MessageType)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c MessageType)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MessageType)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MessageType)
$cgmapT :: (forall b. Data b => b -> b) -> MessageType -> MessageType
gmapT :: (forall b. Data b => b -> b) -> MessageType -> MessageType
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> MessageType -> r
gmapQl :: forall r r'.
(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
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> MessageType -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> MessageType -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> MessageType -> [u]
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> MessageType -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> MessageType -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> MessageType -> m MessageType
gmapM :: forall (m :: * -> *).
Monad m =>
(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
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(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
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> MessageType -> m MessageType
Data, MessageType -> MessageType -> Bool
(MessageType -> MessageType -> Bool)
-> (MessageType -> MessageType -> Bool) -> Eq MessageType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MessageType -> MessageType -> Bool
== :: MessageType -> MessageType -> Bool
$c/= :: MessageType -> MessageType -> Bool
/= :: 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
$ccompare :: MessageType -> MessageType -> Ordering
compare :: MessageType -> MessageType -> Ordering
$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
>= :: MessageType -> MessageType -> Bool
$cmax :: MessageType -> MessageType -> MessageType
max :: MessageType -> MessageType -> MessageType
$cmin :: MessageType -> MessageType -> MessageType
min :: MessageType -> MessageType -> 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
$cshowsPrec :: Int -> MessageActivity -> ShowS
showsPrec :: Int -> MessageActivity -> ShowS
$cshow :: MessageActivity -> String
show :: MessageActivity -> String
$cshowList :: [MessageActivity] -> ShowS
showList :: [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
$creadsPrec :: Int -> ReadS MessageActivity
readsPrec :: Int -> ReadS MessageActivity
$creadList :: ReadS [MessageActivity]
readList :: ReadS [MessageActivity]
$creadPrec :: ReadPrec MessageActivity
readPrec :: ReadPrec MessageActivity
$creadListPrec :: ReadPrec [MessageActivity]
readListPrec :: ReadPrec [MessageActivity]
Read, Typeable MessageActivity
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 -> Constr
MessageActivity -> DataType
(forall b. Data b => b -> b) -> MessageActivity -> 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)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MessageActivity -> c MessageActivity
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MessageActivity -> c MessageActivity
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageActivity
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageActivity
$ctoConstr :: MessageActivity -> Constr
toConstr :: MessageActivity -> Constr
$cdataTypeOf :: MessageActivity -> DataType
dataTypeOf :: MessageActivity -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c MessageActivity)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c MessageActivity)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MessageActivity)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MessageActivity)
$cgmapT :: (forall b. Data b => b -> b) -> MessageActivity -> MessageActivity
gmapT :: (forall b. Data b => b -> b) -> MessageActivity -> MessageActivity
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> MessageActivity -> r
gmapQl :: forall r r'.
(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
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> MessageActivity -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> MessageActivity -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> MessageActivity -> [u]
$cgmapQi :: forall u.
Int -> (forall d. Data d => d -> u) -> MessageActivity -> u
gmapQi :: forall u.
Int -> (forall d. Data d => d -> u) -> MessageActivity -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> MessageActivity -> m MessageActivity
gmapM :: forall (m :: * -> *).
Monad m =>
(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
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(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
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> MessageActivity -> m MessageActivity
Data, MessageActivity -> MessageActivity -> Bool
(MessageActivity -> MessageActivity -> Bool)
-> (MessageActivity -> MessageActivity -> Bool)
-> Eq MessageActivity
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MessageActivity -> MessageActivity -> Bool
== :: MessageActivity -> MessageActivity -> Bool
$c/= :: MessageActivity -> MessageActivity -> Bool
/= :: 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
$ccompare :: MessageActivity -> MessageActivity -> Ordering
compare :: MessageActivity -> MessageActivity -> Ordering
$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
>= :: MessageActivity -> MessageActivity -> Bool
$cmax :: MessageActivity -> MessageActivity -> MessageActivity
max :: MessageActivity -> MessageActivity -> MessageActivity
$cmin :: MessageActivity -> MessageActivity -> MessageActivity
min :: MessageActivity -> MessageActivity -> 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 -> Key -> Parser MessageActivityType
forall a. FromJSON a => Object -> Key -> Parser a
.:   Key
"type"
                     Parser (Maybe Text -> MessageActivity)
-> Parser (Maybe Text) -> Parser MessageActivity
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"party_id"

instance ToJSON MessageActivity where
  toJSON :: MessageActivity -> Value
toJSON MessageActivity{Maybe Text
MessageActivityType
messageActivityType :: MessageActivity -> MessageActivityType
messageActivityPartyId :: MessageActivity -> Maybe Text
messageActivityType :: MessageActivityType
messageActivityPartyId :: Maybe Text
..} = [Maybe Pair] -> Value
objectFromMaybes
              [ Key
"type" Key -> MessageActivityType -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== MessageActivityType
messageActivityType
              , Key
"party_id" Key -> Maybe Text -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? 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
$cshowsPrec :: Int -> MessageActivityType -> ShowS
showsPrec :: Int -> MessageActivityType -> ShowS
$cshow :: MessageActivityType -> String
show :: MessageActivityType -> String
$cshowList :: [MessageActivityType] -> ShowS
showList :: [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
$creadsPrec :: Int -> ReadS MessageActivityType
readsPrec :: Int -> ReadS MessageActivityType
$creadList :: ReadS [MessageActivityType]
readList :: ReadS [MessageActivityType]
$creadPrec :: ReadPrec MessageActivityType
readPrec :: ReadPrec MessageActivityType
$creadListPrec :: ReadPrec [MessageActivityType]
readListPrec :: ReadPrec [MessageActivityType]
Read, Typeable MessageActivityType
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 -> Constr
MessageActivityType -> DataType
(forall b. Data b => b -> b)
-> MessageActivityType -> 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)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g)
-> MessageActivityType
-> c MessageActivityType
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g)
-> MessageActivityType
-> c MessageActivityType
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageActivityType
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageActivityType
$ctoConstr :: MessageActivityType -> Constr
toConstr :: MessageActivityType -> Constr
$cdataTypeOf :: MessageActivityType -> DataType
dataTypeOf :: MessageActivityType -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c MessageActivityType)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c MessageActivityType)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MessageActivityType)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MessageActivityType)
$cgmapT :: (forall b. Data b => b -> b)
-> MessageActivityType -> MessageActivityType
gmapT :: (forall b. Data b => b -> b)
-> MessageActivityType -> MessageActivityType
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> MessageActivityType -> r
gmapQl :: forall r r'.
(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
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> MessageActivityType -> r
$cgmapQ :: forall u.
(forall d. Data d => d -> u) -> MessageActivityType -> [u]
gmapQ :: forall u.
(forall d. Data d => d -> u) -> MessageActivityType -> [u]
$cgmapQi :: forall u.
Int -> (forall d. Data d => d -> u) -> MessageActivityType -> u
gmapQi :: forall u.
Int -> (forall d. Data d => d -> u) -> MessageActivityType -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> MessageActivityType -> m MessageActivityType
gmapM :: forall (m :: * -> *).
Monad m =>
(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
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(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
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> MessageActivityType -> m MessageActivityType
Data, MessageActivityType -> MessageActivityType -> Bool
(MessageActivityType -> MessageActivityType -> Bool)
-> (MessageActivityType -> MessageActivityType -> Bool)
-> Eq MessageActivityType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MessageActivityType -> MessageActivityType -> Bool
== :: MessageActivityType -> MessageActivityType -> Bool
$c/= :: MessageActivityType -> MessageActivityType -> Bool
/= :: 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
$ccompare :: MessageActivityType -> MessageActivityType -> Ordering
compare :: MessageActivityType -> MessageActivityType -> Ordering
$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
>= :: MessageActivityType -> MessageActivityType -> Bool
$cmax :: MessageActivityType -> MessageActivityType -> MessageActivityType
max :: MessageActivityType -> MessageActivityType -> MessageActivityType
$cmin :: MessageActivityType -> MessageActivityType -> MessageActivityType
min :: MessageActivityType -> MessageActivityType -> 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
$cshowsPrec :: Int -> MessageFlag -> ShowS
showsPrec :: Int -> MessageFlag -> ShowS
$cshow :: MessageFlag -> String
show :: MessageFlag -> String
$cshowList :: [MessageFlag] -> ShowS
showList :: [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
$creadsPrec :: Int -> ReadS MessageFlag
readsPrec :: Int -> ReadS MessageFlag
$creadList :: ReadS [MessageFlag]
readList :: ReadS [MessageFlag]
$creadPrec :: ReadPrec MessageFlag
readPrec :: ReadPrec MessageFlag
$creadListPrec :: ReadPrec [MessageFlag]
readListPrec :: ReadPrec [MessageFlag]
Read, MessageFlag -> MessageFlag -> Bool
(MessageFlag -> MessageFlag -> Bool)
-> (MessageFlag -> MessageFlag -> Bool) -> Eq MessageFlag
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MessageFlag -> MessageFlag -> Bool
== :: MessageFlag -> MessageFlag -> Bool
$c/= :: MessageFlag -> MessageFlag -> Bool
/= :: MessageFlag -> MessageFlag -> Bool
Eq, Typeable MessageFlag
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 -> Constr
MessageFlag -> DataType
(forall b. Data b => b -> b) -> MessageFlag -> 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)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MessageFlag -> c MessageFlag
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MessageFlag -> c MessageFlag
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageFlag
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MessageFlag
$ctoConstr :: MessageFlag -> Constr
toConstr :: MessageFlag -> Constr
$cdataTypeOf :: MessageFlag -> DataType
dataTypeOf :: MessageFlag -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c MessageFlag)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c MessageFlag)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MessageFlag)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MessageFlag)
$cgmapT :: (forall b. Data b => b -> b) -> MessageFlag -> MessageFlag
gmapT :: (forall b. Data b => b -> b) -> MessageFlag -> MessageFlag
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> MessageFlag -> r
gmapQl :: forall r r'.
(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
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> MessageFlag -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> MessageFlag -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> MessageFlag -> [u]
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> MessageFlag -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> MessageFlag -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> MessageFlag -> m MessageFlag
gmapM :: forall (m :: * -> *).
Monad m =>
(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
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(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
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> MessageFlag -> m 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
$ccompare :: MessageFlag -> MessageFlag -> Ordering
compare :: MessageFlag -> MessageFlag -> Ordering
$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
>= :: MessageFlag -> MessageFlag -> Bool
$cmax :: MessageFlag -> MessageFlag -> MessageFlag
max :: MessageFlag -> MessageFlag -> MessageFlag
$cmin :: MessageFlag -> MessageFlag -> MessageFlag
min :: MessageFlag -> MessageFlag -> 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
$cshowsPrec :: Int -> MessageFlags -> ShowS
showsPrec :: Int -> MessageFlags -> ShowS
$cshow :: MessageFlags -> String
show :: MessageFlags -> String
$cshowList :: [MessageFlags] -> ShowS
showList :: [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
$creadsPrec :: Int -> ReadS MessageFlags
readsPrec :: Int -> ReadS MessageFlags
$creadList :: ReadS [MessageFlags]
readList :: ReadS [MessageFlags]
$creadPrec :: ReadPrec MessageFlags
readPrec :: ReadPrec MessageFlags
$creadListPrec :: ReadPrec [MessageFlags]
readListPrec :: ReadPrec [MessageFlags]
Read, MessageFlags -> MessageFlags -> Bool
(MessageFlags -> MessageFlags -> Bool)
-> (MessageFlags -> MessageFlags -> Bool) -> Eq MessageFlags
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MessageFlags -> MessageFlags -> Bool
== :: MessageFlags -> MessageFlags -> Bool
$c/= :: MessageFlags -> MessageFlags -> Bool
/= :: 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
$ccompare :: MessageFlags -> MessageFlags -> Ordering
compare :: MessageFlags -> MessageFlags -> Ordering
$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
>= :: MessageFlags -> MessageFlags -> Bool
$cmax :: MessageFlags -> MessageFlags -> MessageFlags
max :: MessageFlags -> MessageFlags -> MessageFlags
$cmin :: MessageFlags -> MessageFlags -> MessageFlags
min :: MessageFlags -> MessageFlags -> 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 a b. (a -> b -> b) -> b -> [a] -> b
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 b. Integral b => Scientific -> b
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 a. a -> Parser a
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
$cshowsPrec :: Int -> MessageInteraction -> ShowS
showsPrec :: Int -> MessageInteraction -> ShowS
$cshow :: MessageInteraction -> String
show :: MessageInteraction -> String
$cshowList :: [MessageInteraction] -> ShowS
showList :: [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
$creadsPrec :: Int -> ReadS MessageInteraction
readsPrec :: Int -> ReadS MessageInteraction
$creadList :: ReadS [MessageInteraction]
readList :: ReadS [MessageInteraction]
$creadPrec :: ReadPrec MessageInteraction
readPrec :: ReadPrec MessageInteraction
$creadListPrec :: ReadPrec [MessageInteraction]
readListPrec :: ReadPrec [MessageInteraction]
Read, MessageInteraction -> MessageInteraction -> Bool
(MessageInteraction -> MessageInteraction -> Bool)
-> (MessageInteraction -> MessageInteraction -> Bool)
-> Eq MessageInteraction
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MessageInteraction -> MessageInteraction -> Bool
== :: MessageInteraction -> MessageInteraction -> Bool
$c/= :: MessageInteraction -> MessageInteraction -> Bool
/= :: 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
$ccompare :: MessageInteraction -> MessageInteraction -> Ordering
compare :: MessageInteraction -> MessageInteraction -> Ordering
$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
>= :: MessageInteraction -> MessageInteraction -> Bool
$cmax :: MessageInteraction -> MessageInteraction -> MessageInteraction
max :: MessageInteraction -> MessageInteraction -> MessageInteraction
$cmin :: MessageInteraction -> MessageInteraction -> MessageInteraction
min :: MessageInteraction -> MessageInteraction -> MessageInteraction
Ord)

instance ToJSON MessageInteraction where
  toJSON :: MessageInteraction -> Value
toJSON MessageInteraction{Integer
Text
InteractionId
User
messageInteractionId :: MessageInteraction -> InteractionId
messageInteractionType :: MessageInteraction -> Integer
messageInteractionName :: MessageInteraction -> Text
messageInteractionUser :: MessageInteraction -> User
messageInteractionId :: InteractionId
messageInteractionType :: Integer
messageInteractionName :: Text
messageInteractionUser :: User
..} = [Maybe Pair] -> Value
objectFromMaybes
              [ Key
"id"   Key -> InteractionId -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== InteractionId
messageInteractionId
              , Key
"type" Key -> Integer -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Integer
messageInteractionType
              , Key
"name" Key -> Text -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Text
messageInteractionName
              , Key
"user" Key -> User -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== 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 -> Key -> Parser InteractionId
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"id"
                       Parser (Integer -> Text -> User -> MessageInteraction)
-> Parser Integer -> Parser (Text -> User -> MessageInteraction)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"type"
                       Parser (Text -> User -> MessageInteraction)
-> Parser Text -> Parser (User -> MessageInteraction)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"name"
                       Parser (User -> MessageInteraction)
-> Parser User -> Parser MessageInteraction
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser User
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"user"