packages feed

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)