packages feed

calamity-0.2.0.0: Calamity/Types/Model/Guild/AuditLog.hs

-- | Audit Log models
module Calamity.Types.Model.Guild.AuditLog (
  AuditLog (..),
  AuditLogEntry (..),
  AuditLogEntryInfo (..),
  AuditLogChange (..),
  AuditLogAction (..),
) where

import Calamity.Internal.AesonThings
import Calamity.Internal.SnowflakeMap (SnowflakeMap)
import Calamity.Types.Model.Channel
import Calamity.Types.Model.User
import Calamity.Types.Snowflake

import Data.Aeson
import Data.Scientific
import Data.Text (Text)

import GHC.Generics

import TextShow
import qualified TextShow.Generic as TSG

data AuditLog = AuditLog
  { webhooks :: SnowflakeMap Webhook
  , users :: SnowflakeMap User
  , auditLogEntries :: SnowflakeMap AuditLogEntry
  }
  deriving (Show, Generic)
  deriving (TextShow) via TSG.FromGeneric AuditLog
  deriving (FromJSON) via CalamityJSON AuditLog

data AuditLogEntry = AuditLogEntry
  { targetID :: Maybe (Snowflake ())
  , changes :: [AuditLogChange]
  , userID :: Snowflake User
  , id :: Snowflake AuditLogEntry
  , actionType :: !AuditLogAction
  , options :: Maybe AuditLogEntryInfo
  , reason :: Maybe Text
  }
  deriving (Show, Generic)
  deriving (TextShow) via TSG.FromGeneric AuditLogEntry
  deriving (FromJSON) via CalamityJSON AuditLogEntry
  deriving (HasID User) via HasIDField "userID" AuditLogEntry
  deriving (HasID AuditLogEntry) via HasIDField "id" AuditLogEntry

data AuditLogEntryInfo = AuditLogEntryInfo
  { deleteMemberDays :: Maybe Text
  , membersRemoved :: Maybe Text
  , channelID :: Maybe (Snowflake Channel)
  , messageID :: Maybe (Snowflake Message)
  , count :: Maybe Text
  , id :: Maybe (Snowflake ())
  , type_ :: Maybe Text
  , roleName :: Maybe Text
  }
  deriving (Show, Generic)
  deriving (TextShow) via TSG.FromGeneric AuditLogEntryInfo
  deriving (FromJSON) via CalamityJSON AuditLogEntryInfo

data AuditLogChange = AuditLogChange
  { newValue :: Maybe Value
  , oldValue :: Maybe Value
  , key :: Text
  }
  deriving (Show, Generic)
  deriving (TextShow) via FromStringShow AuditLogChange
  deriving (FromJSON) via CalamityJSON AuditLogChange

data AuditLogAction
  = GUILD_UPDATE
  | CHANNEL_CREATE
  | CHANNEL_UPDATE
  | CHANNEL_DELETE
  | CHANNEL_OVERWRITE_CREATE
  | CHANNEL_OVERWRITE_UPDATE
  | CHANNEL_OVERWRITE_DELETE
  | MEMBER_KICK
  | MEMBER_PRUNE
  | MEMBER_BAN_ADD
  | MEMBER_BAN_REMOVE
  | MEMBER_UPDATE
  | MEMBER_ROLE_UPDATE
  | MEMBER_MOVE
  | MEMBER_DISCONNECT
  | BOT_ADD
  | ROLE_CREATE
  | ROLE_UPDATE
  | ROLE_DELETE
  | INVITE_CREATE
  | INVITE_UPDATE
  | INVITE_DELETE
  | WEBHOOK_CREATE
  | WEBHOOK_UPDATE
  | WEBHOOK_DELETE
  | EMOJI_CREATE
  | EMOJI_UPDATE
  | EMOJI_DELETE
  | MESSAGE_DELETE
  | MESSAGE_BULK_DELETE
  | MESSAGE_PIN
  | MESSAGE_UNPIN
  | INTEGRATION_CREATE
  | INTEGRATION_UPDATE
  | INTEGRATION_DELETE
  deriving (Show, Generic)
  deriving (TextShow) via TSG.FromGeneric AuditLogAction

instance Enum AuditLogAction where
  toEnum v = case v of
    1 -> GUILD_UPDATE
    10 -> CHANNEL_CREATE
    11 -> CHANNEL_UPDATE
    12 -> CHANNEL_DELETE
    13 -> CHANNEL_OVERWRITE_CREATE
    14 -> CHANNEL_OVERWRITE_UPDATE
    15 -> CHANNEL_OVERWRITE_DELETE
    20 -> MEMBER_KICK
    21 -> MEMBER_PRUNE
    22 -> MEMBER_BAN_ADD
    23 -> MEMBER_BAN_REMOVE
    24 -> MEMBER_UPDATE
    25 -> MEMBER_ROLE_UPDATE
    26 -> MEMBER_MOVE
    27 -> MEMBER_DISCONNECT
    28 -> BOT_ADD
    30 -> ROLE_CREATE
    31 -> ROLE_UPDATE
    32 -> ROLE_DELETE
    40 -> INVITE_CREATE
    41 -> INVITE_UPDATE
    42 -> INVITE_DELETE
    50 -> WEBHOOK_CREATE
    51 -> WEBHOOK_UPDATE
    52 -> WEBHOOK_DELETE
    60 -> EMOJI_CREATE
    61 -> EMOJI_UPDATE
    62 -> EMOJI_DELETE
    72 -> MESSAGE_DELETE
    73 -> MESSAGE_BULK_DELETE
    74 -> MESSAGE_PIN
    75 -> MESSAGE_UNPIN
    80 -> INTEGRATION_CREATE
    81 -> INTEGRATION_UPDATE
    82 -> INTEGRATION_DELETE
    _ -> error $ "Invalid AuditLogAction: " <> show v

  fromEnum v = case v of
    GUILD_UPDATE -> 1
    CHANNEL_CREATE -> 10
    CHANNEL_UPDATE -> 11
    CHANNEL_DELETE -> 12
    CHANNEL_OVERWRITE_CREATE -> 13
    CHANNEL_OVERWRITE_UPDATE -> 14
    CHANNEL_OVERWRITE_DELETE -> 15
    MEMBER_KICK -> 20
    MEMBER_PRUNE -> 21
    MEMBER_BAN_ADD -> 22
    MEMBER_BAN_REMOVE -> 23
    MEMBER_UPDATE -> 24
    MEMBER_ROLE_UPDATE -> 25
    MEMBER_MOVE -> 26
    MEMBER_DISCONNECT -> 27
    BOT_ADD -> 28
    ROLE_CREATE -> 30
    ROLE_UPDATE -> 31
    ROLE_DELETE -> 32
    INVITE_CREATE -> 40
    INVITE_UPDATE -> 41
    INVITE_DELETE -> 42
    WEBHOOK_CREATE -> 50
    WEBHOOK_UPDATE -> 51
    WEBHOOK_DELETE -> 52
    EMOJI_CREATE -> 60
    EMOJI_UPDATE -> 61
    EMOJI_DELETE -> 62
    MESSAGE_DELETE -> 72
    MESSAGE_BULK_DELETE -> 73
    MESSAGE_PIN -> 74
    MESSAGE_UNPIN -> 75
    INTEGRATION_CREATE -> 80
    INTEGRATION_UPDATE -> 81
    INTEGRATION_DELETE -> 82

instance FromJSON AuditLogAction where
  parseJSON = withScientific "AuditLogAction" $ \n -> case toBoundedInteger @Int n of
    Just v -> case v of --  no safe toEnum :S
      1 -> pure GUILD_UPDATE
      10 -> pure CHANNEL_CREATE
      11 -> pure CHANNEL_UPDATE
      12 -> pure CHANNEL_DELETE
      13 -> pure CHANNEL_OVERWRITE_CREATE
      14 -> pure CHANNEL_OVERWRITE_UPDATE
      15 -> pure CHANNEL_OVERWRITE_DELETE
      20 -> pure MEMBER_KICK
      21 -> pure MEMBER_PRUNE
      22 -> pure MEMBER_BAN_ADD
      23 -> pure MEMBER_BAN_REMOVE
      24 -> pure MEMBER_UPDATE
      25 -> pure MEMBER_ROLE_UPDATE
      26 -> pure MEMBER_MOVE
      27 -> pure MEMBER_DISCONNECT
      28 -> pure BOT_ADD
      30 -> pure ROLE_CREATE
      31 -> pure ROLE_UPDATE
      32 -> pure ROLE_DELETE
      40 -> pure INVITE_CREATE
      41 -> pure INVITE_UPDATE
      42 -> pure INVITE_DELETE
      50 -> pure WEBHOOK_CREATE
      51 -> pure WEBHOOK_UPDATE
      52 -> pure WEBHOOK_DELETE
      60 -> pure EMOJI_CREATE
      61 -> pure EMOJI_UPDATE
      62 -> pure EMOJI_DELETE
      72 -> pure MESSAGE_DELETE
      73 -> pure MESSAGE_BULK_DELETE
      74 -> pure MESSAGE_PIN
      75 -> pure MESSAGE_UNPIN
      80 -> pure INTEGRATION_CREATE
      81 -> pure INTEGRATION_UPDATE
      82 -> pure INTEGRATION_DELETE
      _ -> fail $ "Invalid AuditLogAction: " <> show n
    Nothing -> fail $ "Invalid AuditLogAction: " <> show n

instance ToJSON AuditLogAction where
  toJSON = toJSON @Int . fromEnum