calamity-0.12.1.0: Calamity/Types/Model/Channel.hs
{-# LANGUAGE TemplateHaskell #-}
-- | The generic channel type
module Calamity.Types.Model.Channel (
Channel (..),
Partial (PartialChannel),
module Calamity.Types.Model.Channel.DM,
module Calamity.Types.Model.Channel.Group,
module Calamity.Types.Model.Channel.Guild,
module Calamity.Types.Model.Channel.Attachment,
module Calamity.Types.Model.Channel.Reaction,
module Calamity.Types.Model.Channel.Webhook,
module Calamity.Types.Model.Channel.Embed,
module Calamity.Types.Model.Channel.ChannelType,
module Calamity.Types.Model.Channel.Message,
module Calamity.Types.Model.Channel.Component,
) where
import Calamity.Internal.Utils
import Calamity.Types.Model.Channel.Attachment
import Calamity.Types.Model.Channel.ChannelType
import Calamity.Types.Model.Channel.Component
import Calamity.Types.Model.Channel.DM
import Calamity.Types.Model.Channel.Embed
import Calamity.Types.Model.Channel.Group
import Calamity.Types.Model.Channel.Guild
import Calamity.Types.Model.Channel.Message
import Calamity.Types.Model.Channel.Reaction
import Calamity.Types.Model.Channel.Webhook
import Calamity.Types.Model.Guild.Permissions (Permissions)
import Calamity.Types.Snowflake
import Data.Aeson ((.:), (.:?))
import Data.Aeson qualified as Aeson
import Data.Text (Text)
import Optics.TH
import TextShow.TH
data Channel
= DMChannel' DMChannel
| GroupChannel' GroupChannel
| GuildChannel' GuildChannel
deriving (Show, Eq)
instance HasID Channel Channel where
getID (DMChannel' a) = getID a
getID (GroupChannel' a) = getID a
getID (GuildChannel' a) = getID a
instance Aeson.FromJSON Channel where
parseJSON = Aeson.withObject "Channel" $ \v -> do
type_ <- v Aeson..: "type"
case type_ of
GuildTextType -> GuildChannel' <$> Aeson.parseJSON (Aeson.Object v)
GuildVoiceType -> GuildChannel' <$> Aeson.parseJSON (Aeson.Object v)
GuildCategoryType -> GuildChannel' <$> Aeson.parseJSON (Aeson.Object v)
DMType -> DMChannel' <$> Aeson.parseJSON (Aeson.Object v)
GroupDMType -> GroupChannel' <$> Aeson.parseJSON (Aeson.Object v)
GuildNewsType -> GuildChannel' <$> Aeson.parseJSON (Aeson.Object v)
GuildNewsThreadType -> GuildChannel' <$> Aeson.parseJSON (Aeson.Object v)
GuildPublicThreadType -> GuildChannel' <$> Aeson.parseJSON (Aeson.Object v)
GuildPrivateThreadType -> GuildChannel' <$> Aeson.parseJSON (Aeson.Object v)
GuildStageVoiceType -> GuildChannel' <$> Aeson.parseJSON (Aeson.Object v)
GuildDirectoryType -> GuildChannel' <$> Aeson.parseJSON (Aeson.Object v)
GuildForumType -> GuildChannel' <$> Aeson.parseJSON (Aeson.Object v)
data instance Partial Channel = PartialChannel
{ id :: Snowflake Channel
, name :: Text
, type_ :: ChannelType
, permissions :: Maybe Permissions
, parentID :: Maybe (Snowflake Category)
}
deriving (Show, Eq)
deriving (HasID Channel) via HasIDField "id" (Partial Channel)
deriving (Aeson.ToJSON) via CalamityToJSON (Partial Channel)
instance CalamityToJSON' (Partial Channel) where
toPairs PartialChannel {..} =
[ "id" .= id
, "name" .= name
, "type" .= type_
, "permissions" .?= permissions
, "parent_id" .?= parentID
]
instance Aeson.FromJSON (Partial Channel) where
parseJSON = Aeson.withObject "Partial Channel" $ \v ->
PartialChannel
<$> v .: "id"
<*> v .: "name"
<*> v .: "type"
<*> v .:? "permissions"
<*> v .:? "parent_id"
$(deriveTextShow ''Channel)
$(deriveTextShow 'PartialChannel)
$(makeFieldLabelsNoPrefix ''Channel)
$(makeFieldLabelsNoPrefix 'PartialChannel)