{-# 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
  { Member -> Snowflake User
id :: Snowflake User
  , Member -> Text
username :: Text
  , Member -> Text
discriminator :: Text
  , Member -> Maybe Bool
bot :: Maybe Bool
  , Member -> Maybe Text
avatar :: Maybe Text
  , Member -> Maybe Bool
mfaEnabled :: Maybe Bool
  , Member -> Maybe Bool
verified :: Maybe Bool
  , Member -> Maybe Text
email :: Maybe Text
  , Member -> Maybe Word64
flags :: Maybe Word64
  , Member -> Maybe Word64
premiumType :: Maybe Word64
  , Member -> Maybe Text
nick :: Maybe Text
  , Member -> Vector (Snowflake Role)
roles :: Vector (Snowflake Role)
  , Member -> UTCTime
joinedAt :: UTCTime
  , Member -> Bool
deaf :: Bool
  , Member -> Bool
mute :: Bool
  }
  deriving (Member -> Member -> Bool
(Member -> Member -> Bool)
-> (Member -> Member -> Bool) -> Eq Member
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Member -> Member -> Bool
$c/= :: Member -> Member -> Bool
== :: Member -> Member -> Bool
$c== :: Member -> Member -> Bool
Eq, Int -> Member -> ShowS
[Member] -> ShowS
Member -> String
(Int -> Member -> ShowS)
-> (Member -> String) -> ([Member] -> ShowS) -> Show Member
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Member] -> ShowS
$cshowList :: [Member] -> ShowS
show :: Member -> String
$cshow :: Member -> String
showsPrec :: Int -> Member -> ShowS
$cshowsPrec :: Int -> Member -> ShowS
Show)
  deriving (Int -> Member -> Builder
Int -> Member -> Text
Int -> Member -> Text
[Member] -> Builder
[Member] -> Text
[Member] -> Text
Member -> Builder
Member -> Text
Member -> Text
(Int -> Member -> Builder)
-> (Member -> Builder)
-> ([Member] -> Builder)
-> (Int -> Member -> Text)
-> (Member -> Text)
-> ([Member] -> Text)
-> (Int -> Member -> Text)
-> (Member -> Text)
-> ([Member] -> Text)
-> TextShow Member
forall a.
(Int -> a -> Builder)
-> (a -> Builder)
-> ([a] -> Builder)
-> (Int -> a -> Text)
-> (a -> Text)
-> ([a] -> Text)
-> (Int -> a -> Text)
-> (a -> Text)
-> ([a] -> Text)
-> TextShow a
showtlList :: [Member] -> Text
$cshowtlList :: [Member] -> Text
showtl :: Member -> Text
$cshowtl :: Member -> Text
showtlPrec :: Int -> Member -> Text
$cshowtlPrec :: Int -> Member -> Text
showtList :: [Member] -> Text
$cshowtList :: [Member] -> Text
showt :: Member -> Text
$cshowt :: Member -> Text
showtPrec :: Int -> Member -> Text
$cshowtPrec :: Int -> Member -> Text
showbList :: [Member] -> Builder
$cshowbList :: [Member] -> Builder
showb :: Member -> Builder
$cshowb :: Member -> Builder
showbPrec :: Int -> Member -> Builder
$cshowbPrec :: Int -> Member -> Builder
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 :: Value -> Parser Member
parseJSON = String -> (Object -> Parser Member) -> Value -> Parser Member
forall a. String -> (Object -> Parser a) -> Value -> Parser a
Aeson.withObject String
"Member" ((Object -> Parser Member) -> Value -> Parser Member)
-> (Object -> Parser Member) -> Value -> Parser Member
forall a b. (a -> b) -> a -> b
$ \Object
v -> do
    Object
u :: Aeson.Object <- Object
v Object -> Key -> Parser Object
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"user"

    Snowflake User
-> Text
-> Text
-> Maybe Bool
-> Maybe Text
-> Maybe Bool
-> Maybe Bool
-> Maybe Text
-> Maybe Word64
-> Maybe Word64
-> Maybe Text
-> Vector (Snowflake Role)
-> UTCTime
-> Bool
-> Bool
-> Member
Member
      (Snowflake User
 -> Text
 -> Text
 -> Maybe Bool
 -> Maybe Text
 -> Maybe Bool
 -> Maybe Bool
 -> Maybe Text
 -> Maybe Word64
 -> Maybe Word64
 -> Maybe Text
 -> Vector (Snowflake Role)
 -> UTCTime
 -> Bool
 -> Bool
 -> Member)
-> Parser (Snowflake User)
-> Parser
     (Text
      -> Text
      -> Maybe Bool
      -> Maybe Text
      -> Maybe Bool
      -> Maybe Bool
      -> Maybe Text
      -> Maybe Word64
      -> Maybe Word64
      -> Maybe Text
      -> Vector (Snowflake Role)
      -> UTCTime
      -> Bool
      -> Bool
      -> Member)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
u Object -> Key -> Parser (Snowflake User)
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"id"
      Parser
  (Text
   -> Text
   -> Maybe Bool
   -> Maybe Text
   -> Maybe Bool
   -> Maybe Bool
   -> Maybe Text
   -> Maybe Word64
   -> Maybe Word64
   -> Maybe Text
   -> Vector (Snowflake Role)
   -> UTCTime
   -> Bool
   -> Bool
   -> Member)
-> Parser Text
-> Parser
     (Text
      -> Maybe Bool
      -> Maybe Text
      -> Maybe Bool
      -> Maybe Bool
      -> Maybe Text
      -> Maybe Word64
      -> Maybe Word64
      -> Maybe Text
      -> Vector (Snowflake Role)
      -> UTCTime
      -> Bool
      -> Bool
      -> Member)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
u Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"username"
      Parser
  (Text
   -> Maybe Bool
   -> Maybe Text
   -> Maybe Bool
   -> Maybe Bool
   -> Maybe Text
   -> Maybe Word64
   -> Maybe Word64
   -> Maybe Text
   -> Vector (Snowflake Role)
   -> UTCTime
   -> Bool
   -> Bool
   -> Member)
-> Parser Text
-> Parser
     (Maybe Bool
      -> Maybe Text
      -> Maybe Bool
      -> Maybe Bool
      -> Maybe Text
      -> Maybe Word64
      -> Maybe Word64
      -> Maybe Text
      -> Vector (Snowflake Role)
      -> UTCTime
      -> Bool
      -> Bool
      -> Member)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
u Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"discriminator"
      Parser
  (Maybe Bool
   -> Maybe Text
   -> Maybe Bool
   -> Maybe Bool
   -> Maybe Text
   -> Maybe Word64
   -> Maybe Word64
   -> Maybe Text
   -> Vector (Snowflake Role)
   -> UTCTime
   -> Bool
   -> Bool
   -> Member)
-> Parser (Maybe Bool)
-> Parser
     (Maybe Text
      -> Maybe Bool
      -> Maybe Bool
      -> Maybe Text
      -> Maybe Word64
      -> Maybe Word64
      -> Maybe Text
      -> Vector (Snowflake Role)
      -> UTCTime
      -> Bool
      -> Bool
      -> Member)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"bot"
      Parser
  (Maybe Text
   -> Maybe Bool
   -> Maybe Bool
   -> Maybe Text
   -> Maybe Word64
   -> Maybe Word64
   -> Maybe Text
   -> Vector (Snowflake Role)
   -> UTCTime
   -> Bool
   -> Bool
   -> Member)
-> Parser (Maybe Text)
-> Parser
     (Maybe Bool
      -> Maybe Bool
      -> Maybe Text
      -> Maybe Word64
      -> Maybe Word64
      -> Maybe Text
      -> Vector (Snowflake Role)
      -> UTCTime
      -> Bool
      -> Bool
      -> Member)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"avatar"
      Parser
  (Maybe Bool
   -> Maybe Bool
   -> Maybe Text
   -> Maybe Word64
   -> Maybe Word64
   -> Maybe Text
   -> Vector (Snowflake Role)
   -> UTCTime
   -> Bool
   -> Bool
   -> Member)
-> Parser (Maybe Bool)
-> Parser
     (Maybe Bool
      -> Maybe Text
      -> Maybe Word64
      -> Maybe Word64
      -> Maybe Text
      -> Vector (Snowflake Role)
      -> UTCTime
      -> Bool
      -> Bool
      -> Member)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"mfa_enabled"
      Parser
  (Maybe Bool
   -> Maybe Text
   -> Maybe Word64
   -> Maybe Word64
   -> Maybe Text
   -> Vector (Snowflake Role)
   -> UTCTime
   -> Bool
   -> Bool
   -> Member)
-> Parser (Maybe Bool)
-> Parser
     (Maybe Text
      -> Maybe Word64
      -> Maybe Word64
      -> Maybe Text
      -> Vector (Snowflake Role)
      -> UTCTime
      -> Bool
      -> Bool
      -> Member)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"verified"
      Parser
  (Maybe Text
   -> Maybe Word64
   -> Maybe Word64
   -> Maybe Text
   -> Vector (Snowflake Role)
   -> UTCTime
   -> Bool
   -> Bool
   -> Member)
-> Parser (Maybe Text)
-> Parser
     (Maybe Word64
      -> Maybe Word64
      -> Maybe Text
      -> Vector (Snowflake Role)
      -> UTCTime
      -> Bool
      -> Bool
      -> Member)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"email"
      Parser
  (Maybe Word64
   -> Maybe Word64
   -> Maybe Text
   -> Vector (Snowflake Role)
   -> UTCTime
   -> Bool
   -> Bool
   -> Member)
-> Parser (Maybe Word64)
-> Parser
     (Maybe Word64
      -> Maybe Text
      -> Vector (Snowflake Role)
      -> UTCTime
      -> Bool
      -> Bool
      -> Member)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe Word64)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"flags"
      Parser
  (Maybe Word64
   -> Maybe Text
   -> Vector (Snowflake Role)
   -> UTCTime
   -> Bool
   -> Bool
   -> Member)
-> Parser (Maybe Word64)
-> Parser
     (Maybe Text
      -> Vector (Snowflake Role) -> UTCTime -> Bool -> Bool -> Member)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe Word64)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"premium_type"
      Parser
  (Maybe Text
   -> Vector (Snowflake Role) -> UTCTime -> Bool -> Bool -> Member)
-> Parser (Maybe Text)
-> Parser
     (Vector (Snowflake Role) -> UTCTime -> Bool -> Bool -> Member)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"nick"
      Parser
  (Vector (Snowflake Role) -> UTCTime -> Bool -> Bool -> Member)
-> Parser (Vector (Snowflake Role))
-> Parser (UTCTime -> Bool -> Bool -> Member)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ((AesonVector (Snowflake Role) -> Vector (Snowflake Role))
-> Maybe (AesonVector (Snowflake Role))
-> Maybe (Vector (Snowflake Role))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap AesonVector (Snowflake Role) -> Vector (Snowflake Role)
forall a. AesonVector a -> Vector a
unAesonVector (Maybe (AesonVector (Snowflake Role))
 -> Maybe (Vector (Snowflake Role)))
-> Parser (Maybe (AesonVector (Snowflake Role)))
-> Parser (Maybe (Vector (Snowflake Role)))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser (Maybe (AesonVector (Snowflake Role)))
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"roles") Parser (Maybe (Vector (Snowflake Role)))
-> Vector (Snowflake Role) -> Parser (Vector (Snowflake Role))
forall a. Parser (Maybe a) -> a -> Parser a
.!= Vector (Snowflake Role)
forall a. Unboxable a => Vector a
V.empty
      Parser (UTCTime -> Bool -> Bool -> Member)
-> Parser UTCTime -> Parser (Bool -> Bool -> Member)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser UTCTime
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"joined_at"
      Parser (Bool -> Bool -> Member)
-> Parser Bool -> Parser (Bool -> Member)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser Bool
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"deaf"
      Parser (Bool -> Member) -> Parser Bool -> Parser Member
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser Bool
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"mute"

$(makeFieldLabelsNoPrefix ''Member)