calamity-0.5.0.0: Calamity/Types/Model/Guild/Member.hs
{-# LANGUAGE TemplateHaskell #-}
-- | Guild Members
module Calamity.Types.Model.Guild.Member (Member (..)) where
import Calamity.Internal.Utils (AesonVector (unAesonVector))
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.Text (Text)
import Data.Time
import Data.Vector.Unboxing (Vector)
import qualified Data.Vector.Unboxing as V
import Data.Word (Word64)
import Optics.TH
import qualified TextShow
data Member = Member
{ id :: Snowflake User
, username :: Text
, discriminator :: Text
, bot :: Maybe Bool
, avatar :: Maybe Text
, mfaEnabled :: Maybe Bool
, verified :: Maybe Bool
, email :: Maybe Text
, flags :: Maybe Word64
, premiumType :: Maybe Word64
, nick :: Maybe Text
, roles :: Vector (Snowflake Role)
, joinedAt :: UTCTime
, deaf :: Bool
, mute :: Bool
}
deriving (Eq, Show)
deriving (TextShow.TextShow) via TextShow.FromStringShow Member
deriving (HasID Member) via HasIDFieldCoerce "id" Member User
deriving (HasID User) via HasIDField "id" Member
instance Aeson.FromJSON Member where
parseJSON = Aeson.withObject "Member" $ \v -> do
u :: Aeson.Object <- v .: "user"
Member
<$> u .: "id"
<*> u .: "username"
<*> u .: "discriminator"
<*> v .:? "bot"
<*> v .:? "avatar"
<*> v .:? "mfa_enabled"
<*> v .:? "verified"
<*> v .:? "email"
<*> v .:? "flags"
<*> v .:? "premium_type"
<*> v .:? "nick"
<*> (fmap unAesonVector <$> v .:? "roles") .!= V.empty
<*> v .: "joined_at"
<*> v .: "deaf"
<*> v .: "mute"
$(makeFieldLabelsNoPrefix ''Member)