module Calamity.Types.Model.Guild.Emoji
( Emoji(..)
, Partial(PartialEmoji)
, RawEmoji(..) ) where
import Calamity.Internal.AesonThings
import Calamity.Internal.Utils ()
import Calamity.Types.Model.Guild.Role
import Calamity.Types.Model.User
import Calamity.Types.Snowflake
import Data.Aeson
import Data.Text.Lazy ( Text )
import Data.Vector.Unboxed ( Vector )
import GHC.Generics
import TextShow
import qualified TextShow.Generic as TSG
data Emoji = Emoji
{ id :: Snowflake Emoji
, name :: Text
, roles :: Vector (Snowflake Role)
, user :: Maybe (Snowflake User)
, requireColons :: Bool
, managed :: Bool
, animated :: Bool
}
deriving ( Eq, Show, Generic )
deriving ( TextShow ) via TSG.FromGeneric Emoji
deriving ( ToJSON ) via CalamityJSON Emoji
deriving ( FromJSON ) via WithSpecialCases '["user" `ExtractField` "id"] Emoji
deriving ( HasID Emoji ) via HasIDField "id" Emoji
data instance Partial Emoji = PartialEmoji
{ id :: Snowflake Emoji
, name :: Text
}
deriving ( Eq, Show, Generic )
deriving ( TextShow ) via TSG.FromGeneric (Partial Emoji)
deriving ( ToJSON, FromJSON ) via CalamityJSON (Partial Emoji)
deriving ( HasID Emoji ) via HasIDField "id" (Partial Emoji)
data RawEmoji
= UnicodeEmoji Text
| CustomEmoji (Partial Emoji)
deriving ( Eq, Show, Generic )
deriving ( TextShow ) via TSG.FromGeneric RawEmoji
instance ToJSON RawEmoji where
toEncoding (CustomEmoji e) = pairs $ "emoji" .= e
toEncoding (UnicodeEmoji s) = pairs $ "emoji" .= (("name" .= s) :: Object)
instance FromJSON RawEmoji where
parseJSON = withObject "RawEmoji" $ \v -> do
m_id :: Maybe (Snowflake Emoji) <- v .:? "id"
name :: Text <- v .: "name"
pure $ case m_id of
Just id -> CustomEmoji $ PartialEmoji id name
Nothing -> UnicodeEmoji name