{-# LANGUAGE TemplateHaskell #-}

module Calamity.Types.Model.Voice.VoiceState (VoiceState (..)) where

import Calamity.Internal.Utils
import Calamity.Types.Model.Channel.Guild.Voice
import {-# SOURCE #-} Calamity.Types.Model.Guild.Guild
import Calamity.Types.Model.User
import Calamity.Types.Snowflake
import Data.Aeson ((.:), (.:?))
import qualified Data.Aeson as Aeson
import Data.Text (Text)
import Optics.TH
import TextShow.TH

data VoiceState = VoiceState
  { VoiceState -> Maybe (Snowflake Guild)
guildID :: Maybe (Snowflake Guild)
  , VoiceState -> Maybe (Snowflake VoiceChannel)
channelID :: Maybe (Snowflake VoiceChannel)
  , VoiceState -> Snowflake User
userID :: Snowflake User
  , VoiceState -> Text
sessionID :: Text
  , VoiceState -> Bool
deaf :: Bool
  , VoiceState -> Bool
mute :: Bool
  , VoiceState -> Bool
selfDeaf :: Bool
  , VoiceState -> Bool
selfMute :: Bool
  , VoiceState -> Bool
suppress :: Bool
  }
  deriving (Int -> VoiceState -> ShowS
[VoiceState] -> ShowS
VoiceState -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [VoiceState] -> ShowS
$cshowList :: [VoiceState] -> ShowS
show :: VoiceState -> String
$cshow :: VoiceState -> String
showsPrec :: Int -> VoiceState -> ShowS
$cshowsPrec :: Int -> VoiceState -> ShowS
Show, VoiceState -> VoiceState -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: VoiceState -> VoiceState -> Bool
$c/= :: VoiceState -> VoiceState -> Bool
== :: VoiceState -> VoiceState -> Bool
$c== :: VoiceState -> VoiceState -> Bool
Eq)
  deriving ([VoiceState] -> Encoding
[VoiceState] -> Value
VoiceState -> Encoding
VoiceState -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [VoiceState] -> Encoding
$ctoEncodingList :: [VoiceState] -> Encoding
toJSONList :: [VoiceState] -> Value
$ctoJSONList :: [VoiceState] -> Value
toEncoding :: VoiceState -> Encoding
$ctoEncoding :: VoiceState -> Encoding
toJSON :: VoiceState -> Value
$ctoJSON :: VoiceState -> Value
Aeson.ToJSON) via CalamityToJSON VoiceState

instance CalamityToJSON' VoiceState where
  toPairs :: forall kv. KeyValue kv => VoiceState -> [Maybe kv]
toPairs VoiceState {Bool
Maybe (Snowflake Guild)
Maybe (Snowflake VoiceChannel)
Text
Snowflake User
suppress :: Bool
selfMute :: Bool
selfDeaf :: Bool
mute :: Bool
deaf :: Bool
sessionID :: Text
userID :: Snowflake User
channelID :: Maybe (Snowflake VoiceChannel)
guildID :: Maybe (Snowflake Guild)
$sel:suppress:VoiceState :: VoiceState -> Bool
$sel:selfMute:VoiceState :: VoiceState -> Bool
$sel:selfDeaf:VoiceState :: VoiceState -> Bool
$sel:mute:VoiceState :: VoiceState -> Bool
$sel:deaf:VoiceState :: VoiceState -> Bool
$sel:sessionID:VoiceState :: VoiceState -> Text
$sel:userID:VoiceState :: VoiceState -> Snowflake User
$sel:channelID:VoiceState :: VoiceState -> Maybe (Snowflake VoiceChannel)
$sel:guildID:VoiceState :: VoiceState -> Maybe (Snowflake Guild)
..} =
    [ Key
"guild_id" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Maybe (Snowflake Guild)
guildID
    , Key
"channel_id" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Maybe (Snowflake VoiceChannel)
channelID
    , Key
"user_id" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Snowflake User
userID
    , Key
"session_id" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Text
sessionID
    , Key
"deaf" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Bool
deaf
    , Key
"mute" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Bool
mute
    , Key
"self_deaf" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Bool
selfDeaf
    , Key
"self_mute" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Bool
selfMute
    , Key
"suppress" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Bool
suppress
    ]

instance Aeson.FromJSON VoiceState where
  parseJSON :: Value -> Parser VoiceState
parseJSON = forall a. String -> (Object -> Parser a) -> Value -> Parser a
Aeson.withObject String
"VoiceState" forall a b. (a -> b) -> a -> b
$ \Object
v ->
    Maybe (Snowflake Guild)
-> Maybe (Snowflake VoiceChannel)
-> Snowflake User
-> Text
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> VoiceState
VoiceState
      forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"guild_id"
      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
"channel_id"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"user_id"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"session_id"
      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"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"self_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
"self_mute"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"suppress"

$(deriveTextShow ''VoiceState)
$(makeFieldLabelsNoPrefix ''VoiceState)