{-# LANGUAGE TemplateHaskell #-}

-- | A message from a channel
module Calamity.Types.Model.Channel.Message (
  Message (..),
  MessageAuthor (..),
  MessageAuthorWebhook (..),
  ChannelMention (..),
  MessageType (..),
  MessageReference (..),
  Partial (PartialMessage),
) where

import Calamity.Internal.Utils (AesonVector (..), CalamityToJSON (..), CalamityToJSON' (..), (.=), (.?=))
import {-# SOURCE #-} Calamity.Types.Model.Channel
import Calamity.Types.Model.Channel.Attachment
import Calamity.Types.Model.Channel.ChannelType (ChannelType)
import Calamity.Types.Model.Channel.Component
import Calamity.Types.Model.Channel.Embed
import Calamity.Types.Model.Channel.Reaction
import Calamity.Types.Model.Channel.Webhook
import {-# SOURCE #-} Calamity.Types.Model.Guild.Guild
import Calamity.Types.Model.Guild.Role
import Calamity.Types.Model.User
import Calamity.Types.Snowflake
import Data.Aeson ((.!=), (.:), (.:?))
import qualified Data.Aeson as Aeson
import Data.Maybe (isJust)
import Data.Scientific
import Data.Text (Text)
import Data.Time
import qualified Data.Vector.Unboxing as UV
import Data.Word (Word64)
import Optics.TH
import qualified TextShow
import TextShow.TH

data MessageAuthorWebhook = MessageAuthorWebhook
  { MessageAuthorWebhook -> Snowflake Webhook
id :: Snowflake Webhook
  , MessageAuthorWebhook -> Text
username :: Text
  , MessageAuthorWebhook -> Maybe Text
avatar :: Maybe Text
  }
  deriving (Int -> MessageAuthorWebhook -> ShowS
[MessageAuthorWebhook] -> ShowS
MessageAuthorWebhook -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MessageAuthorWebhook] -> ShowS
$cshowList :: [MessageAuthorWebhook] -> ShowS
show :: MessageAuthorWebhook -> String
$cshow :: MessageAuthorWebhook -> String
showsPrec :: Int -> MessageAuthorWebhook -> ShowS
$cshowsPrec :: Int -> MessageAuthorWebhook -> ShowS
Show)
  deriving (HasID Webhook) via HasIDField "id" MessageAuthorWebhook

data MessageAuthor
  = User' User
  | Webhook' MessageAuthorWebhook
  deriving (Int -> MessageAuthor -> ShowS
[MessageAuthor] -> ShowS
MessageAuthor -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MessageAuthor] -> ShowS
$cshowList :: [MessageAuthor] -> ShowS
show :: MessageAuthor -> String
$cshow :: MessageAuthor -> String
showsPrec :: Int -> MessageAuthor -> ShowS
$cshowsPrec :: Int -> MessageAuthor -> ShowS
Show)

instance HasID User MessageAuthor where
  getID :: MessageAuthor -> Snowflake User
getID (User' User
u) = forall b a. HasID b a => a -> Snowflake b
getID User
u
  getID (Webhook' MessageAuthorWebhook {Snowflake Webhook
id :: Snowflake Webhook
$sel:id:MessageAuthorWebhook :: MessageAuthorWebhook -> Snowflake Webhook
id}) = forall a b. Snowflake a -> Snowflake b
coerceSnowflake Snowflake Webhook
id

data ChannelMention = ChannelMention
  { ChannelMention -> Snowflake Channel
id :: Snowflake Channel
  , ChannelMention -> Snowflake Guild
guildID :: Snowflake Guild
  , ChannelMention -> ChannelType
type_ :: ChannelType
  , ChannelMention -> Text
name :: Text
  }
  deriving (Int -> ChannelMention -> ShowS
[ChannelMention] -> ShowS
ChannelMention -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ChannelMention] -> ShowS
$cshowList :: [ChannelMention] -> ShowS
show :: ChannelMention -> String
$cshow :: ChannelMention -> String
showsPrec :: Int -> ChannelMention -> ShowS
$cshowsPrec :: Int -> ChannelMention -> ShowS
Show)
  deriving (HasID Channel) via HasIDField "id" ChannelMention

instance Aeson.FromJSON ChannelMention where
  parseJSON :: Value -> Parser ChannelMention
parseJSON = forall a. String -> (Object -> Parser a) -> Value -> Parser a
Aeson.withObject String
"Message.ChannelMention" forall a b. (a -> b) -> a -> b
$ \Object
v ->
    Snowflake Channel
-> Snowflake Guild -> ChannelType -> Text -> ChannelMention
ChannelMention
      forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"id"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"guild_id"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"type"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"name"

data Message = Message
  { Message -> Snowflake Message
id :: Snowflake Message
  , Message -> Snowflake Channel
channelID :: Snowflake Channel
  , Message -> Maybe (Snowflake Guild)
guildID :: Maybe (Snowflake Guild)
  , Message -> MessageAuthor
author :: MessageAuthor
  , Message -> Text
content :: Text
  , Message -> UTCTime
timestamp :: UTCTime
  , Message -> Maybe UTCTime
editedTimestamp :: Maybe UTCTime
  , Message -> Bool
tts :: Bool
  , Message -> Bool
mentionEveryone :: Bool
  , Message -> [User]
mentions :: [User]
  , Message -> Vector (Snowflake Role)
mentionRoles :: UV.Vector (Snowflake Role)
  , Message -> [ChannelMention]
mentionChannels :: [ChannelMention]
  , Message -> [Attachment]
attachments :: [Attachment]
  , Message -> [Embed]
embeds :: [Embed]
  , Message -> [Reaction]
reactions :: [Reaction]
  , Message -> Maybe Value
nonce :: Maybe Aeson.Value
  , Message -> Bool
pinned :: Bool
  , Message -> Maybe (Snowflake Webhook)
webhookID :: Maybe (Snowflake Webhook)
  , Message -> MessageType
type_ :: MessageType
  , Message -> Maybe Object
activity :: Maybe Aeson.Object
  , Message -> Maybe Object
application :: Maybe Aeson.Object
  , Message -> Maybe MessageReference
messageReference :: Maybe MessageReference
  , Message -> Word64
flags :: Word64
  , Message -> Maybe Message
referencedMessage :: Maybe Message
  , Message -> Maybe Object
interaction :: Maybe Aeson.Object
  , Message -> [Component]
components :: [Component]
  }
  deriving (Int -> Message -> ShowS
[Message] -> ShowS
Message -> String
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)
  deriving (Int -> Message -> Builder
Int -> Message -> Text
Int -> Message -> Text
[Message] -> Builder
[Message] -> Text
[Message] -> Text
Message -> Builder
Message -> Text
Message -> Text
forall a.
(Int -> a -> Builder)
-> (a -> Builder)
-> ([a] -> Builder)
-> (Int -> a -> Text)
-> (a -> Text)
-> ([a] -> Text)
-> (Int -> a -> Text)
-> (a -> Text)
-> ([a] -> Text)
-> TextShow a
showtlList :: [Message] -> Text
$cshowtlList :: [Message] -> Text
showtl :: Message -> Text
$cshowtl :: Message -> Text
showtlPrec :: Int -> Message -> Text
$cshowtlPrec :: Int -> Message -> Text
showtList :: [Message] -> Text
$cshowtList :: [Message] -> Text
showt :: Message -> Text
$cshowt :: Message -> Text
showtPrec :: Int -> Message -> Text
$cshowtPrec :: Int -> Message -> Text
showbList :: [Message] -> Builder
$cshowbList :: [Message] -> Builder
showb :: Message -> Builder
$cshowb :: Message -> Builder
showbPrec :: Int -> Message -> Builder
$cshowbPrec :: Int -> Message -> Builder
TextShow.TextShow) via TextShow.FromStringShow Message
  deriving (HasID Message) via HasIDField "id" Message
  deriving (HasID Channel) via HasIDField "channelID" Message
  deriving (HasID User) via HasIDField "author" Message

instance Aeson.FromJSON Message where
  parseJSON :: Value -> Parser Message
parseJSON = forall a. String -> (Object -> Parser a) -> Value -> Parser a
Aeson.withObject String
"Message" forall a b. (a -> b) -> a -> b
$ \Object
v -> do
    Maybe (Snowflake Webhook)
webhookID <- Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"webhook_id"
    let author :: Parser MessageAuthor
author =
          if forall a. Maybe a -> Bool
isJust Maybe (Snowflake Webhook)
webhookID
            then
              forall a. String -> (Object -> Parser a) -> Value -> Parser a
Aeson.withObject
                String
"Message.author"
                ( \Object
v ->
                    MessageAuthorWebhook -> MessageAuthor
Webhook'
                      forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ( Snowflake Webhook -> Text -> Maybe Text -> MessageAuthorWebhook
MessageAuthorWebhook
                              forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"id" forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"username" forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"avatar"
                          )
                )
                forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"author"
            else User -> MessageAuthor
User' forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (forall a. FromJSON a => Value -> Parser a
Aeson.parseJSON forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"author"))

    Snowflake Message
-> Snowflake Channel
-> Maybe (Snowflake Guild)
-> MessageAuthor
-> Text
-> UTCTime
-> Maybe UTCTime
-> Bool
-> Bool
-> [User]
-> Vector (Snowflake Role)
-> [ChannelMention]
-> [Attachment]
-> [Embed]
-> [Reaction]
-> Maybe Value
-> Bool
-> Maybe (Snowflake Webhook)
-> MessageType
-> Maybe Object
-> Maybe Object
-> Maybe MessageReference
-> Word64
-> Maybe Message
-> Maybe Object
-> [Component]
-> Message
Message
      forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"id"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"channel_id"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"guild_id"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser MessageAuthor
author
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"content"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"timestamp"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"edited_timestamp"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"tts"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"mention_everyone"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"mentions"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (forall a. AesonVector a -> Vector a
unAesonVector forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"mention_roles")
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"mention_channels" forall a. Parser (Maybe a) -> a -> Parser a
.!= []
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"attachments"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"embeds"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"reactions" forall a. Parser (Maybe a) -> a -> Parser a
.!= []
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"nonce"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"pinned"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe (Snowflake Webhook)
webhookID
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"type"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"activity"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"application"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"message_reference"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"flags" forall a. Parser (Maybe a) -> a -> Parser a
.!= Word64
0
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"referenced_message"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"interaction"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"components" forall a. Parser (Maybe a) -> a -> Parser a
.!= []

data instance Partial Message = PartialMessage
  { Partial Message -> Snowflake Channel
channelID :: Snowflake Channel
  , Partial Message -> Maybe (Snowflake Guild)
guildID :: Maybe (Snowflake Guild)
  }
  deriving (Int -> Partial Message -> ShowS
[Partial Message] -> ShowS
Partial Message -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Partial Message] -> ShowS
$cshowList :: [Partial Message] -> ShowS
show :: Partial Message -> String
$cshow :: Partial Message -> String
showsPrec :: Int -> Partial Message -> ShowS
$cshowsPrec :: Int -> Partial Message -> ShowS
Show)
  deriving (HasID Channel) via HasIDField "channelID" (Partial Message)

instance Aeson.FromJSON (Partial Message) where
  parseJSON :: Value -> Parser (Partial Message)
parseJSON = forall a. String -> (Object -> Parser a) -> Value -> Parser a
Aeson.withObject String
"Partial Message" forall a b. (a -> b) -> a -> b
$ \Object
v ->
    Snowflake Channel -> Maybe (Snowflake Guild) -> Partial Message
PartialMessage
      forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"channel_id"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"guild_id"

data MessageReference = MessageReference
  { MessageReference -> Maybe (Snowflake Message)
messageID :: Maybe (Snowflake Message)
  , MessageReference -> Maybe (Snowflake Channel)
channelID :: Maybe (Snowflake Channel)
  , MessageReference -> Maybe (Snowflake Guild)
guildID :: Maybe (Snowflake Guild)
  , MessageReference -> Bool
failIfNotExists :: Bool
  }
  deriving (MessageReference -> MessageReference -> Bool
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, Int -> MessageReference -> ShowS
[MessageReference] -> ShowS
MessageReference -> String
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)
  deriving ([MessageReference] -> Encoding
[MessageReference] -> Value
MessageReference -> Encoding
MessageReference -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [MessageReference] -> Encoding
$ctoEncodingList :: [MessageReference] -> Encoding
toJSONList :: [MessageReference] -> Value
$ctoJSONList :: [MessageReference] -> Value
toEncoding :: MessageReference -> Encoding
$ctoEncoding :: MessageReference -> Encoding
toJSON :: MessageReference -> Value
$ctoJSON :: MessageReference -> Value
Aeson.ToJSON) via CalamityToJSON MessageReference

instance CalamityToJSON' MessageReference where
  toPairs :: forall kv. KeyValue kv => MessageReference -> [Maybe kv]
toPairs MessageReference {Bool
Maybe (Snowflake Channel)
Maybe (Snowflake Message)
Maybe (Snowflake Guild)
failIfNotExists :: Bool
guildID :: Maybe (Snowflake Guild)
channelID :: Maybe (Snowflake Channel)
messageID :: Maybe (Snowflake Message)
$sel:failIfNotExists:MessageReference :: MessageReference -> Bool
$sel:guildID:MessageReference :: MessageReference -> Maybe (Snowflake Guild)
$sel:channelID:MessageReference :: MessageReference -> Maybe (Snowflake Channel)
$sel:messageID:MessageReference :: MessageReference -> Maybe (Snowflake Message)
..} =
    [ Key
"message_id" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe (Snowflake Message)
messageID
    , Key
"channel_id" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe (Snowflake Channel)
channelID
    , Key
"guild_id" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe (Snowflake Guild)
guildID
    , Key
"fail_if_not_exists" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Bool
failIfNotExists
    ]

instance Aeson.FromJSON MessageReference where
  parseJSON :: Value -> Parser MessageReference
parseJSON = forall a. String -> (Object -> Parser a) -> Value -> Parser a
Aeson.withObject String
"MessageReference" forall a b. (a -> b) -> a -> b
$ \Object
v ->
    Maybe (Snowflake Message)
-> Maybe (Snowflake Channel)
-> Maybe (Snowflake Guild)
-> Bool
-> MessageReference
MessageReference
      forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"message_id"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"channel_id"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"guild_id"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"fail_if_not_exists" forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
False

-- Thanks sbrg (https://github.com/saevarb/haskord/blob/d1bb07bcc4f3dbc29f2dfd3351ff9f16fc100c07/haskord-lib/src/Haskord/Types/Common.hs#L264)
data MessageType
  = Default
  | RecipientAdd
  | RecipientRemove
  | Call
  | ChannelNameChange
  | ChannelIconChange
  | ChannelPinnedMessage
  | GuildMemberJoin
  | UserPremiumGuildSubscription
  | UserPremiumGuildSubscriptionTier1
  | UserPremiumGuildSubscriptionTier2
  | UserPremiumGuildSubscriptionTier3
  | ChannelFollowAdd
  | GuildDiscoveryDisqualified
  | GuildDiscoveryRequalified
  | Reply
  | ApplicationCommmand
  deriving (MessageType -> MessageType -> Bool
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, Int -> MessageType -> ShowS
[MessageType] -> ShowS
MessageType -> String
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, Int -> MessageType
MessageType -> Int
MessageType -> [MessageType]
MessageType -> MessageType
MessageType -> MessageType -> [MessageType]
MessageType -> MessageType -> MessageType -> [MessageType]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: MessageType -> MessageType -> MessageType -> [MessageType]
$cenumFromThenTo :: MessageType -> MessageType -> MessageType -> [MessageType]
enumFromTo :: MessageType -> MessageType -> [MessageType]
$cenumFromTo :: MessageType -> MessageType -> [MessageType]
enumFromThen :: MessageType -> MessageType -> [MessageType]
$cenumFromThen :: MessageType -> MessageType -> [MessageType]
enumFrom :: MessageType -> [MessageType]
$cenumFrom :: MessageType -> [MessageType]
fromEnum :: MessageType -> Int
$cfromEnum :: MessageType -> Int
toEnum :: Int -> MessageType
$ctoEnum :: Int -> MessageType
pred :: MessageType -> MessageType
$cpred :: MessageType -> MessageType
succ :: MessageType -> MessageType
$csucc :: MessageType -> MessageType
Enum)

instance Aeson.FromJSON MessageType where
  parseJSON :: Value -> Parser MessageType
parseJSON = forall a. String -> (Scientific -> Parser a) -> Value -> Parser a
Aeson.withScientific String
"MessageType" forall a b. (a -> b) -> a -> b
$ \Scientific
n -> case forall i. (Integral i, Bounded i) => Scientific -> Maybe i
toBoundedInteger @Int Scientific
n of
    Just Int
v -> case Int
v of
      Int
0 -> forall (f :: * -> *) a. Applicative f => a -> f a
pure MessageType
Default
      Int
1 -> forall (f :: * -> *) a. Applicative f => a -> f a
pure MessageType
RecipientAdd
      Int
2 -> forall (f :: * -> *) a. Applicative f => a -> f a
pure MessageType
RecipientRemove
      Int
3 -> forall (f :: * -> *) a. Applicative f => a -> f a
pure MessageType
Call
      Int
4 -> forall (f :: * -> *) a. Applicative f => a -> f a
pure MessageType
ChannelNameChange
      Int
5 -> forall (f :: * -> *) a. Applicative f => a -> f a
pure MessageType
ChannelIconChange
      Int
6 -> forall (f :: * -> *) a. Applicative f => a -> f a
pure MessageType
ChannelPinnedMessage
      Int
7 -> forall (f :: * -> *) a. Applicative f => a -> f a
pure MessageType
GuildMemberJoin
      Int
8 -> forall (f :: * -> *) a. Applicative f => a -> f a
pure MessageType
UserPremiumGuildSubscription
      Int
9 -> forall (f :: * -> *) a. Applicative f => a -> f a
pure MessageType
UserPremiumGuildSubscriptionTier1
      Int
10 -> forall (f :: * -> *) a. Applicative f => a -> f a
pure MessageType
UserPremiumGuildSubscriptionTier2
      Int
11 -> forall (f :: * -> *) a. Applicative f => a -> f a
pure MessageType
UserPremiumGuildSubscriptionTier3
      Int
12 -> forall (f :: * -> *) a. Applicative f => a -> f a
pure MessageType
ChannelFollowAdd
      Int
14 -> forall (f :: * -> *) a. Applicative f => a -> f a
pure MessageType
GuildDiscoveryDisqualified
      Int
15 -> forall (f :: * -> *) a. Applicative f => a -> f a
pure MessageType
GuildDiscoveryRequalified
      Int
19 -> forall (f :: * -> *) a. Applicative f => a -> f a
pure MessageType
Reply
      Int
20 -> forall (f :: * -> *) a. Applicative f => a -> f a
pure MessageType
ApplicationCommmand
      Int
_ -> forall (m :: * -> *) a. MonadFail m => String -> m a
fail forall a b. (a -> b) -> a -> b
$ String
"Invalid MessageType: " forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Scientific
n
    Maybe Int
Nothing -> forall (m :: * -> *) a. MonadFail m => String -> m a
fail forall a b. (a -> b) -> a -> b
$ String
"Invalid MessageType: " forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Scientific
n

$(deriveTextShow ''MessageAuthorWebhook)
$(deriveTextShow 'PartialMessage)
$(deriveTextShow ''ChannelMention)
$(deriveTextShow ''MessageType)

$(makeFieldLabelsNoPrefix ''MessageAuthorWebhook)
$(makeFieldLabelsNoPrefix ''ChannelMention)
$(makeFieldLabelsNoPrefix 'PartialMessage)
$(makeFieldLabelsNoPrefix ''Message)
$(makeFieldLabelsNoPrefix ''MessageReference)