calamity-0.8.0.0: Calamity/Types/Model/Channel/Guild.hs
{-# LANGUAGE TemplateHaskell #-}
-- | The generic guild channel type
module Calamity.Types.Model.Channel.Guild (
GuildChannel (..),
module Calamity.Types.Model.Channel.Guild.Category,
module Calamity.Types.Model.Channel.Guild.Text,
module Calamity.Types.Model.Channel.Guild.Voice,
) where
import {-# SOURCE #-} Calamity.Types.Model.Channel
import Calamity.Types.Model.Channel.ChannelType
import Calamity.Types.Model.Channel.Guild.Category
import Calamity.Types.Model.Channel.Guild.Text
import Calamity.Types.Model.Channel.Guild.Voice
import {-# SOURCE #-} Calamity.Types.Model.Guild.Guild
import Calamity.Types.Snowflake
import Data.Aeson ((.:))
import Data.Aeson qualified as Aeson
import Optics ((^.))
import Optics.TH
import TextShow.TH
data GuildChannel
= GuildTextChannel TextChannel
| GuildVoiceChannel VoiceChannel
| GuildCategory Category
| OtherGuildChannel (Snowflake Guild) (Snowflake GuildChannel) -- TODO
deriving (Show, Eq)
instance Aeson.FromJSON GuildChannel where
parseJSON = Aeson.withObject "GuildChannel" $ \v -> do
type_ <- v .: "type"
case type_ of
GuildTextType -> GuildTextChannel <$> Aeson.parseJSON (Aeson.Object v)
GuildVoiceType -> GuildVoiceChannel <$> Aeson.parseJSON (Aeson.Object v)
GuildCategoryType -> GuildCategory <$> Aeson.parseJSON (Aeson.Object v)
_typ -> do
id_ <- v .: "id"
guildID <- v .: "guild_id"
pure $ OtherGuildChannel guildID id_
instance HasID GuildChannel GuildChannel where
getID (GuildTextChannel a) = coerceSnowflake $ a ^. #id
getID (GuildVoiceChannel a) = coerceSnowflake $ a ^. #id
getID (GuildCategory a) = coerceSnowflake $ a ^. #id
getID (OtherGuildChannel _ a) = a
instance HasID Channel GuildChannel where
getID = coerceSnowflake . getID @GuildChannel
instance HasID Guild GuildChannel where
getID (GuildTextChannel a) = coerceSnowflake $ a ^. #guildID
getID (GuildVoiceChannel a) = coerceSnowflake $ a ^. #guildID
getID (GuildCategory a) = coerceSnowflake $ a ^. #guildID
getID (OtherGuildChannel a _) = a
$(deriveTextShow ''GuildChannel)
$(makeFieldLabelsNoPrefix ''GuildChannel)