packages feed

calamity-0.12.1.0: Calamity/Types/Model/Voice/VoiceState.hs

{-# 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 Data.Aeson qualified as Aeson
import Data.Text (Text)
import Optics.TH
import TextShow.TH

data VoiceState = VoiceState
  { guildID :: Maybe (Snowflake Guild)
  , channelID :: Maybe (Snowflake VoiceChannel)
  , userID :: Snowflake User
  , sessionID :: Text
  , deaf :: Bool
  , mute :: Bool
  , selfDeaf :: Bool
  , selfMute :: Bool
  , suppress :: Bool
  }
  deriving (Show, Eq)
  deriving (Aeson.ToJSON) via CalamityToJSON VoiceState

instance CalamityToJSON' VoiceState where
  toPairs VoiceState {..} =
    [ "guild_id" .= guildID
    , "channel_id" .= channelID
    , "user_id" .= userID
    , "session_id" .= sessionID
    , "deaf" .= deaf
    , "mute" .= mute
    , "self_deaf" .= selfDeaf
    , "self_mute" .= selfMute
    , "suppress" .= suppress
    ]

instance Aeson.FromJSON VoiceState where
  parseJSON = Aeson.withObject "VoiceState" $ \v ->
    VoiceState
      <$> v .:? "guild_id"
      <*> v .:? "channel_id"
      <*> v .: "user_id"
      <*> v .: "session_id"
      <*> v .: "deaf"
      <*> v .: "mute"
      <*> v .: "self_deaf"
      <*> v .: "self_mute"
      <*> v .: "suppress"

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