{-# LANGUAGE TemplateHaskell #-}

-- | Guild Members
module Calamity.Types.Model.Guild.Member (Member (..)) where

import Calamity.Internal.IntColour
import Calamity.Internal.Utils (AesonVector (unAesonVector))
import Calamity.Types.Model.Avatar (Avatar (..))
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.Colour (Colour)
import Data.Text (Text)
import Data.Text.Read (decimal)
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 -> Avatar
avatar :: Avatar
  , Member -> Maybe Text
memberAvatar :: Maybe Text
  , Member -> Maybe Bool
mfaEnabled :: Maybe Bool
  , Member -> Maybe UserBanner
banner :: Maybe UserBanner
  , Member -> Maybe (Colour Double)
accentColour :: Maybe (Colour Double)
  , Member -> Maybe Text
locale :: Maybe Text
  , 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
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
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
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 = forall a. String -> (Object -> Parser a) -> Value -> Parser a
Aeson.withObject String
"Member" forall a b. (a -> b) -> a -> b
$ \Object
v -> do
    Object
u :: Aeson.Object <- Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"user"
    Snowflake User
uid <- Object
u forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"id"
    Maybe Text
avatarHash <- Object
u forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"avatar"
    Text
discrim <- Object
u forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"discriminator"
    Int
discrim' <- case forall a. Integral a => Reader a
decimal Text
discrim of
      Right (Int
n, Text
_) -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Int
n
      Left String
e -> forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
e
    let avatar :: Avatar
avatar = Maybe Text -> Snowflake User -> Int -> Avatar
Avatar Maybe Text
avatarHash Snowflake User
uid Int
discrim'
    Maybe UserBanner
banner <- (Snowflake User -> Text -> UserBanner
UserBanner Snowflake User
uid forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"banner"
    Snowflake User
-> Text
-> Text
-> Maybe Bool
-> Avatar
-> Maybe Text
-> Maybe Bool
-> Maybe UserBanner
-> Maybe (Colour Double)
-> Maybe Text
-> Maybe Bool
-> Maybe Text
-> Maybe Word64
-> Maybe Word64
-> Maybe Text
-> Vector (Snowflake Role)
-> UTCTime
-> Bool
-> Bool
-> Member
Member
      forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (f :: * -> *) a. Applicative f => a -> f a
pure Snowflake User
uid
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
u forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"username"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
u forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"discriminator"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"bot"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Applicative f => a -> f a
pure Avatar
avatar
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"avatar"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"mfa_enabled"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe UserBanner
banner
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap IntColour -> Colour Double
fromIntColour forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"accent_color")
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"locale"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"verified"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"email"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"flags"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"premium_type"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"nick"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. AesonVector a -> Vector a
unAesonVector forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"roles") forall a. Parser (Maybe a) -> a -> Parser a
.!= forall a. Unboxable a => Vector a
V.empty
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"joined_at"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"deaf"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"mute"

$(makeFieldLabelsNoPrefix ''Member)