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

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

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

import Discord.Internal.Types.Prelude
import Discord.Internal.Types.User (User(..), GuildMember)
import Discord.Internal.Types.Embed
import Discord.Internal.Types.Components (ComponentActionRow)
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 -> ChannelId
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 ChannelId
channelLastMessage :: Maybe MessageId   -- ^ The id of the last message sent in the
                                                --   channel
      , Channel -> Maybe ChannelId
channelParentId    :: Maybe ParentId    -- ^ The id of the parent channel (category)
      }
  | ChannelNews
      { channelId          :: ChannelId
      , channelGuild       :: GuildId
      , channelName        :: T.Text
      , channelPosition    :: Integer
      , channelPermissions :: [Overwrite]
      , channelNSFW        :: Bool
      , channelTopic       :: T.Text
      , channelLastMessage :: Maybe MessageId
      }
  | ChannelStorePage
      { channelId          :: ChannelId
      , channelGuild       :: GuildId
      , channelName        :: T.Text
      , channelPosition    :: Integer
      , channelNSFW        :: Bool
      , channelPermissions :: [Overwrite]
      , channelParentId    :: Maybe ParentId
      }
  -- | A voice channel in a guild.
  | ChannelVoice
      { channelId          :: ChannelId
      , channelGuild       :: GuildId
      , channelName        :: T.Text
      , channelPosition    :: Integer
      , channelPermissions :: [Overwrite]
      , channelNSFW        :: Bool
      , Channel -> Integer
channelBitRate     :: Integer     -- ^ The bitrate (in bits) of the channel.
      , Channel -> Integer
channelUserLimit   :: Integer     -- ^ The user limit of the voice channel.
      , channelParentId    :: Maybe ParentId
      }
  -- | DM Channels represent a one-to-one conversation between two users, outside the scope
  --   of guilds
  | ChannelDirectMessage
      { channelId          :: ChannelId
      , Channel -> [User]
channelRecipients  :: [User]      -- ^ The 'User' object(s) of the DM recipient(s).
      , channelLastMessage :: Maybe MessageId
      }
  | ChannelGroupDM
      { channelId          :: ChannelId
      , channelRecipients  :: [User]
      , channelLastMessage :: Maybe MessageId
      }
  | ChannelGuildCategory
      { channelId          :: ChannelId
      , channelGuild       :: GuildId
      , channelName        :: T.Text
      , channelPosition    :: Integer
      , channelPermissions :: [Overwrite]
      }
  | ChannelStage
      { channelId          :: ChannelId
      , channelGuild       :: GuildId
      , Channel -> ChannelId
channelStageId     :: StageId
      , Channel -> Text
channelStageTopic  :: Text
      }
  | 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 (category)
      , 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
      }
  | 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 (category)
      , channelThreadMetadata :: Maybe ThreadMetadata -- ^ Metadata about this thread
      , channelThreadMember :: Maybe ThreadMember -- ^ Used to indicate if the user has joined the 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 (category)
      , channelThreadMetadata :: Maybe ThreadMetadata -- ^ Metadata about this thread
      , channelThreadMember :: Maybe ThreadMember -- ^ Used to indicate if the user has joined the thread
      }
  | ChannelUnknownType
      { channelId          :: ChannelId
      , Channel -> Text
channelJSON        :: Text
      } deriving (Int -> Channel -> ShowS
[Channel] -> ShowS
Channel -> String
(Int -> Channel -> ShowS)
-> (Channel -> String) -> ([Channel] -> ShowS) -> Show Channel
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Channel] -> ShowS
$cshowList :: [Channel] -> ShowS
show :: Channel -> String
$cshow :: Channel -> String
showsPrec :: Int -> Channel -> ShowS
$cshowsPrec :: Int -> Channel -> ShowS
Show, ReadPrec [Channel]
ReadPrec Channel
Int -> ReadS Channel
ReadS [Channel]
(Int -> ReadS Channel)
-> ReadS [Channel]
-> ReadPrec Channel
-> ReadPrec [Channel]
-> Read Channel
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Channel]
$creadListPrec :: ReadPrec [Channel]
readPrec :: ReadPrec Channel
$creadPrec :: ReadPrec Channel
readList :: ReadS [Channel]
$creadList :: ReadS [Channel]
readsPrec :: Int -> ReadS Channel
$creadsPrec :: Int -> ReadS Channel
Read, Channel -> Channel -> Bool
(Channel -> Channel -> Bool)
-> (Channel -> Channel -> Bool) -> Eq Channel
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Channel -> Channel -> Bool
$c/= :: Channel -> Channel -> Bool
== :: Channel -> Channel -> Bool
$c== :: Channel -> Channel -> Bool
Eq, Eq Channel
Eq Channel
-> (Channel -> Channel -> Ordering)
-> (Channel -> Channel -> Bool)
-> (Channel -> Channel -> Bool)
-> (Channel -> Channel -> Bool)
-> (Channel -> Channel -> Bool)
-> (Channel -> Channel -> Channel)
-> (Channel -> Channel -> Channel)
-> Ord Channel
Channel -> Channel -> Bool
Channel -> Channel -> Ordering
Channel -> Channel -> Channel
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Channel -> Channel -> Channel
$cmin :: Channel -> Channel -> Channel
max :: Channel -> Channel -> Channel
$cmax :: Channel -> Channel -> Channel
>= :: Channel -> Channel -> Bool
$c>= :: Channel -> Channel -> Bool
> :: Channel -> Channel -> Bool
$c> :: Channel -> Channel -> Bool
<= :: Channel -> Channel -> Bool
$c<= :: Channel -> Channel -> Bool
< :: Channel -> Channel -> Bool
$c< :: Channel -> Channel -> Bool
compare :: Channel -> Channel -> Ordering
$ccompare :: Channel -> Channel -> Ordering
$cp1Ord :: Eq Channel
Ord)

instance FromJSON Channel where
  parseJSON :: Value -> Parser Channel
parseJSON = String -> (Object -> Parser Channel) -> Value -> Parser Channel
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"Channel" ((Object -> Parser Channel) -> Value -> Parser Channel)
-> (Object -> Parser Channel) -> Value -> Parser Channel
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
    Int
type' <- (Object
o Object -> Key -> Parser Int
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"type") :: Parser Int
    case Int
type' of
      Int
0 ->
        ChannelId
-> ChannelId
-> Text
-> Integer
-> [Overwrite]
-> Integer
-> Bool
-> Text
-> Maybe ChannelId
-> Maybe ChannelId
-> Channel
ChannelText  (ChannelId
 -> ChannelId
 -> Text
 -> Integer
 -> [Overwrite]
 -> Integer
 -> Bool
 -> Text
 -> Maybe ChannelId
 -> Maybe ChannelId
 -> Channel)
-> Parser ChannelId
-> Parser
     (ChannelId
      -> Text
      -> Integer
      -> [Overwrite]
      -> Integer
      -> Bool
      -> Text
      -> Maybe ChannelId
      -> Maybe ChannelId
      -> 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
  (ChannelId
   -> Text
   -> Integer
   -> [Overwrite]
   -> Integer
   -> Bool
   -> Text
   -> Maybe ChannelId
   -> Maybe ChannelId
   -> Channel)
-> Parser ChannelId
-> Parser
     (Text
      -> Integer
      -> [Overwrite]
      -> Integer
      -> Bool
      -> Text
      -> Maybe ChannelId
      -> Maybe ChannelId
      -> Channel)
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
"guild_id" Parser (Maybe ChannelId) -> ChannelId -> Parser ChannelId
forall a. Parser (Maybe a) -> a -> Parser a
.!= ChannelId
0
                     Parser
  (Text
   -> Integer
   -> [Overwrite]
   -> Integer
   -> Bool
   -> Text
   -> Maybe ChannelId
   -> Maybe ChannelId
   -> Channel)
-> Parser Text
-> Parser
     (Integer
      -> [Overwrite]
      -> Integer
      -> Bool
      -> Text
      -> Maybe ChannelId
      -> Maybe ChannelId
      -> Channel)
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 ChannelId
   -> Maybe ChannelId
   -> Channel)
-> Parser Integer
-> Parser
     ([Overwrite]
      -> Integer
      -> Bool
      -> Text
      -> Maybe ChannelId
      -> Maybe ChannelId
      -> Channel)
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 ChannelId
   -> Maybe ChannelId
   -> Channel)
-> Parser [Overwrite]
-> Parser
     (Integer
      -> Bool -> Text -> Maybe ChannelId -> Maybe ChannelId -> Channel)
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 ChannelId -> Maybe ChannelId -> Channel)
-> Parser Integer
-> Parser
     (Bool -> Text -> Maybe ChannelId -> Maybe ChannelId -> Channel)
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 ChannelId -> Maybe ChannelId -> Channel)
-> Parser Bool
-> Parser (Text -> Maybe ChannelId -> Maybe ChannelId -> Channel)
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 ChannelId -> Maybe ChannelId -> Channel)
-> Parser Text
-> Parser (Maybe ChannelId -> Maybe ChannelId -> Channel)
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 ChannelId -> Maybe ChannelId -> Channel)
-> Parser (Maybe ChannelId) -> Parser (Maybe ChannelId -> Channel)
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
"last_message_id"
                     Parser (Maybe ChannelId -> Channel)
-> Parser (Maybe ChannelId) -> Parser Channel
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
"parent_id"
      Int
1 ->
        ChannelId -> [User] -> Maybe ChannelId -> Channel
ChannelDirectMessage (ChannelId -> [User] -> Maybe ChannelId -> Channel)
-> Parser ChannelId
-> Parser ([User] -> Maybe ChannelId -> 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 ChannelId -> Channel)
-> Parser [User] -> Parser (Maybe ChannelId -> Channel)
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 ChannelId -> Channel)
-> Parser (Maybe ChannelId) -> Parser Channel
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
"last_message_id"
      Int
2 ->
        ChannelId
-> ChannelId
-> Text
-> Integer
-> [Overwrite]
-> Bool
-> Integer
-> Integer
-> Maybe ChannelId
-> Channel
ChannelVoice (ChannelId
 -> ChannelId
 -> Text
 -> Integer
 -> [Overwrite]
 -> Bool
 -> Integer
 -> Integer
 -> Maybe ChannelId
 -> Channel)
-> Parser ChannelId
-> Parser
     (ChannelId
      -> Text
      -> Integer
      -> [Overwrite]
      -> Bool
      -> Integer
      -> Integer
      -> Maybe ChannelId
      -> 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
  (ChannelId
   -> Text
   -> Integer
   -> [Overwrite]
   -> Bool
   -> Integer
   -> Integer
   -> Maybe ChannelId
   -> Channel)
-> Parser ChannelId
-> Parser
     (Text
      -> Integer
      -> [Overwrite]
      -> Bool
      -> Integer
      -> Integer
      -> Maybe ChannelId
      -> Channel)
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
"guild_id" Parser (Maybe ChannelId) -> ChannelId -> Parser ChannelId
forall a. Parser (Maybe a) -> a -> Parser a
.!= ChannelId
0
                     Parser
  (Text
   -> Integer
   -> [Overwrite]
   -> Bool
   -> Integer
   -> Integer
   -> Maybe ChannelId
   -> Channel)
-> Parser Text
-> Parser
     (Integer
      -> [Overwrite]
      -> Bool
      -> Integer
      -> Integer
      -> Maybe ChannelId
      -> Channel)
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 ChannelId
   -> Channel)
-> Parser Integer
-> Parser
     ([Overwrite]
      -> Bool -> Integer -> Integer -> Maybe ChannelId -> Channel)
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 ChannelId -> Channel)
-> Parser [Overwrite]
-> Parser
     (Bool -> Integer -> Integer -> Maybe ChannelId -> Channel)
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 ChannelId -> Channel)
-> Parser Bool
-> Parser (Integer -> Integer -> Maybe ChannelId -> Channel)
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 ChannelId -> Channel)
-> Parser Integer -> Parser (Integer -> Maybe ChannelId -> Channel)
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 ChannelId -> Channel)
-> Parser Integer -> Parser (Maybe ChannelId -> Channel)
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 ChannelId -> Channel)
-> Parser (Maybe ChannelId) -> Parser Channel
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
"parent_id"
      Int
3 ->
        ChannelId -> [User] -> Maybe ChannelId -> Channel
ChannelGroupDM (ChannelId -> [User] -> Maybe ChannelId -> Channel)
-> Parser ChannelId
-> Parser ([User] -> Maybe ChannelId -> 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 ChannelId -> Channel)
-> Parser [User] -> Parser (Maybe ChannelId -> Channel)
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 ChannelId -> Channel)
-> Parser (Maybe ChannelId) -> Parser Channel
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
"last_message_id"
      Int
4 ->
        ChannelId -> ChannelId -> Text -> Integer -> [Overwrite] -> Channel
ChannelGuildCategory (ChannelId
 -> ChannelId -> Text -> Integer -> [Overwrite] -> Channel)
-> Parser ChannelId
-> Parser (ChannelId -> 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 (ChannelId -> Text -> Integer -> [Overwrite] -> Channel)
-> Parser ChannelId
-> Parser (Text -> Integer -> [Overwrite] -> Channel)
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
"guild_id" Parser (Maybe ChannelId) -> ChannelId -> Parser ChannelId
forall a. Parser (Maybe a) -> a -> Parser a
.!= ChannelId
0
                             Parser (Text -> Integer -> [Overwrite] -> Channel)
-> Parser Text -> Parser (Integer -> [Overwrite] -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"name"
                             Parser (Integer -> [Overwrite] -> Channel)
-> Parser Integer -> Parser ([Overwrite] -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"position"
                             Parser ([Overwrite] -> Channel)
-> Parser [Overwrite] -> Parser Channel
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
-> ChannelId
-> Text
-> Integer
-> [Overwrite]
-> Bool
-> Text
-> Maybe ChannelId
-> Channel
ChannelNews (ChannelId
 -> ChannelId
 -> Text
 -> Integer
 -> [Overwrite]
 -> Bool
 -> Text
 -> Maybe ChannelId
 -> Channel)
-> Parser ChannelId
-> Parser
     (ChannelId
      -> Text
      -> Integer
      -> [Overwrite]
      -> Bool
      -> Text
      -> Maybe ChannelId
      -> 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
  (ChannelId
   -> Text
   -> Integer
   -> [Overwrite]
   -> Bool
   -> Text
   -> Maybe ChannelId
   -> Channel)
-> Parser ChannelId
-> Parser
     (Text
      -> Integer
      -> [Overwrite]
      -> Bool
      -> Text
      -> Maybe ChannelId
      -> Channel)
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
"guild_id" Parser (Maybe ChannelId) -> ChannelId -> Parser ChannelId
forall a. Parser (Maybe a) -> a -> Parser a
.!= ChannelId
0
                    Parser
  (Text
   -> Integer
   -> [Overwrite]
   -> Bool
   -> Text
   -> Maybe ChannelId
   -> Channel)
-> Parser Text
-> Parser
     (Integer
      -> [Overwrite] -> Bool -> Text -> Maybe ChannelId -> Channel)
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 ChannelId -> Channel)
-> Parser Integer
-> Parser
     ([Overwrite] -> Bool -> Text -> Maybe ChannelId -> Channel)
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 ChannelId -> Channel)
-> Parser [Overwrite]
-> Parser (Bool -> Text -> Maybe ChannelId -> Channel)
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 ChannelId -> Channel)
-> Parser Bool -> Parser (Text -> Maybe ChannelId -> Channel)
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 ChannelId -> Channel)
-> Parser Text -> Parser (Maybe ChannelId -> Channel)
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 ChannelId -> Channel)
-> Parser (Maybe ChannelId) -> Parser Channel
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
"last_message_id"
      Int
6 ->
        ChannelId
-> ChannelId
-> Text
-> Integer
-> Bool
-> [Overwrite]
-> Maybe ChannelId
-> Channel
ChannelStorePage (ChannelId
 -> ChannelId
 -> Text
 -> Integer
 -> Bool
 -> [Overwrite]
 -> Maybe ChannelId
 -> Channel)
-> Parser ChannelId
-> Parser
     (ChannelId
      -> Text
      -> Integer
      -> Bool
      -> [Overwrite]
      -> Maybe ChannelId
      -> 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
  (ChannelId
   -> Text
   -> Integer
   -> Bool
   -> [Overwrite]
   -> Maybe ChannelId
   -> Channel)
-> Parser ChannelId
-> Parser
     (Text
      -> Integer -> Bool -> [Overwrite] -> Maybe ChannelId -> Channel)
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
"guild_id" Parser (Maybe ChannelId) -> ChannelId -> Parser ChannelId
forall a. Parser (Maybe a) -> a -> Parser a
.!= ChannelId
0
                         Parser
  (Text
   -> Integer -> Bool -> [Overwrite] -> Maybe ChannelId -> Channel)
-> Parser Text
-> Parser
     (Integer -> Bool -> [Overwrite] -> Maybe ChannelId -> Channel)
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 ChannelId -> Channel)
-> Parser Integer
-> Parser (Bool -> [Overwrite] -> Maybe ChannelId -> Channel)
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 ChannelId -> Channel)
-> Parser Bool
-> Parser ([Overwrite] -> Maybe ChannelId -> Channel)
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 ChannelId -> Channel)
-> Parser [Overwrite] -> Parser (Maybe ChannelId -> Channel)
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 ChannelId -> Channel)
-> Parser (Maybe ChannelId) -> Parser Channel
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
"parent_id"
      Int
10 -> ChannelId
-> ChannelId
-> Maybe Text
-> Maybe Integer
-> Maybe ChannelId
-> Maybe ChannelId
-> Maybe ThreadMetadata
-> Maybe ThreadMember
-> Channel
ChannelNewsThread (ChannelId
 -> ChannelId
 -> Maybe Text
 -> Maybe Integer
 -> Maybe ChannelId
 -> Maybe ChannelId
 -> Maybe ThreadMetadata
 -> Maybe ThreadMember
 -> Channel)
-> Parser ChannelId
-> Parser
     (ChannelId
      -> Maybe Text
      -> Maybe Integer
      -> Maybe ChannelId
      -> Maybe ChannelId
      -> 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
  (ChannelId
   -> Maybe Text
   -> Maybe Integer
   -> Maybe ChannelId
   -> Maybe ChannelId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser ChannelId
-> Parser
     (Maybe Text
      -> Maybe Integer
      -> Maybe ChannelId
      -> Maybe ChannelId
      -> Maybe ThreadMetadata
      -> Maybe ThreadMember
      -> Channel)
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
"guild_id" Parser (Maybe ChannelId) -> ChannelId -> Parser ChannelId
forall a. Parser (Maybe a) -> a -> Parser a
.!= ChannelId
0
                              Parser
  (Maybe Text
   -> Maybe Integer
   -> Maybe ChannelId
   -> Maybe ChannelId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser (Maybe Text)
-> Parser
     (Maybe Integer
      -> Maybe ChannelId
      -> Maybe ChannelId
      -> Maybe ThreadMetadata
      -> Maybe ThreadMember
      -> Channel)
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 ChannelId
   -> Maybe ChannelId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser (Maybe Integer)
-> Parser
     (Maybe ChannelId
      -> Maybe ChannelId
      -> Maybe ThreadMetadata
      -> Maybe ThreadMember
      -> Channel)
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 ChannelId
   -> Maybe ChannelId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser (Maybe ChannelId)
-> Parser
     (Maybe ChannelId
      -> Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
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
"last_message_id"
                              Parser
  (Maybe ChannelId
   -> Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
-> Parser (Maybe ChannelId)
-> Parser (Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
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
"parent_id"
                              Parser (Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
-> Parser (Maybe ThreadMetadata)
-> Parser (Maybe ThreadMember -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> 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 (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
-> ChannelId
-> Maybe Text
-> Maybe Integer
-> Maybe ChannelId
-> Maybe ChannelId
-> Maybe ThreadMetadata
-> Maybe ThreadMember
-> Channel
ChannelPublicThread (ChannelId
 -> ChannelId
 -> Maybe Text
 -> Maybe Integer
 -> Maybe ChannelId
 -> Maybe ChannelId
 -> Maybe ThreadMetadata
 -> Maybe ThreadMember
 -> Channel)
-> Parser ChannelId
-> Parser
     (ChannelId
      -> Maybe Text
      -> Maybe Integer
      -> Maybe ChannelId
      -> Maybe ChannelId
      -> 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
  (ChannelId
   -> Maybe Text
   -> Maybe Integer
   -> Maybe ChannelId
   -> Maybe ChannelId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser ChannelId
-> Parser
     (Maybe Text
      -> Maybe Integer
      -> Maybe ChannelId
      -> Maybe ChannelId
      -> Maybe ThreadMetadata
      -> Maybe ThreadMember
      -> Channel)
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
"guild_id" Parser (Maybe ChannelId) -> ChannelId -> Parser ChannelId
forall a. Parser (Maybe a) -> a -> Parser a
.!= ChannelId
0
                                Parser
  (Maybe Text
   -> Maybe Integer
   -> Maybe ChannelId
   -> Maybe ChannelId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser (Maybe Text)
-> Parser
     (Maybe Integer
      -> Maybe ChannelId
      -> Maybe ChannelId
      -> Maybe ThreadMetadata
      -> Maybe ThreadMember
      -> Channel)
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 ChannelId
   -> Maybe ChannelId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser (Maybe Integer)
-> Parser
     (Maybe ChannelId
      -> Maybe ChannelId
      -> Maybe ThreadMetadata
      -> Maybe ThreadMember
      -> Channel)
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 ChannelId
   -> Maybe ChannelId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser (Maybe ChannelId)
-> Parser
     (Maybe ChannelId
      -> Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
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
"last_message_id"
                                Parser
  (Maybe ChannelId
   -> Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
-> Parser (Maybe ChannelId)
-> Parser (Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
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
"parent_id"
                                Parser (Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
-> Parser (Maybe ThreadMetadata)
-> Parser (Maybe ThreadMember -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> 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 (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
-> ChannelId
-> Maybe Text
-> Maybe Integer
-> Maybe ChannelId
-> Maybe ChannelId
-> Maybe ThreadMetadata
-> Maybe ThreadMember
-> Channel
ChannelPrivateThread (ChannelId
 -> ChannelId
 -> Maybe Text
 -> Maybe Integer
 -> Maybe ChannelId
 -> Maybe ChannelId
 -> Maybe ThreadMetadata
 -> Maybe ThreadMember
 -> Channel)
-> Parser ChannelId
-> Parser
     (ChannelId
      -> Maybe Text
      -> Maybe Integer
      -> Maybe ChannelId
      -> Maybe ChannelId
      -> 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
  (ChannelId
   -> Maybe Text
   -> Maybe Integer
   -> Maybe ChannelId
   -> Maybe ChannelId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser ChannelId
-> Parser
     (Maybe Text
      -> Maybe Integer
      -> Maybe ChannelId
      -> Maybe ChannelId
      -> Maybe ThreadMetadata
      -> Maybe ThreadMember
      -> Channel)
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
"guild_id" Parser (Maybe ChannelId) -> ChannelId -> Parser ChannelId
forall a. Parser (Maybe a) -> a -> Parser a
.!= ChannelId
0
                                 Parser
  (Maybe Text
   -> Maybe Integer
   -> Maybe ChannelId
   -> Maybe ChannelId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser (Maybe Text)
-> Parser
     (Maybe Integer
      -> Maybe ChannelId
      -> Maybe ChannelId
      -> Maybe ThreadMetadata
      -> Maybe ThreadMember
      -> Channel)
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 ChannelId
   -> Maybe ChannelId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser (Maybe Integer)
-> Parser
     (Maybe ChannelId
      -> Maybe ChannelId
      -> Maybe ThreadMetadata
      -> Maybe ThreadMember
      -> Channel)
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 ChannelId
   -> Maybe ChannelId
   -> Maybe ThreadMetadata
   -> Maybe ThreadMember
   -> Channel)
-> Parser (Maybe ChannelId)
-> Parser
     (Maybe ChannelId
      -> Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
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
"last_message_id"
                                 Parser
  (Maybe ChannelId
   -> Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
-> Parser (Maybe ChannelId)
-> Parser (Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
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
"parent_id"
                                 Parser (Maybe ThreadMetadata -> Maybe ThreadMember -> Channel)
-> Parser (Maybe ThreadMetadata)
-> Parser (Maybe ThreadMember -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> 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 (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 -> ChannelId -> ChannelId -> Text -> Channel
ChannelStage (ChannelId -> ChannelId -> ChannelId -> Text -> Channel)
-> Parser ChannelId
-> Parser (ChannelId -> ChannelId -> 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 (ChannelId -> ChannelId -> Text -> Channel)
-> Parser ChannelId -> Parser (ChannelId -> Text -> Channel)
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
"guild_id" Parser (Maybe ChannelId) -> ChannelId -> Parser ChannelId
forall a. Parser (Maybe a) -> a -> Parser a
.!= ChannelId
0
                     Parser (ChannelId -> Text -> Channel)
-> Parser ChannelId -> Parser (Text -> Channel)
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
"id"
                     Parser (Text -> Channel) -> Parser Text -> Parser Channel
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 (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Text -> Parser Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure (String -> Text
T.pack (Object -> String
forall a. Show a => a -> String
show Object
o))

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

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

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

instance FromJSON Overwrite where
  parseJSON :: Value -> Parser Overwrite
parseJSON = String -> (Object -> Parser Overwrite) -> Value -> Parser Overwrite
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"Overwrite" ((Object -> Parser Overwrite) -> Value -> Parser Overwrite)
-> (Object -> Parser Overwrite) -> Value -> Parser Overwrite
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    ChannelId -> Integer -> Text -> Text -> Overwrite
Overwrite (ChannelId -> Integer -> Text -> Text -> Overwrite)
-> Parser ChannelId
-> Parser (Integer -> Text -> Text -> Overwrite)
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 (Integer -> Text -> Text -> Overwrite)
-> Parser Integer -> Parser (Text -> Text -> Overwrite)
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 -> Text -> Overwrite)
-> Parser Text -> Parser (Text -> Overwrite)
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
"allow"
              Parser (Text -> Overwrite) -> Parser Text -> Parser Overwrite
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{Integer
Text
ChannelId
overwriteDeny :: Text
overwriteAllow :: Text
overwriteType :: Integer
overwriteId :: ChannelId
overwriteDeny :: Overwrite -> Text
overwriteAllow :: Overwrite -> Text
overwriteType :: Overwrite -> Integer
overwriteId :: Overwrite -> ChannelId
..} = [Pair] -> Value
object
              [ (Key
"id",     ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON ChannelId
overwriteId)
              , (Key
"type",   Integer -> Value
forall a. ToJSON a => a -> Value
toJSON Integer
overwriteType)
              , (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
showList :: [ThreadMetadata] -> ShowS
$cshowList :: [ThreadMetadata] -> ShowS
show :: ThreadMetadata -> String
$cshow :: ThreadMetadata -> String
showsPrec :: Int -> ThreadMetadata -> ShowS
$cshowsPrec :: Int -> ThreadMetadata -> ShowS
Show, ReadPrec [ThreadMetadata]
ReadPrec ThreadMetadata
Int -> ReadS ThreadMetadata
ReadS [ThreadMetadata]
(Int -> ReadS ThreadMetadata)
-> ReadS [ThreadMetadata]
-> ReadPrec ThreadMetadata
-> ReadPrec [ThreadMetadata]
-> Read ThreadMetadata
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ThreadMetadata]
$creadListPrec :: ReadPrec [ThreadMetadata]
readPrec :: ReadPrec ThreadMetadata
$creadPrec :: ReadPrec ThreadMetadata
readList :: ReadS [ThreadMetadata]
$creadList :: ReadS [ThreadMetadata]
readsPrec :: Int -> ReadS ThreadMetadata
$creadsPrec :: Int -> ReadS ThreadMetadata
Read, ThreadMetadata -> ThreadMetadata -> Bool
(ThreadMetadata -> ThreadMetadata -> Bool)
-> (ThreadMetadata -> ThreadMetadata -> Bool) -> Eq ThreadMetadata
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ThreadMetadata -> ThreadMetadata -> Bool
$c/= :: ThreadMetadata -> ThreadMetadata -> Bool
== :: ThreadMetadata -> ThreadMetadata -> Bool
$c== :: ThreadMetadata -> ThreadMetadata -> Bool
Eq, Eq ThreadMetadata
Eq ThreadMetadata
-> (ThreadMetadata -> ThreadMetadata -> Ordering)
-> (ThreadMetadata -> ThreadMetadata -> Bool)
-> (ThreadMetadata -> ThreadMetadata -> Bool)
-> (ThreadMetadata -> ThreadMetadata -> Bool)
-> (ThreadMetadata -> ThreadMetadata -> Bool)
-> (ThreadMetadata -> ThreadMetadata -> ThreadMetadata)
-> (ThreadMetadata -> ThreadMetadata -> ThreadMetadata)
-> Ord ThreadMetadata
ThreadMetadata -> ThreadMetadata -> Bool
ThreadMetadata -> ThreadMetadata -> Ordering
ThreadMetadata -> ThreadMetadata -> ThreadMetadata
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ThreadMetadata -> ThreadMetadata -> ThreadMetadata
$cmin :: ThreadMetadata -> ThreadMetadata -> ThreadMetadata
max :: ThreadMetadata -> ThreadMetadata -> ThreadMetadata
$cmax :: ThreadMetadata -> ThreadMetadata -> ThreadMetadata
>= :: ThreadMetadata -> ThreadMetadata -> Bool
$c>= :: ThreadMetadata -> ThreadMetadata -> Bool
> :: ThreadMetadata -> ThreadMetadata -> Bool
$c> :: ThreadMetadata -> ThreadMetadata -> Bool
<= :: ThreadMetadata -> ThreadMetadata -> Bool
$c<= :: ThreadMetadata -> ThreadMetadata -> Bool
< :: ThreadMetadata -> ThreadMetadata -> Bool
$c< :: ThreadMetadata -> ThreadMetadata -> Bool
compare :: ThreadMetadata -> ThreadMetadata -> Ordering
$ccompare :: ThreadMetadata -> ThreadMetadata -> Ordering
$cp1Ord :: Eq ThreadMetadata
Ord)

instance FromJSON ThreadMetadata where
  parseJSON :: Value -> Parser ThreadMetadata
parseJSON = String
-> (Object -> Parser ThreadMetadata)
-> Value
-> Parser ThreadMetadata
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"ThreadMetadata" ((Object -> Parser ThreadMetadata)
 -> Value -> Parser ThreadMetadata)
-> (Object -> Parser ThreadMetadata)
-> Value
-> Parser ThreadMetadata
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    Bool
-> Integer
-> UTCTime
-> Bool
-> Maybe Bool
-> Maybe UTCTime
-> ThreadMetadata
ThreadMetadata (Bool
 -> Integer
 -> UTCTime
 -> Bool
 -> Maybe Bool
 -> Maybe UTCTime
 -> ThreadMetadata)
-> Parser Bool
-> Parser
     (Integer
      -> UTCTime
      -> Bool
      -> Maybe Bool
      -> Maybe UTCTime
      -> ThreadMetadata)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> 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 (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 (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 (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 (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 (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
threadMetadataCreateTime :: Maybe UTCTime
threadMetadataInvitable :: Maybe Bool
threadMetadataLocked :: Bool
threadMetadataArchiveTime :: UTCTime
threadMetadataAutoArchive :: Integer
threadMetadataArchived :: Bool
threadMetadataCreateTime :: ThreadMetadata -> Maybe UTCTime
threadMetadataInvitable :: ThreadMetadata -> Maybe Bool
threadMetadataLocked :: ThreadMetadata -> Bool
threadMetadataArchiveTime :: ThreadMetadata -> UTCTime
threadMetadataAutoArchive :: ThreadMetadata -> Integer
threadMetadataArchived :: ThreadMetadata -> Bool
..} =  [Pair] -> Value
object [(Key
name,Value
value) | (Key
name, Just Value
value) <-
              [ (Key
"archived", Bool -> Value
forall a. ToJSON a => a -> Value
toJSON (Bool -> Value) -> Maybe Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> Maybe Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
threadMetadataArchived)
              , (Key
"auto_archive_duration", Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Integer -> Maybe Integer
forall (f :: * -> *) a. Applicative f => a -> f a
pure Integer
threadMetadataAutoArchive)
              , (Key
"archive_timestamp", UTCTime -> Value
forall a. ToJSON a => a -> Value
toJSON (UTCTime -> Value) -> Maybe UTCTime -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> UTCTime -> Maybe UTCTime
forall (f :: * -> *) a. Applicative f => a -> f a
pure UTCTime
threadMetadataArchiveTime)
              , (Key
"locked", Bool -> Value
forall a. ToJSON a => a -> Value
toJSON (Bool -> Value) -> Maybe Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> Maybe Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
threadMetadataLocked)
              , (Key
"invitable", Bool -> Value
forall a. ToJSON a => a -> Value
toJSON (Bool -> Value) -> Maybe Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Bool
threadMetadataInvitable)
              , (Key
"create_timestamp", Maybe UTCTime -> Value
forall a. ToJSON a => a -> Value
toJSON (Maybe UTCTime -> Value) -> Maybe (Maybe UTCTime) -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe UTCTime -> Maybe (Maybe UTCTime)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe UTCTime
threadMetadataCreateTime)
              ] ]

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

instance FromJSON ThreadMember where
  parseJSON :: Value -> Parser ThreadMember
parseJSON = String
-> (Object -> Parser ThreadMember) -> Value -> Parser ThreadMember
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"ThreadMember" ((Object -> Parser ThreadMember) -> Value -> Parser ThreadMember)
-> (Object -> Parser ThreadMember) -> Value -> Parser ThreadMember
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    Maybe ChannelId
-> Maybe ChannelId -> UTCTime -> Integer -> ThreadMember
ThreadMember (Maybe ChannelId
 -> Maybe ChannelId -> UTCTime -> Integer -> ThreadMember)
-> Parser (Maybe ChannelId)
-> Parser (Maybe ChannelId -> 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 ChannelId -> UTCTime -> Integer -> ThreadMember)
-> Parser (Maybe ChannelId)
-> Parser (UTCTime -> Integer -> ThreadMember)
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
"user_id"
                 Parser (UTCTime -> Integer -> ThreadMember)
-> Parser UTCTime -> Parser (Integer -> ThreadMember)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser UTCTime
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"join_timestamp"
                 Parser (Integer -> ThreadMember)
-> Parser Integer -> Parser ThreadMember
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"flags"

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

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

instance FromJSON ThreadListSyncFields where
  parseJSON :: Value -> Parser ThreadListSyncFields
parseJSON = String
-> (Object -> Parser ThreadListSyncFields)
-> Value
-> Parser ThreadListSyncFields
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"ThreadListSyncFields" ((Object -> Parser ThreadListSyncFields)
 -> Value -> Parser ThreadListSyncFields)
-> (Object -> Parser ThreadListSyncFields)
-> Value
-> Parser ThreadListSyncFields
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    ChannelId
-> Maybe [ChannelId]
-> [Channel]
-> [ThreadMember]
-> ThreadListSyncFields
ThreadListSyncFields (ChannelId
 -> Maybe [ChannelId]
 -> [Channel]
 -> [ThreadMember]
 -> ThreadListSyncFields)
-> Parser ChannelId
-> Parser
     (Maybe [ChannelId]
      -> [Channel] -> [ThreadMember] -> ThreadListSyncFields)
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
"guild_id"
                         Parser
  (Maybe [ChannelId]
   -> [Channel] -> [ThreadMember] -> ThreadListSyncFields)
-> Parser (Maybe [ChannelId])
-> Parser ([Channel] -> [ThreadMember] -> ThreadListSyncFields)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> 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 (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 (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 -> ChannelId
threadMembersUpdateFieldsGuildId :: GuildId
  , ThreadMembersUpdateFields -> Integer
threadMembersUpdateFieldsMemberCount :: Integer
  , ThreadMembersUpdateFields -> Maybe [ThreadMember]
threadMembersUpdateFieldsAddedMembers :: Maybe [ThreadMember]
  , ThreadMembersUpdateFields -> Maybe [ChannelId]
threadMembersUpdateFieldsRemovedMembers :: Maybe [UserId]
  } deriving (Int -> ThreadMembersUpdateFields -> ShowS
[ThreadMembersUpdateFields] -> ShowS
ThreadMembersUpdateFields -> String
(Int -> ThreadMembersUpdateFields -> ShowS)
-> (ThreadMembersUpdateFields -> String)
-> ([ThreadMembersUpdateFields] -> ShowS)
-> Show ThreadMembersUpdateFields
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ThreadMembersUpdateFields] -> ShowS
$cshowList :: [ThreadMembersUpdateFields] -> ShowS
show :: ThreadMembersUpdateFields -> String
$cshow :: ThreadMembersUpdateFields -> String
showsPrec :: Int -> ThreadMembersUpdateFields -> ShowS
$cshowsPrec :: Int -> ThreadMembersUpdateFields -> ShowS
Show, ReadPrec [ThreadMembersUpdateFields]
ReadPrec ThreadMembersUpdateFields
Int -> ReadS ThreadMembersUpdateFields
ReadS [ThreadMembersUpdateFields]
(Int -> ReadS ThreadMembersUpdateFields)
-> ReadS [ThreadMembersUpdateFields]
-> ReadPrec ThreadMembersUpdateFields
-> ReadPrec [ThreadMembersUpdateFields]
-> Read ThreadMembersUpdateFields
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ThreadMembersUpdateFields]
$creadListPrec :: ReadPrec [ThreadMembersUpdateFields]
readPrec :: ReadPrec ThreadMembersUpdateFields
$creadPrec :: ReadPrec ThreadMembersUpdateFields
readList :: ReadS [ThreadMembersUpdateFields]
$creadList :: ReadS [ThreadMembersUpdateFields]
readsPrec :: Int -> ReadS ThreadMembersUpdateFields
$creadsPrec :: Int -> ReadS ThreadMembersUpdateFields
Read, ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
(ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool)
-> (ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool)
-> Eq ThreadMembersUpdateFields
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
$c/= :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
== :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
$c== :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
Eq, Eq ThreadMembersUpdateFields
Eq ThreadMembersUpdateFields
-> (ThreadMembersUpdateFields
    -> ThreadMembersUpdateFields -> Ordering)
-> (ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool)
-> (ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool)
-> (ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool)
-> (ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool)
-> (ThreadMembersUpdateFields
    -> ThreadMembersUpdateFields -> ThreadMembersUpdateFields)
-> (ThreadMembersUpdateFields
    -> ThreadMembersUpdateFields -> ThreadMembersUpdateFields)
-> Ord ThreadMembersUpdateFields
ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Ordering
ThreadMembersUpdateFields
-> ThreadMembersUpdateFields -> ThreadMembersUpdateFields
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ThreadMembersUpdateFields
-> ThreadMembersUpdateFields -> ThreadMembersUpdateFields
$cmin :: ThreadMembersUpdateFields
-> ThreadMembersUpdateFields -> ThreadMembersUpdateFields
max :: ThreadMembersUpdateFields
-> ThreadMembersUpdateFields -> ThreadMembersUpdateFields
$cmax :: ThreadMembersUpdateFields
-> ThreadMembersUpdateFields -> ThreadMembersUpdateFields
>= :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
$c>= :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
> :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
$c> :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
<= :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
$c<= :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
< :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
$c< :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Bool
compare :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Ordering
$ccompare :: ThreadMembersUpdateFields -> ThreadMembersUpdateFields -> Ordering
$cp1Ord :: Eq ThreadMembersUpdateFields
Ord)

instance FromJSON ThreadMembersUpdateFields where
  parseJSON :: Value -> Parser ThreadMembersUpdateFields
parseJSON = String
-> (Object -> Parser ThreadMembersUpdateFields)
-> Value
-> Parser ThreadMembersUpdateFields
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"ThreadMembersUpdateFields" ((Object -> Parser ThreadMembersUpdateFields)
 -> Value -> Parser ThreadMembersUpdateFields)
-> (Object -> Parser ThreadMembersUpdateFields)
-> Value
-> Parser ThreadMembersUpdateFields
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    ChannelId
-> ChannelId
-> Integer
-> Maybe [ThreadMember]
-> Maybe [ChannelId]
-> ThreadMembersUpdateFields
ThreadMembersUpdateFields (ChannelId
 -> ChannelId
 -> Integer
 -> Maybe [ThreadMember]
 -> Maybe [ChannelId]
 -> ThreadMembersUpdateFields)
-> Parser ChannelId
-> Parser
     (ChannelId
      -> Integer
      -> Maybe [ThreadMember]
      -> Maybe [ChannelId]
      -> 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
  (ChannelId
   -> Integer
   -> Maybe [ThreadMember]
   -> Maybe [ChannelId]
   -> ThreadMembersUpdateFields)
-> Parser ChannelId
-> Parser
     (Integer
      -> Maybe [ThreadMember]
      -> Maybe [ChannelId]
      -> ThreadMembersUpdateFields)
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
"guild_id"
                              Parser
  (Integer
   -> Maybe [ThreadMember]
   -> Maybe [ChannelId]
   -> ThreadMembersUpdateFields)
-> Parser Integer
-> Parser
     (Maybe [ThreadMember]
      -> Maybe [ChannelId] -> ThreadMembersUpdateFields)
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 [ChannelId] -> ThreadMembersUpdateFields)
-> Parser (Maybe [ThreadMember])
-> Parser (Maybe [ChannelId] -> ThreadMembersUpdateFields)
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 [ChannelId] -> ThreadMembersUpdateFields)
-> Parser (Maybe [ChannelId]) -> Parser ThreadMembersUpdateFields
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
"removed_member_ids"

-- | Represents information about a message in a Discord channel.
data Message = Message
  { Message -> ChannelId
messageId                 :: MessageId                -- ^ The id of the message
  , Message -> ChannelId
messageChannelId          :: ChannelId                -- ^ Id of the channel the message
                                                          --   was sent in
  , Message -> Maybe ChannelId
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 -> [ChannelId]
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 ChannelId
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 ChannelId
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 [ComponentActionRow]
messageComponents         :: Maybe [ComponentActionRow]        -- ^ sent if the message contains components like buttons, action rows, or other interactive components
  , Message -> Maybe [StickerItem]
messageStickerItems       :: Maybe [StickerItem]      -- ^ sent if the message contains stickers
  } deriving (Int -> Message -> ShowS
[Message] -> ShowS
Message -> String
(Int -> Message -> ShowS)
-> (Message -> String) -> ([Message] -> ShowS) -> Show Message
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Message] -> ShowS
$cshowList :: [Message] -> ShowS
show :: Message -> String
$cshow :: Message -> String
showsPrec :: Int -> Message -> ShowS
$cshowsPrec :: Int -> Message -> ShowS
Show, ReadPrec [Message]
ReadPrec Message
Int -> ReadS Message
ReadS [Message]
(Int -> ReadS Message)
-> ReadS [Message]
-> ReadPrec Message
-> ReadPrec [Message]
-> Read Message
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Message]
$creadListPrec :: ReadPrec [Message]
readPrec :: ReadPrec Message
$creadPrec :: ReadPrec Message
readList :: ReadS [Message]
$creadList :: ReadS [Message]
readsPrec :: Int -> ReadS Message
$creadsPrec :: Int -> ReadS Message
Read, Message -> Message -> Bool
(Message -> Message -> Bool)
-> (Message -> Message -> Bool) -> Eq Message
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Message -> Message -> Bool
$c/= :: Message -> Message -> Bool
== :: Message -> Message -> Bool
$c== :: Message -> Message -> Bool
Eq, Eq Message
Eq Message
-> (Message -> Message -> Ordering)
-> (Message -> Message -> Bool)
-> (Message -> Message -> Bool)
-> (Message -> Message -> Bool)
-> (Message -> Message -> Bool)
-> (Message -> Message -> Message)
-> (Message -> Message -> Message)
-> Ord Message
Message -> Message -> Bool
Message -> Message -> Ordering
Message -> Message -> Message
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Message -> Message -> Message
$cmin :: Message -> Message -> Message
max :: Message -> Message -> Message
$cmax :: Message -> Message -> Message
>= :: Message -> Message -> Bool
$c>= :: Message -> Message -> Bool
> :: Message -> Message -> Bool
$c> :: Message -> Message -> Bool
<= :: Message -> Message -> Bool
$c<= :: Message -> Message -> Bool
< :: Message -> Message -> Bool
$c< :: Message -> Message -> Bool
compare :: Message -> Message -> Ordering
$ccompare :: Message -> Message -> Ordering
$cp1Ord :: Eq Message
Ord)

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

-- | Data constructor for a part of MessageDetailedOpts.
data AllowedMentions = AllowedMentions
  { AllowedMentions -> Bool
mentionEveryone    :: Bool
  , AllowedMentions -> Bool
mentionUsers       :: Bool
  , AllowedMentions -> Bool
mentionRoles       :: Bool
  , AllowedMentions -> [ChannelId]
mentionUserIds     :: [UserId]
  , AllowedMentions -> [ChannelId]
mentionRoleIds     :: [RoleId]
  , AllowedMentions -> Bool
mentionRepliedUser :: Bool
  } deriving (Int -> AllowedMentions -> ShowS
[AllowedMentions] -> ShowS
AllowedMentions -> String
(Int -> AllowedMentions -> ShowS)
-> (AllowedMentions -> String)
-> ([AllowedMentions] -> ShowS)
-> Show AllowedMentions
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AllowedMentions] -> ShowS
$cshowList :: [AllowedMentions] -> ShowS
show :: AllowedMentions -> String
$cshow :: AllowedMentions -> String
showsPrec :: Int -> AllowedMentions -> ShowS
$cshowsPrec :: Int -> AllowedMentions -> ShowS
Show, ReadPrec [AllowedMentions]
ReadPrec AllowedMentions
Int -> ReadS AllowedMentions
ReadS [AllowedMentions]
(Int -> ReadS AllowedMentions)
-> ReadS [AllowedMentions]
-> ReadPrec AllowedMentions
-> ReadPrec [AllowedMentions]
-> Read AllowedMentions
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [AllowedMentions]
$creadListPrec :: ReadPrec [AllowedMentions]
readPrec :: ReadPrec AllowedMentions
$creadPrec :: ReadPrec AllowedMentions
readList :: ReadS [AllowedMentions]
$creadList :: ReadS [AllowedMentions]
readsPrec :: Int -> ReadS AllowedMentions
$creadsPrec :: Int -> ReadS AllowedMentions
Read, AllowedMentions -> AllowedMentions -> Bool
(AllowedMentions -> AllowedMentions -> Bool)
-> (AllowedMentions -> AllowedMentions -> Bool)
-> Eq AllowedMentions
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AllowedMentions -> AllowedMentions -> Bool
$c/= :: AllowedMentions -> AllowedMentions -> Bool
== :: AllowedMentions -> AllowedMentions -> Bool
$c== :: AllowedMentions -> AllowedMentions -> Bool
Eq, Eq AllowedMentions
Eq AllowedMentions
-> (AllowedMentions -> AllowedMentions -> Ordering)
-> (AllowedMentions -> AllowedMentions -> Bool)
-> (AllowedMentions -> AllowedMentions -> Bool)
-> (AllowedMentions -> AllowedMentions -> Bool)
-> (AllowedMentions -> AllowedMentions -> Bool)
-> (AllowedMentions -> AllowedMentions -> AllowedMentions)
-> (AllowedMentions -> AllowedMentions -> AllowedMentions)
-> Ord AllowedMentions
AllowedMentions -> AllowedMentions -> Bool
AllowedMentions -> AllowedMentions -> Ordering
AllowedMentions -> AllowedMentions -> AllowedMentions
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: AllowedMentions -> AllowedMentions -> AllowedMentions
$cmin :: AllowedMentions -> AllowedMentions -> AllowedMentions
max :: AllowedMentions -> AllowedMentions -> AllowedMentions
$cmax :: AllowedMentions -> AllowedMentions -> AllowedMentions
>= :: AllowedMentions -> AllowedMentions -> Bool
$c>= :: AllowedMentions -> AllowedMentions -> Bool
> :: AllowedMentions -> AllowedMentions -> Bool
$c> :: AllowedMentions -> AllowedMentions -> Bool
<= :: AllowedMentions -> AllowedMentions -> Bool
$c<= :: AllowedMentions -> AllowedMentions -> Bool
< :: AllowedMentions -> AllowedMentions -> Bool
$c< :: AllowedMentions -> AllowedMentions -> Bool
compare :: AllowedMentions -> AllowedMentions -> Ordering
$ccompare :: AllowedMentions -> AllowedMentions -> Ordering
$cp1Ord :: Eq AllowedMentions
Ord)

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

instance ToJSON AllowedMentions where
  toJSON :: AllowedMentions -> Value
toJSON AllowedMentions{Bool
[ChannelId]
mentionRepliedUser :: Bool
mentionRoleIds :: [ChannelId]
mentionUserIds :: [ChannelId]
mentionRoles :: Bool
mentionUsers :: Bool
mentionEveryone :: Bool
mentionRepliedUser :: AllowedMentions -> Bool
mentionRoleIds :: AllowedMentions -> [ChannelId]
mentionUserIds :: AllowedMentions -> [ChannelId]
mentionRoles :: AllowedMentions -> Bool
mentionUsers :: AllowedMentions -> Bool
mentionEveryone :: AllowedMentions -> Bool
..} = [Pair] -> Value
object [
                                 (Key
"parse" Key -> [Text] -> Pair
forall kv v. (KeyValue 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
&& [ChannelId]
mentionUserIds [ChannelId] -> [ChannelId] -> Bool
forall a. Eq a => a -> a -> Bool
== []),
                                       (Text
"roles",    Bool
mentionRoles Bool -> Bool -> Bool
&& [ChannelId]
mentionRoleIds [ChannelId] -> [ChannelId] -> Bool
forall a. Eq a => a -> a -> Bool
== []) ] ]),
                                 -- 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 -> [ChannelId] -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= [ChannelId]
mentionRoleIds),
                                 (Key
"users"        Key -> [ChannelId] -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= [ChannelId]
mentionUserIds),
                                 (Key
"replied_user" Key -> Bool -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Bool
mentionRepliedUser) ]

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

instance FromJSON MessageReaction where
  parseJSON :: Value -> Parser MessageReaction
parseJSON = String
-> (Object -> Parser MessageReaction)
-> Value
-> Parser MessageReaction
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"MessageReaction" ((Object -> Parser MessageReaction)
 -> Value -> Parser MessageReaction)
-> (Object -> Parser MessageReaction)
-> Value
-> Parser MessageReaction
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    Int -> Bool -> Emoji -> MessageReaction
MessageReaction (Int -> Bool -> Emoji -> MessageReaction)
-> Parser Int -> Parser (Bool -> Emoji -> MessageReaction)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser Int
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"count"
                    Parser (Bool -> Emoji -> MessageReaction)
-> Parser Bool -> Parser (Emoji -> MessageReaction)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Bool
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"me"
                    Parser (Emoji -> MessageReaction)
-> Parser Emoji -> Parser MessageReaction
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
messageReactionEmoji :: Emoji
messageReactionMeIncluded :: Bool
messageReactionCount :: Int
messageReactionEmoji :: MessageReaction -> Emoji
messageReactionMeIncluded :: MessageReaction -> Bool
messageReactionCount :: MessageReaction -> Int
..} = [Pair] -> Value
object [(Key
name, Value
value) | (Key
name, Just Value
value) <-
      [ (Key
"count", Int -> Value
forall a. ToJSON a => a -> Value
toJSON (Int -> Value) -> Maybe Int -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Maybe Int
forall (f :: * -> *) a. Applicative f => a -> f a
pure Int
messageReactionCount)
      , (Key
"me",    Bool -> Value
forall a. ToJSON a => a -> Value
toJSON (Bool -> Value) -> Maybe Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> Maybe Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
messageReactionMeIncluded)
      , (Key
"emoji", Emoji -> Value
forall a. ToJSON a => a -> Value
toJSON (Emoji -> Value) -> Maybe Emoji -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Emoji -> Maybe Emoji
forall (f :: * -> *) a. Applicative f => a -> f a
pure Emoji
messageReactionEmoji)
      ]]

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

instance FromJSON Attachment where
  parseJSON :: Value -> Parser Attachment
parseJSON = String
-> (Object -> Parser Attachment) -> Value -> Parser Attachment
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"Attachment" ((Object -> Parser Attachment) -> Value -> Parser Attachment)
-> (Object -> Parser Attachment) -> Value -> Parser Attachment
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    ChannelId
-> Text
-> Integer
-> Text
-> Text
-> Maybe Integer
-> Maybe Integer
-> Attachment
Attachment (ChannelId
 -> Text
 -> Integer
 -> Text
 -> Text
 -> Maybe Integer
 -> Maybe Integer
 -> Attachment)
-> Parser ChannelId
-> 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 ChannelId
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 (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 (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 (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 (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 (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 (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
ChannelId
attachmentWidth :: Maybe Integer
attachmentHeight :: Maybe Integer
attachmentProxy :: Text
attachmentUrl :: Text
attachmentSize :: Integer
attachmentFilename :: Text
attachmentId :: ChannelId
attachmentWidth :: Attachment -> Maybe Integer
attachmentHeight :: Attachment -> Maybe Integer
attachmentProxy :: Attachment -> Text
attachmentUrl :: Attachment -> Text
attachmentSize :: Attachment -> Integer
attachmentFilename :: Attachment -> Text
attachmentId :: Attachment -> ChannelId
..} = [Pair] -> Value
object [(Key
name, Value
value) | (Key
name, Just Value
value) <-
      [ (Key
"id",        ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
attachmentId)
      , (Key
"filename",  Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
attachmentFilename)
      , (Key
"size",      Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Integer -> Maybe Integer
forall (f :: * -> *) a. Applicative f => a -> f a
pure Integer
attachmentSize)
      , (Key
"url",       Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
attachmentUrl)
      , (Key
"proxy_url", Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
attachmentProxy)
      , (Key
"height",    Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>      Maybe Integer
attachmentHeight)
      , (Key
"width",     Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>      Maybe Integer
attachmentWidth)
      ] ]

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

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

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


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

instance FromJSON MessageReference where
  parseJSON :: Value -> Parser MessageReference
parseJSON = String
-> (Object -> Parser MessageReference)
-> Value
-> Parser MessageReference
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"MessageReference" ((Object -> Parser MessageReference)
 -> Value -> Parser MessageReference)
-> (Object -> Parser MessageReference)
-> Value
-> Parser MessageReference
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    Maybe ChannelId
-> Maybe ChannelId -> Maybe ChannelId -> Bool -> MessageReference
MessageReference (Maybe ChannelId
 -> Maybe ChannelId -> Maybe ChannelId -> Bool -> MessageReference)
-> Parser (Maybe ChannelId)
-> Parser
     (Maybe ChannelId -> Maybe ChannelId -> Bool -> MessageReference)
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
"message_id"
                     Parser
  (Maybe ChannelId -> Maybe ChannelId -> Bool -> MessageReference)
-> Parser (Maybe ChannelId)
-> Parser (Maybe ChannelId -> Bool -> MessageReference)
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 ChannelId -> Bool -> MessageReference)
-> Parser (Maybe ChannelId) -> Parser (Bool -> MessageReference)
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
"guild_id"
                     Parser (Bool -> MessageReference)
-> Parser Bool -> Parser MessageReference
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> 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 ChannelId
failIfNotExists :: Bool
referenceGuildId :: Maybe ChannelId
referenceChannelId :: Maybe ChannelId
referenceMessageId :: Maybe ChannelId
failIfNotExists :: MessageReference -> Bool
referenceGuildId :: MessageReference -> Maybe ChannelId
referenceChannelId :: MessageReference -> Maybe ChannelId
referenceMessageId :: MessageReference -> Maybe ChannelId
..} = [Pair] -> Value
object [(Key
name,Value
value) | (Key
name, Just Value
value) <-
              [ (Key
"message_id",     Maybe ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (Maybe ChannelId -> Value)
-> Maybe (Maybe ChannelId) -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ChannelId -> Maybe (Maybe ChannelId)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe ChannelId
referenceMessageId)
              , (Key
"channel_id", Maybe ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (Maybe ChannelId -> Value)
-> Maybe (Maybe ChannelId) -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ChannelId -> Maybe (Maybe ChannelId)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe ChannelId
referenceChannelId)
              , (Key
"guild_id",  Maybe ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (Maybe ChannelId -> Value)
-> Maybe (Maybe ChannelId) -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ChannelId -> Maybe (Maybe ChannelId)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe ChannelId
referenceGuildId)
              , (Key
"fail_if_not_exists",   Bool -> Value
forall a. ToJSON a => a -> Value
toJSON (Bool -> Value) -> Maybe Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> Maybe Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
failIfNotExists)
              ] ]

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


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

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

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

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

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

instance FromJSON MessageActivity where
  parseJSON :: Value -> Parser MessageActivity
parseJSON = String
-> (Object -> Parser MessageActivity)
-> Value
-> Parser MessageActivity
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"MessageActivity" ((Object -> Parser MessageActivity)
 -> Value -> Parser MessageActivity)
-> (Object -> Parser MessageActivity)
-> Value
-> Parser MessageActivity
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    MessageActivityType -> Maybe Text -> MessageActivity
MessageActivity (MessageActivityType -> Maybe Text -> MessageActivity)
-> Parser MessageActivityType
-> Parser (Maybe Text -> MessageActivity)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser MessageActivityType
forall a. FromJSON a => Object -> Key -> Parser a
.:   Key
"type"
                     Parser (Maybe Text -> MessageActivity)
-> Parser (Maybe Text) -> Parser MessageActivity
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> 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
messageActivityPartyId :: Maybe Text
messageActivityType :: MessageActivityType
messageActivityPartyId :: MessageActivity -> Maybe Text
messageActivityType :: MessageActivity -> MessageActivityType
..} = [Pair] -> Value
object [(Key
name,Value
value) | (Key
name, Just Value
value) <-
              [ (Key
"type",     MessageActivityType -> Value
forall a. ToJSON a => a -> Value
toJSON (MessageActivityType -> Value)
-> Maybe MessageActivityType -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MessageActivityType -> Maybe MessageActivityType
forall (f :: * -> *) a. Applicative f => a -> f a
pure MessageActivityType
messageActivityType)
              , (Key
"party_id", Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>      Maybe Text
messageActivityPartyId)
              ] ]

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

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

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

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

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

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

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

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

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

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

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

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


instance FromJSON MessageInteraction where
  parseJSON :: Value -> Parser MessageInteraction
parseJSON = String
-> (Object -> Parser MessageInteraction)
-> Value
-> Parser MessageInteraction
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"MessageInteraction" ((Object -> Parser MessageInteraction)
 -> Value -> Parser MessageInteraction)
-> (Object -> Parser MessageInteraction)
-> Value
-> Parser MessageInteraction
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    ChannelId -> Integer -> Text -> User -> MessageInteraction
MessageInteraction (ChannelId -> Integer -> Text -> User -> MessageInteraction)
-> Parser ChannelId
-> Parser (Integer -> Text -> User -> MessageInteraction)
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 (Integer -> Text -> User -> MessageInteraction)
-> Parser Integer -> Parser (Text -> User -> MessageInteraction)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"type"
                       Parser (Text -> User -> MessageInteraction)
-> Parser Text -> Parser (User -> MessageInteraction)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"name"
                       Parser (User -> MessageInteraction)
-> Parser User -> Parser MessageInteraction
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"