packages feed

discord-haskell 1.16.1 → 1.17.0

raw patch · 12 files changed

+726/−79 lines, 12 filesdep +hashabledep ~basedep ~websocketsPVP ok

version bump matches the API change (PVP)

Dependencies added: hashable

Dependency ranges changed: base, websockets

API changes (from Hackage documentation)

+ Discord.Internal.Rest.AutoModeration: MakeAutoModerationRule :: String -> AutoModerationRuleEventType -> AutoModerationRuleTriggerType -> Maybe AutoModerationRuleTriggerMetadata -> [AutoModerationRuleAction] -> Bool -> [RoleId] -> [ChannelId] -> MakeAutoModerationRule
+ Discord.Internal.Rest.AutoModeration: [CreateAutoModerationRule] :: GuildId -> MakeAutoModerationRule -> AutoModerationRequest ()
+ Discord.Internal.Rest.AutoModeration: [DeleteAutoModerationRule] :: GuildId -> AutoModerationRuleId -> AutoModerationRequest ()
+ Discord.Internal.Rest.AutoModeration: [GetAutoModerationRule] :: GuildId -> AutoModerationRuleId -> AutoModerationRequest AutoModerationRule
+ Discord.Internal.Rest.AutoModeration: [ListAutoModerationRules] :: GuildId -> AutoModerationRequest [AutoModerationRule]
+ Discord.Internal.Rest.AutoModeration: [ModifyAutoModerationRule] :: GuildId -> AutoModerationRuleId -> MakeAutoModerationRule -> AutoModerationRequest AutoModerationRule
+ Discord.Internal.Rest.AutoModeration: [makeAutoModerationRuleActions] :: MakeAutoModerationRule -> [AutoModerationRuleAction]
+ Discord.Internal.Rest.AutoModeration: [makeAutoModerationRuleEnabled] :: MakeAutoModerationRule -> Bool
+ Discord.Internal.Rest.AutoModeration: [makeAutoModerationRuleEventType] :: MakeAutoModerationRule -> AutoModerationRuleEventType
+ Discord.Internal.Rest.AutoModeration: [makeAutoModerationRuleExemptChannels] :: MakeAutoModerationRule -> [ChannelId]
+ Discord.Internal.Rest.AutoModeration: [makeAutoModerationRuleExemptRoles] :: MakeAutoModerationRule -> [RoleId]
+ Discord.Internal.Rest.AutoModeration: [makeAutoModerationRuleName] :: MakeAutoModerationRule -> String
+ Discord.Internal.Rest.AutoModeration: [makeAutoModerationRuleTriggerMetadata] :: MakeAutoModerationRule -> Maybe AutoModerationRuleTriggerMetadata
+ Discord.Internal.Rest.AutoModeration: [makeAutoModerationRuleTriggerType] :: MakeAutoModerationRule -> AutoModerationRuleTriggerType
+ Discord.Internal.Rest.AutoModeration: data AutoModerationRequest a
+ Discord.Internal.Rest.AutoModeration: data MakeAutoModerationRule
+ Discord.Internal.Rest.AutoModeration: instance Data.Aeson.Types.FromJSON.FromJSON Discord.Internal.Rest.AutoModeration.MakeAutoModerationRule
+ Discord.Internal.Rest.AutoModeration: instance Data.Aeson.Types.ToJSON.ToJSON Discord.Internal.Rest.AutoModeration.MakeAutoModerationRule
+ Discord.Internal.Rest.AutoModeration: instance Discord.Internal.Rest.Prelude.Request (Discord.Internal.Rest.AutoModeration.AutoModerationRequest a)
+ Discord.Internal.Rest.AutoModeration: instance GHC.Read.Read Discord.Internal.Rest.AutoModeration.MakeAutoModerationRule
+ Discord.Internal.Rest.AutoModeration: instance GHC.Show.Show Discord.Internal.Rest.AutoModeration.MakeAutoModerationRule
+ Discord.Internal.Rest.Guild: [GetGuildAuditLog] :: GuildId -> GetAuditLogOpts -> GuildRequest AuditLog
+ Discord.Internal.Types: AfterLogEntry :: AuditLogEntryId -> AuditLogTiming
+ Discord.Internal.Types: AuditLog :: [AuditLogEntry] -> [User] -> [Integration] -> [Webhook] -> [ScheduledEvent] -> [Channel] -> [ApplicationCommand] -> [AutoModerationRule] -> AuditLog
+ Discord.Internal.Types: AuditLogChange :: String -> Maybe Value -> Maybe Value -> AuditLogChange
+ Discord.Internal.Types: AuditLogEntry :: AuditLogEntryId -> AuditLogEvent -> Maybe UserId -> Maybe Snowflake -> Maybe [AuditLogChange] -> Maybe AuditLogEntryOptions -> Maybe String -> AuditLogEntry
+ Discord.Internal.Types: BeforeLogEntry :: AuditLogEntryId -> AuditLogTiming
+ Discord.Internal.Types: GetAuditLogOpts :: Maybe UserId -> Maybe AuditLogEvent -> Maybe AuditLogTiming -> Maybe Int -> GetAuditLogOpts
+ Discord.Internal.Types: LatestLogEntries :: AuditLogTiming
+ Discord.Internal.Types: [auditLogApplicationCommands] :: AuditLog -> [ApplicationCommand]
+ Discord.Internal.Types: [auditLogAutoModerationRules] :: AuditLog -> [AutoModerationRule]
+ Discord.Internal.Types: [auditLogChangeKey] :: AuditLogChange -> String
+ Discord.Internal.Types: [auditLogChangeNewValue] :: AuditLogChange -> Maybe Value
+ Discord.Internal.Types: [auditLogChangeOldValue] :: AuditLogChange -> Maybe Value
+ Discord.Internal.Types: [auditLogEntries] :: AuditLog -> [AuditLogEntry]
+ Discord.Internal.Types: [auditLogEntryActionType] :: AuditLogEntry -> AuditLogEvent
+ Discord.Internal.Types: [auditLogEntryChanges] :: AuditLogEntry -> Maybe [AuditLogChange]
+ Discord.Internal.Types: [auditLogEntryId] :: AuditLogEntry -> AuditLogEntryId
+ Discord.Internal.Types: [auditLogEntryOptions] :: AuditLogEntry -> Maybe AuditLogEntryOptions
+ Discord.Internal.Types: [auditLogEntryReasons] :: AuditLogEntry -> Maybe String
+ Discord.Internal.Types: [auditLogEntryTargetId] :: AuditLogEntry -> Maybe Snowflake
+ Discord.Internal.Types: [auditLogEntryUserId] :: AuditLogEntry -> Maybe UserId
+ Discord.Internal.Types: [auditLogIntegrations] :: AuditLog -> [Integration]
+ Discord.Internal.Types: [auditLogThreads] :: AuditLog -> [Channel]
+ Discord.Internal.Types: [auditLogUsers] :: AuditLog -> [User]
+ Discord.Internal.Types: [auditLogWebhooks] :: AuditLog -> [Webhook]
+ Discord.Internal.Types: [auditlogScheduledEvents] :: AuditLog -> [ScheduledEvent]
+ Discord.Internal.Types: [getAuditLogActionType] :: GetAuditLogOpts -> Maybe AuditLogEvent
+ Discord.Internal.Types: [getAuditLogLimit] :: GetAuditLogOpts -> Maybe Int
+ Discord.Internal.Types: [getAuditLogTiming] :: GetAuditLogOpts -> Maybe AuditLogTiming
+ Discord.Internal.Types: [getAuditLogUserId] :: GetAuditLogOpts -> Maybe UserId
+ Discord.Internal.Types: data AuditLog
+ Discord.Internal.Types: data AuditLogChange
+ Discord.Internal.Types: data AuditLogEntry
+ Discord.Internal.Types: data AuditLogEntryOptions
+ Discord.Internal.Types: data AuditLogEvent
+ Discord.Internal.Types: data AuditLogTiming
+ Discord.Internal.Types: data GetAuditLogOpts
+ Discord.Internal.Types: toAuditLogEvent :: Int -> Maybe AuditLogEvent
+ Discord.Internal.Types.ApplicationInfo: DiscordInstallParams :: [Text] -> Text -> DiscordInstallParams
+ Discord.Internal.Types.ApplicationInfo: DiscordTeam :: Maybe Text -> DiscordTeamId -> [DiscordTeamMember] -> Text -> UserId -> DiscordTeam
+ Discord.Internal.Types.ApplicationInfo: DiscordTeamMember :: DiscordTeamMemberState -> DiscordTeamId -> UserId -> Text -> DiscordTeamMember
+ Discord.Internal.Types.ApplicationInfo: DiscordTeamMemberStateAccepted :: DiscordTeamMemberState
+ Discord.Internal.Types.ApplicationInfo: DiscordTeamMemberStateInvited :: DiscordTeamMemberState
+ Discord.Internal.Types.ApplicationInfo: DiscordTeamMemberStateUnknown :: DiscordTeamMemberState
+ Discord.Internal.Types.ApplicationInfo: [discordInstallParamsPermissions] :: DiscordInstallParams -> Text
+ Discord.Internal.Types.ApplicationInfo: [discordInstallParamsScopes] :: DiscordInstallParams -> [Text]
+ Discord.Internal.Types.ApplicationInfo: [discordTeamIcon] :: DiscordTeam -> Maybe Text
+ Discord.Internal.Types.ApplicationInfo: [discordTeamId] :: DiscordTeam -> DiscordTeamId
+ Discord.Internal.Types.ApplicationInfo: [discordTeamMemberOwnerRole] :: DiscordTeamMember -> Text
+ Discord.Internal.Types.ApplicationInfo: [discordTeamMemberParentTeam] :: DiscordTeamMember -> DiscordTeamId
+ Discord.Internal.Types.ApplicationInfo: [discordTeamMemberState] :: DiscordTeamMember -> DiscordTeamMemberState
+ Discord.Internal.Types.ApplicationInfo: [discordTeamMemberUserId] :: DiscordTeamMember -> UserId
+ Discord.Internal.Types.ApplicationInfo: [discordTeamMembers] :: DiscordTeam -> [DiscordTeamMember]
+ Discord.Internal.Types.ApplicationInfo: [discordTeamName] :: DiscordTeam -> Text
+ Discord.Internal.Types.ApplicationInfo: [discordTeamOwnerUserId] :: DiscordTeam -> UserId
+ Discord.Internal.Types.ApplicationInfo: [fullApplicationApproximateGuildCount] :: FullApplication -> Maybe Integer
+ Discord.Internal.Types.ApplicationInfo: [fullApplicationBotPublic] :: FullApplication -> Bool
+ Discord.Internal.Types.ApplicationInfo: [fullApplicationBotUserId] :: FullApplication -> Maybe UserId
+ Discord.Internal.Types.ApplicationInfo: [fullApplicationCoverImage] :: FullApplication -> Maybe Text
+ Discord.Internal.Types.ApplicationInfo: [fullApplicationCustomInstallUrl] :: FullApplication -> Maybe Text
+ Discord.Internal.Types.ApplicationInfo: [fullApplicationDescription] :: FullApplication -> Text
+ Discord.Internal.Types.ApplicationInfo: [fullApplicationGameSKUId] :: FullApplication -> Maybe GameSKUId
+ Discord.Internal.Types.ApplicationInfo: [fullApplicationGuildId] :: FullApplication -> Maybe GuildId
+ Discord.Internal.Types.ApplicationInfo: [fullApplicationIcon] :: FullApplication -> Maybe Text
+ Discord.Internal.Types.ApplicationInfo: [fullApplicationInstallParams] :: FullApplication -> Maybe DiscordInstallParams
+ Discord.Internal.Types.ApplicationInfo: [fullApplicationInteractionEndpointURL] :: FullApplication -> Maybe Text
+ Discord.Internal.Types.ApplicationInfo: [fullApplicationOwnerId] :: FullApplication -> Maybe UserId
+ Discord.Internal.Types.ApplicationInfo: [fullApplicationPrivacyPolicyUrl] :: FullApplication -> Maybe Text
+ Discord.Internal.Types.ApplicationInfo: [fullApplicationRPCOrigins] :: FullApplication -> Maybe [Text]
+ Discord.Internal.Types.ApplicationInfo: [fullApplicationRedirectURIs] :: FullApplication -> Maybe [Text]
+ Discord.Internal.Types.ApplicationInfo: [fullApplicationRequiresCodeGrant] :: FullApplication -> Bool
+ Discord.Internal.Types.ApplicationInfo: [fullApplicationRoleConnectionVerificationURL] :: FullApplication -> Maybe Text
+ Discord.Internal.Types.ApplicationInfo: [fullApplicationTags] :: FullApplication -> Maybe [Text]
+ Discord.Internal.Types.ApplicationInfo: [fullApplicationTeam] :: FullApplication -> Maybe DiscordTeam
+ Discord.Internal.Types.ApplicationInfo: [fullApplicationTermsOfServiceUrl] :: FullApplication -> Maybe Text
+ Discord.Internal.Types.ApplicationInfo: [fullApplicationVerifyKey] :: FullApplication -> Text
+ Discord.Internal.Types.ApplicationInfo: [fullapplicationSlug] :: FullApplication -> Maybe Text
+ Discord.Internal.Types.ApplicationInfo: data DiscordInstallParams
+ Discord.Internal.Types.ApplicationInfo: data DiscordTeam
+ Discord.Internal.Types.ApplicationInfo: data DiscordTeamMember
+ Discord.Internal.Types.ApplicationInfo: data DiscordTeamMemberState
+ Discord.Internal.Types.ApplicationInfo: instance Data.Aeson.Types.FromJSON.FromJSON Discord.Internal.Types.ApplicationInfo.DiscordInstallParams
+ Discord.Internal.Types.ApplicationInfo: instance Data.Aeson.Types.FromJSON.FromJSON Discord.Internal.Types.ApplicationInfo.DiscordTeam
+ Discord.Internal.Types.ApplicationInfo: instance Data.Aeson.Types.FromJSON.FromJSON Discord.Internal.Types.ApplicationInfo.DiscordTeamMember
+ Discord.Internal.Types.ApplicationInfo: instance GHC.Classes.Eq Discord.Internal.Types.ApplicationInfo.DiscordInstallParams
+ Discord.Internal.Types.ApplicationInfo: instance GHC.Classes.Eq Discord.Internal.Types.ApplicationInfo.DiscordTeam
+ Discord.Internal.Types.ApplicationInfo: instance GHC.Classes.Eq Discord.Internal.Types.ApplicationInfo.DiscordTeamMember
+ Discord.Internal.Types.ApplicationInfo: instance GHC.Classes.Eq Discord.Internal.Types.ApplicationInfo.DiscordTeamMemberState
+ Discord.Internal.Types.ApplicationInfo: instance GHC.Classes.Ord Discord.Internal.Types.ApplicationInfo.DiscordInstallParams
+ Discord.Internal.Types.ApplicationInfo: instance GHC.Classes.Ord Discord.Internal.Types.ApplicationInfo.DiscordTeam
+ Discord.Internal.Types.ApplicationInfo: instance GHC.Classes.Ord Discord.Internal.Types.ApplicationInfo.DiscordTeamMember
+ Discord.Internal.Types.ApplicationInfo: instance GHC.Classes.Ord Discord.Internal.Types.ApplicationInfo.DiscordTeamMemberState
+ Discord.Internal.Types.ApplicationInfo: instance GHC.Classes.Ord Discord.Internal.Types.ApplicationInfo.FullApplication
+ Discord.Internal.Types.ApplicationInfo: instance GHC.Read.Read Discord.Internal.Types.ApplicationInfo.DiscordInstallParams
+ Discord.Internal.Types.ApplicationInfo: instance GHC.Read.Read Discord.Internal.Types.ApplicationInfo.DiscordTeam
+ Discord.Internal.Types.ApplicationInfo: instance GHC.Read.Read Discord.Internal.Types.ApplicationInfo.DiscordTeamMember
+ Discord.Internal.Types.ApplicationInfo: instance GHC.Read.Read Discord.Internal.Types.ApplicationInfo.DiscordTeamMemberState
+ Discord.Internal.Types.ApplicationInfo: instance GHC.Show.Show Discord.Internal.Types.ApplicationInfo.DiscordInstallParams
+ Discord.Internal.Types.ApplicationInfo: instance GHC.Show.Show Discord.Internal.Types.ApplicationInfo.DiscordTeam
+ Discord.Internal.Types.ApplicationInfo: instance GHC.Show.Show Discord.Internal.Types.ApplicationInfo.DiscordTeamMember
+ Discord.Internal.Types.ApplicationInfo: instance GHC.Show.Show Discord.Internal.Types.ApplicationInfo.DiscordTeamMemberState
+ Discord.Internal.Types.AuditLog: AfterLogEntry :: AuditLogEntryId -> AuditLogTiming
+ Discord.Internal.Types.AuditLog: AuditLog :: [AuditLogEntry] -> [User] -> [Integration] -> [Webhook] -> [ScheduledEvent] -> [Channel] -> [ApplicationCommand] -> [AutoModerationRule] -> AuditLog
+ Discord.Internal.Types.AuditLog: AuditLogChange :: String -> Maybe Value -> Maybe Value -> AuditLogChange
+ Discord.Internal.Types.AuditLog: AuditLogEntry :: AuditLogEntryId -> AuditLogEvent -> Maybe UserId -> Maybe Snowflake -> Maybe [AuditLogChange] -> Maybe AuditLogEntryOptions -> Maybe String -> AuditLogEntry
+ Discord.Internal.Types.AuditLog: BeforeLogEntry :: AuditLogEntryId -> AuditLogTiming
+ Discord.Internal.Types.AuditLog: GetAuditLogOpts :: Maybe UserId -> Maybe AuditLogEvent -> Maybe AuditLogTiming -> Maybe Int -> GetAuditLogOpts
+ Discord.Internal.Types.AuditLog: LatestLogEntries :: AuditLogTiming
+ Discord.Internal.Types.AuditLog: MkAuditLogEvent :: Int -> AuditLogEvent
+ Discord.Internal.Types.AuditLog: [auditLogApplicationCommands] :: AuditLog -> [ApplicationCommand]
+ Discord.Internal.Types.AuditLog: [auditLogAutoModerationRules] :: AuditLog -> [AutoModerationRule]
+ Discord.Internal.Types.AuditLog: [auditLogChangeKey] :: AuditLogChange -> String
+ Discord.Internal.Types.AuditLog: [auditLogChangeNewValue] :: AuditLogChange -> Maybe Value
+ Discord.Internal.Types.AuditLog: [auditLogChangeOldValue] :: AuditLogChange -> Maybe Value
+ Discord.Internal.Types.AuditLog: [auditLogEntries] :: AuditLog -> [AuditLogEntry]
+ Discord.Internal.Types.AuditLog: [auditLogEntryActionType] :: AuditLogEntry -> AuditLogEvent
+ Discord.Internal.Types.AuditLog: [auditLogEntryChanges] :: AuditLogEntry -> Maybe [AuditLogChange]
+ Discord.Internal.Types.AuditLog: [auditLogEntryId] :: AuditLogEntry -> AuditLogEntryId
+ Discord.Internal.Types.AuditLog: [auditLogEntryOptions] :: AuditLogEntry -> Maybe AuditLogEntryOptions
+ Discord.Internal.Types.AuditLog: [auditLogEntryReasons] :: AuditLogEntry -> Maybe String
+ Discord.Internal.Types.AuditLog: [auditLogEntryTargetId] :: AuditLogEntry -> Maybe Snowflake
+ Discord.Internal.Types.AuditLog: [auditLogEntryUserId] :: AuditLogEntry -> Maybe UserId
+ Discord.Internal.Types.AuditLog: [auditLogIntegrations] :: AuditLog -> [Integration]
+ Discord.Internal.Types.AuditLog: [auditLogThreads] :: AuditLog -> [Channel]
+ Discord.Internal.Types.AuditLog: [auditLogUsers] :: AuditLog -> [User]
+ Discord.Internal.Types.AuditLog: [auditLogWebhooks] :: AuditLog -> [Webhook]
+ Discord.Internal.Types.AuditLog: [auditlogScheduledEvents] :: AuditLog -> [ScheduledEvent]
+ Discord.Internal.Types.AuditLog: [getAuditLogActionType] :: GetAuditLogOpts -> Maybe AuditLogEvent
+ Discord.Internal.Types.AuditLog: [getAuditLogLimit] :: GetAuditLogOpts -> Maybe Int
+ Discord.Internal.Types.AuditLog: [getAuditLogTiming] :: GetAuditLogOpts -> Maybe AuditLogTiming
+ Discord.Internal.Types.AuditLog: [getAuditLogUserId] :: GetAuditLogOpts -> Maybe UserId
+ Discord.Internal.Types.AuditLog: data AuditLog
+ Discord.Internal.Types.AuditLog: data AuditLogChange
+ Discord.Internal.Types.AuditLog: data AuditLogEntry
+ Discord.Internal.Types.AuditLog: data AuditLogEntryOptions
+ Discord.Internal.Types.AuditLog: data AuditLogTiming
+ Discord.Internal.Types.AuditLog: data GetAuditLogOpts
+ Discord.Internal.Types.AuditLog: instance Data.Aeson.Types.FromJSON.FromJSON Discord.Internal.Types.AuditLog.AuditLog
+ Discord.Internal.Types.AuditLog: instance Data.Aeson.Types.FromJSON.FromJSON Discord.Internal.Types.AuditLog.AuditLogChange
+ Discord.Internal.Types.AuditLog: instance Data.Aeson.Types.FromJSON.FromJSON Discord.Internal.Types.AuditLog.AuditLogEntry
+ Discord.Internal.Types.AuditLog: instance Data.Aeson.Types.FromJSON.FromJSON Discord.Internal.Types.AuditLog.AuditLogEntryOptions
+ Discord.Internal.Types.AuditLog: instance Data.Aeson.Types.FromJSON.FromJSON Discord.Internal.Types.AuditLog.AuditLogEvent
+ Discord.Internal.Types.AuditLog: instance Data.Default.Class.Default Discord.Internal.Types.AuditLog.GetAuditLogOpts
+ Discord.Internal.Types.AuditLog: instance GHC.Classes.Eq Discord.Internal.Types.AuditLog.AuditLog
+ Discord.Internal.Types.AuditLog: instance GHC.Classes.Eq Discord.Internal.Types.AuditLog.AuditLogChange
+ Discord.Internal.Types.AuditLog: instance GHC.Classes.Eq Discord.Internal.Types.AuditLog.AuditLogEntry
+ Discord.Internal.Types.AuditLog: instance GHC.Classes.Eq Discord.Internal.Types.AuditLog.AuditLogEntryOptions
+ Discord.Internal.Types.AuditLog: instance GHC.Classes.Eq Discord.Internal.Types.AuditLog.AuditLogEvent
+ Discord.Internal.Types.AuditLog: instance GHC.Classes.Eq Discord.Internal.Types.AuditLog.AuditLogTiming
+ Discord.Internal.Types.AuditLog: instance GHC.Classes.Eq Discord.Internal.Types.AuditLog.GetAuditLogOpts
+ Discord.Internal.Types.AuditLog: instance GHC.Classes.Ord Discord.Internal.Types.AuditLog.AuditLogTiming
+ Discord.Internal.Types.AuditLog: instance GHC.Read.Read Discord.Internal.Types.AuditLog.AuditLog
+ Discord.Internal.Types.AuditLog: instance GHC.Read.Read Discord.Internal.Types.AuditLog.AuditLogChange
+ Discord.Internal.Types.AuditLog: instance GHC.Read.Read Discord.Internal.Types.AuditLog.AuditLogEntry
+ Discord.Internal.Types.AuditLog: instance GHC.Read.Read Discord.Internal.Types.AuditLog.AuditLogEntryOptions
+ Discord.Internal.Types.AuditLog: instance GHC.Read.Read Discord.Internal.Types.AuditLog.AuditLogEvent
+ Discord.Internal.Types.AuditLog: instance GHC.Read.Read Discord.Internal.Types.AuditLog.AuditLogTiming
+ Discord.Internal.Types.AuditLog: instance GHC.Read.Read Discord.Internal.Types.AuditLog.GetAuditLogOpts
+ Discord.Internal.Types.AuditLog: instance GHC.Show.Show Discord.Internal.Types.AuditLog.AuditLog
+ Discord.Internal.Types.AuditLog: instance GHC.Show.Show Discord.Internal.Types.AuditLog.AuditLogChange
+ Discord.Internal.Types.AuditLog: instance GHC.Show.Show Discord.Internal.Types.AuditLog.AuditLogEntry
+ Discord.Internal.Types.AuditLog: instance GHC.Show.Show Discord.Internal.Types.AuditLog.AuditLogEntryOptions
+ Discord.Internal.Types.AuditLog: instance GHC.Show.Show Discord.Internal.Types.AuditLog.AuditLogEvent
+ Discord.Internal.Types.AuditLog: instance GHC.Show.Show Discord.Internal.Types.AuditLog.AuditLogTiming
+ Discord.Internal.Types.AuditLog: instance GHC.Show.Show Discord.Internal.Types.AuditLog.GetAuditLogOpts
+ Discord.Internal.Types.AuditLog: newtype AuditLogEvent
+ Discord.Internal.Types.AuditLog: toAuditLogEvent :: Int -> Maybe AuditLogEvent
+ Discord.Internal.Types.AutoModeration: AutoModerationRule :: AutoModerationRuleId -> GuildId -> String -> UserId -> AutoModerationRuleEventType -> AutoModerationRuleTriggerType -> AutoModerationRuleTriggerMetadata -> [AutoModerationRuleAction] -> Bool -> [RoleId] -> [ChannelId] -> AutoModerationRule
+ Discord.Internal.Types.AutoModeration: AutoModerationRuleAction :: AutoModerationRuleActionType -> Maybe AutoModerationRuleActionMetadata -> AutoModerationRuleAction
+ Discord.Internal.Types.AutoModeration: AutoModerationRuleActionMetadata :: Maybe ChannelId -> Maybe Integer -> Maybe String -> AutoModerationRuleActionMetadata
+ Discord.Internal.Types.AutoModeration: AutoModerationRuleTriggerMetadata :: [String] -> [String] -> Maybe [AutoModerationRuleTriggerMetadataPreset] -> [String] -> Maybe Int -> Maybe Bool -> AutoModerationRuleTriggerMetadata
+ Discord.Internal.Types.AutoModeration: BlockMessage :: AutoModerationRuleActionType
+ Discord.Internal.Types.AutoModeration: Keyword :: AutoModerationRuleTriggerType
+ Discord.Internal.Types.AutoModeration: KeywordPreset :: AutoModerationRuleTriggerType
+ Discord.Internal.Types.AutoModeration: MentionSpam :: AutoModerationRuleTriggerType
+ Discord.Internal.Types.AutoModeration: MessageSent :: AutoModerationRuleEventType
+ Discord.Internal.Types.AutoModeration: Profanity :: AutoModerationRuleTriggerMetadataPreset
+ Discord.Internal.Types.AutoModeration: SendAlertMessage :: AutoModerationRuleActionType
+ Discord.Internal.Types.AutoModeration: SexualContent :: AutoModerationRuleTriggerMetadataPreset
+ Discord.Internal.Types.AutoModeration: Slurs :: AutoModerationRuleTriggerMetadataPreset
+ Discord.Internal.Types.AutoModeration: Spam :: AutoModerationRuleTriggerType
+ Discord.Internal.Types.AutoModeration: Timeout :: AutoModerationRuleActionType
+ Discord.Internal.Types.AutoModeration: [autoModerationRuleActionMetadataChannelId] :: AutoModerationRuleActionMetadata -> Maybe ChannelId
+ Discord.Internal.Types.AutoModeration: [autoModerationRuleActionMetadataCustomMessage] :: AutoModerationRuleActionMetadata -> Maybe String
+ Discord.Internal.Types.AutoModeration: [autoModerationRuleActionMetadataTimeoutDuration] :: AutoModerationRuleActionMetadata -> Maybe Integer
+ Discord.Internal.Types.AutoModeration: [autoModerationRuleActionMetadata] :: AutoModerationRuleAction -> Maybe AutoModerationRuleActionMetadata
+ Discord.Internal.Types.AutoModeration: [autoModerationRuleActionType] :: AutoModerationRuleAction -> AutoModerationRuleActionType
+ Discord.Internal.Types.AutoModeration: [autoModerationRuleActions] :: AutoModerationRule -> [AutoModerationRuleAction]
+ Discord.Internal.Types.AutoModeration: [autoModerationRuleCreatorId] :: AutoModerationRule -> UserId
+ Discord.Internal.Types.AutoModeration: [autoModerationRuleEnabled] :: AutoModerationRule -> Bool
+ Discord.Internal.Types.AutoModeration: [autoModerationRuleEventType] :: AutoModerationRule -> AutoModerationRuleEventType
+ Discord.Internal.Types.AutoModeration: [autoModerationRuleExemptChannels] :: AutoModerationRule -> [ChannelId]
+ Discord.Internal.Types.AutoModeration: [autoModerationRuleExemptRoles] :: AutoModerationRule -> [RoleId]
+ Discord.Internal.Types.AutoModeration: [autoModerationRuleGuildId] :: AutoModerationRule -> GuildId
+ Discord.Internal.Types.AutoModeration: [autoModerationRuleId] :: AutoModerationRule -> AutoModerationRuleId
+ Discord.Internal.Types.AutoModeration: [autoModerationRuleName] :: AutoModerationRule -> String
+ Discord.Internal.Types.AutoModeration: [autoModerationRuleTriggerMetadataAllowList] :: AutoModerationRuleTriggerMetadata -> [String]
+ Discord.Internal.Types.AutoModeration: [autoModerationRuleTriggerMetadataKeywordFilter] :: AutoModerationRuleTriggerMetadata -> [String]
+ Discord.Internal.Types.AutoModeration: [autoModerationRuleTriggerMetadataMentionLimit] :: AutoModerationRuleTriggerMetadata -> Maybe Int
+ Discord.Internal.Types.AutoModeration: [autoModerationRuleTriggerMetadataPresets] :: AutoModerationRuleTriggerMetadata -> Maybe [AutoModerationRuleTriggerMetadataPreset]
+ Discord.Internal.Types.AutoModeration: [autoModerationRuleTriggerMetadataRaidProtection] :: AutoModerationRuleTriggerMetadata -> Maybe Bool
+ Discord.Internal.Types.AutoModeration: [autoModerationRuleTriggerMetadataRegexPatterns] :: AutoModerationRuleTriggerMetadata -> [String]
+ Discord.Internal.Types.AutoModeration: [autoModerationRuleTriggerMetadata] :: AutoModerationRule -> AutoModerationRuleTriggerMetadata
+ Discord.Internal.Types.AutoModeration: [autoModerationRuleTriggerType] :: AutoModerationRule -> AutoModerationRuleTriggerType
+ Discord.Internal.Types.AutoModeration: data AutoModerationRule
+ Discord.Internal.Types.AutoModeration: data AutoModerationRuleAction
+ Discord.Internal.Types.AutoModeration: data AutoModerationRuleActionMetadata
+ Discord.Internal.Types.AutoModeration: data AutoModerationRuleActionType
+ Discord.Internal.Types.AutoModeration: data AutoModerationRuleEventType
+ Discord.Internal.Types.AutoModeration: data AutoModerationRuleTriggerMetadata
+ Discord.Internal.Types.AutoModeration: data AutoModerationRuleTriggerMetadataPreset
+ Discord.Internal.Types.AutoModeration: data AutoModerationRuleTriggerType
+ Discord.Internal.Types.AutoModeration: instance Data.Aeson.Types.FromJSON.FromJSON Discord.Internal.Types.AutoModeration.AutoModerationRule
+ Discord.Internal.Types.AutoModeration: instance Data.Aeson.Types.FromJSON.FromJSON Discord.Internal.Types.AutoModeration.AutoModerationRuleAction
+ Discord.Internal.Types.AutoModeration: instance Data.Aeson.Types.FromJSON.FromJSON Discord.Internal.Types.AutoModeration.AutoModerationRuleActionMetadata
+ Discord.Internal.Types.AutoModeration: instance Data.Aeson.Types.FromJSON.FromJSON Discord.Internal.Types.AutoModeration.AutoModerationRuleActionType
+ Discord.Internal.Types.AutoModeration: instance Data.Aeson.Types.FromJSON.FromJSON Discord.Internal.Types.AutoModeration.AutoModerationRuleEventType
+ Discord.Internal.Types.AutoModeration: instance Data.Aeson.Types.FromJSON.FromJSON Discord.Internal.Types.AutoModeration.AutoModerationRuleTriggerMetadata
+ Discord.Internal.Types.AutoModeration: instance Data.Aeson.Types.FromJSON.FromJSON Discord.Internal.Types.AutoModeration.AutoModerationRuleTriggerMetadataPreset
+ Discord.Internal.Types.AutoModeration: instance Data.Aeson.Types.FromJSON.FromJSON Discord.Internal.Types.AutoModeration.AutoModerationRuleTriggerType
+ Discord.Internal.Types.AutoModeration: instance Data.Aeson.Types.ToJSON.ToJSON Discord.Internal.Types.AutoModeration.AutoModerationRule
+ Discord.Internal.Types.AutoModeration: instance Data.Aeson.Types.ToJSON.ToJSON Discord.Internal.Types.AutoModeration.AutoModerationRuleAction
+ Discord.Internal.Types.AutoModeration: instance Data.Aeson.Types.ToJSON.ToJSON Discord.Internal.Types.AutoModeration.AutoModerationRuleActionMetadata
+ Discord.Internal.Types.AutoModeration: instance Data.Aeson.Types.ToJSON.ToJSON Discord.Internal.Types.AutoModeration.AutoModerationRuleActionType
+ Discord.Internal.Types.AutoModeration: instance Data.Aeson.Types.ToJSON.ToJSON Discord.Internal.Types.AutoModeration.AutoModerationRuleEventType
+ Discord.Internal.Types.AutoModeration: instance Data.Aeson.Types.ToJSON.ToJSON Discord.Internal.Types.AutoModeration.AutoModerationRuleTriggerMetadata
+ Discord.Internal.Types.AutoModeration: instance Data.Aeson.Types.ToJSON.ToJSON Discord.Internal.Types.AutoModeration.AutoModerationRuleTriggerMetadataPreset
+ Discord.Internal.Types.AutoModeration: instance Data.Aeson.Types.ToJSON.ToJSON Discord.Internal.Types.AutoModeration.AutoModerationRuleTriggerType
+ Discord.Internal.Types.AutoModeration: instance GHC.Classes.Eq Discord.Internal.Types.AutoModeration.AutoModerationRule
+ Discord.Internal.Types.AutoModeration: instance GHC.Classes.Eq Discord.Internal.Types.AutoModeration.AutoModerationRuleAction
+ Discord.Internal.Types.AutoModeration: instance GHC.Classes.Eq Discord.Internal.Types.AutoModeration.AutoModerationRuleActionMetadata
+ Discord.Internal.Types.AutoModeration: instance GHC.Classes.Eq Discord.Internal.Types.AutoModeration.AutoModerationRuleActionType
+ Discord.Internal.Types.AutoModeration: instance GHC.Classes.Eq Discord.Internal.Types.AutoModeration.AutoModerationRuleEventType
+ Discord.Internal.Types.AutoModeration: instance GHC.Classes.Eq Discord.Internal.Types.AutoModeration.AutoModerationRuleTriggerMetadata
+ Discord.Internal.Types.AutoModeration: instance GHC.Classes.Eq Discord.Internal.Types.AutoModeration.AutoModerationRuleTriggerMetadataPreset
+ Discord.Internal.Types.AutoModeration: instance GHC.Classes.Eq Discord.Internal.Types.AutoModeration.AutoModerationRuleTriggerType
+ Discord.Internal.Types.AutoModeration: instance GHC.Read.Read Discord.Internal.Types.AutoModeration.AutoModerationRule
+ Discord.Internal.Types.AutoModeration: instance GHC.Read.Read Discord.Internal.Types.AutoModeration.AutoModerationRuleAction
+ Discord.Internal.Types.AutoModeration: instance GHC.Read.Read Discord.Internal.Types.AutoModeration.AutoModerationRuleActionMetadata
+ Discord.Internal.Types.AutoModeration: instance GHC.Read.Read Discord.Internal.Types.AutoModeration.AutoModerationRuleActionType
+ Discord.Internal.Types.AutoModeration: instance GHC.Read.Read Discord.Internal.Types.AutoModeration.AutoModerationRuleEventType
+ Discord.Internal.Types.AutoModeration: instance GHC.Read.Read Discord.Internal.Types.AutoModeration.AutoModerationRuleTriggerMetadata
+ Discord.Internal.Types.AutoModeration: instance GHC.Read.Read Discord.Internal.Types.AutoModeration.AutoModerationRuleTriggerMetadataPreset
+ Discord.Internal.Types.AutoModeration: instance GHC.Read.Read Discord.Internal.Types.AutoModeration.AutoModerationRuleTriggerType
+ Discord.Internal.Types.AutoModeration: instance GHC.Show.Show Discord.Internal.Types.AutoModeration.AutoModerationRule
+ Discord.Internal.Types.AutoModeration: instance GHC.Show.Show Discord.Internal.Types.AutoModeration.AutoModerationRuleAction
+ Discord.Internal.Types.AutoModeration: instance GHC.Show.Show Discord.Internal.Types.AutoModeration.AutoModerationRuleActionMetadata
+ Discord.Internal.Types.AutoModeration: instance GHC.Show.Show Discord.Internal.Types.AutoModeration.AutoModerationRuleActionType
+ Discord.Internal.Types.AutoModeration: instance GHC.Show.Show Discord.Internal.Types.AutoModeration.AutoModerationRuleEventType
+ Discord.Internal.Types.AutoModeration: instance GHC.Show.Show Discord.Internal.Types.AutoModeration.AutoModerationRuleTriggerMetadata
+ Discord.Internal.Types.AutoModeration: instance GHC.Show.Show Discord.Internal.Types.AutoModeration.AutoModerationRuleTriggerMetadataPreset
+ Discord.Internal.Types.AutoModeration: instance GHC.Show.Show Discord.Internal.Types.AutoModeration.AutoModerationRuleTriggerType
+ Discord.Internal.Types.Events: AutoModerationActionExecuteInfo :: GuildId -> AutoModerationRuleAction -> AutoModerationRuleId -> AutoModerationRuleTriggerType -> UserId -> Maybe ChannelId -> Maybe MessageId -> Maybe MessageId -> String -> Maybe String -> Maybe String -> AutoModerationActionExecuteInfo
+ Discord.Internal.Types.Events: AutoModerationActionExecution :: AutoModerationActionExecuteInfo -> Event
+ Discord.Internal.Types.Events: AutoModerationRuleCreate :: AutoModerationRule -> Event
+ Discord.Internal.Types.Events: AutoModerationRuleDelete :: AutoModerationRule -> Event
+ Discord.Internal.Types.Events: AutoModerationRuleUpdate :: AutoModerationRule -> Event
+ Discord.Internal.Types.Events: GuildAuditLogEntryCreate :: AuditLogEntry -> Event
+ Discord.Internal.Types.Events: InternalAutoModerationActionExecution :: AutoModerationActionExecuteInfo -> EventInternalParse
+ Discord.Internal.Types.Events: InternalAutoModerationRuleCreate :: AutoModerationRule -> EventInternalParse
+ Discord.Internal.Types.Events: InternalAutoModerationRuleDelete :: AutoModerationRule -> EventInternalParse
+ Discord.Internal.Types.Events: InternalAutoModerationRuleUpdate :: AutoModerationRule -> EventInternalParse
+ Discord.Internal.Types.Events: InternalGuildAuditLogEntryCreate :: AuditLogEntry -> EventInternalParse
+ Discord.Internal.Types.Events: [autoModerationActionExecuteInfoAction] :: AutoModerationActionExecuteInfo -> AutoModerationRuleAction
+ Discord.Internal.Types.Events: [autoModerationActionExecuteInfoAlertMessageId] :: AutoModerationActionExecuteInfo -> Maybe MessageId
+ Discord.Internal.Types.Events: [autoModerationActionExecuteInfoChannelId] :: AutoModerationActionExecuteInfo -> Maybe ChannelId
+ Discord.Internal.Types.Events: [autoModerationActionExecuteInfoContent] :: AutoModerationActionExecuteInfo -> String
+ Discord.Internal.Types.Events: [autoModerationActionExecuteInfoGuildId] :: AutoModerationActionExecuteInfo -> GuildId
+ Discord.Internal.Types.Events: [autoModerationActionExecuteInfoMatchedContent] :: AutoModerationActionExecuteInfo -> Maybe String
+ Discord.Internal.Types.Events: [autoModerationActionExecuteInfoMatchedKeyword] :: AutoModerationActionExecuteInfo -> Maybe String
+ Discord.Internal.Types.Events: [autoModerationActionExecuteInfoMessageId] :: AutoModerationActionExecuteInfo -> Maybe MessageId
+ Discord.Internal.Types.Events: [autoModerationActionExecuteInfoRuleId] :: AutoModerationActionExecuteInfo -> AutoModerationRuleId
+ Discord.Internal.Types.Events: [autoModerationActionExecuteInfoTriggerType] :: AutoModerationActionExecuteInfo -> AutoModerationRuleTriggerType
+ Discord.Internal.Types.Events: [autoModerationActionExecuteInfoUserId] :: AutoModerationActionExecuteInfo -> UserId
+ Discord.Internal.Types.Events: data AutoModerationActionExecuteInfo
+ Discord.Internal.Types.Events: instance Data.Aeson.Types.FromJSON.FromJSON Discord.Internal.Types.Events.AutoModerationActionExecuteInfo
+ Discord.Internal.Types.Events: instance Data.Aeson.Types.ToJSON.ToJSON Discord.Internal.Types.Events.AutoModerationActionExecuteInfo
+ Discord.Internal.Types.Events: instance GHC.Classes.Eq Discord.Internal.Types.Events.AutoModerationActionExecuteInfo
+ Discord.Internal.Types.Events: instance GHC.Read.Read Discord.Internal.Types.Events.AutoModerationActionExecuteInfo
+ Discord.Internal.Types.Events: instance GHC.Show.Show Discord.Internal.Types.Events.AutoModerationActionExecuteInfo
+ Discord.Internal.Types.Gateway: [gatewayIntentAutoModerationConfiguration] :: GatewayIntent -> Bool
+ Discord.Internal.Types.Gateway: [gatewayIntentAutoModerationExecution] :: GatewayIntent -> Bool
+ Discord.Internal.Types.Prelude: instance Data.Aeson.Types.FromJSON.FromJSONKey (Discord.Internal.Types.Prelude.DiscordId a)
+ Discord.Internal.Types.Prelude: instance Data.Aeson.Types.FromJSON.FromJSONKey Discord.Internal.Types.Prelude.Snowflake
+ Discord.Internal.Types.Prelude: instance Data.Aeson.Types.ToJSON.ToJSONKey (Discord.Internal.Types.Prelude.DiscordId a)
+ Discord.Internal.Types.Prelude: instance Data.Aeson.Types.ToJSON.ToJSONKey Discord.Internal.Types.Prelude.Snowflake
+ Discord.Internal.Types.Prelude: instance Data.Hashable.Class.Hashable (Discord.Internal.Types.Prelude.DiscordId a)
+ Discord.Internal.Types.Prelude: instance Data.Hashable.Class.Hashable Discord.Internal.Types.Prelude.Snowflake
+ Discord.Internal.Types.Prelude: type AuditLogEntryId = DiscordId AuditLogEntryIdType
+ Discord.Internal.Types.Prelude: type AutoModerationRuleId = DiscordId AutoModerationRuleIdType
+ Discord.Internal.Types.Prelude: type DiscordTeamId = DiscordId DiscordTeamIdType
+ Discord.Internal.Types.Prelude: type GameSKUId = DiscordId GameSKUIdType
+ Discord.Types: AfterLogEntry :: AuditLogEntryId -> AuditLogTiming
+ Discord.Types: AuditLog :: [AuditLogEntry] -> [User] -> [Integration] -> [Webhook] -> [ScheduledEvent] -> [Channel] -> [ApplicationCommand] -> [AutoModerationRule] -> AuditLog
+ Discord.Types: AuditLogChange :: String -> Maybe Value -> Maybe Value -> AuditLogChange
+ Discord.Types: AuditLogEntry :: AuditLogEntryId -> AuditLogEvent -> Maybe UserId -> Maybe Snowflake -> Maybe [AuditLogChange] -> Maybe AuditLogEntryOptions -> Maybe String -> AuditLogEntry
+ Discord.Types: AutoModerationActionExecuteInfo :: GuildId -> AutoModerationRuleAction -> AutoModerationRuleId -> AutoModerationRuleTriggerType -> UserId -> Maybe ChannelId -> Maybe MessageId -> Maybe MessageId -> String -> Maybe String -> Maybe String -> AutoModerationActionExecuteInfo
+ Discord.Types: AutoModerationActionExecution :: AutoModerationActionExecuteInfo -> Event
+ Discord.Types: AutoModerationRule :: AutoModerationRuleId -> GuildId -> String -> UserId -> AutoModerationRuleEventType -> AutoModerationRuleTriggerType -> AutoModerationRuleTriggerMetadata -> [AutoModerationRuleAction] -> Bool -> [RoleId] -> [ChannelId] -> AutoModerationRule
+ Discord.Types: AutoModerationRuleAction :: AutoModerationRuleActionType -> Maybe AutoModerationRuleActionMetadata -> AutoModerationRuleAction
+ Discord.Types: AutoModerationRuleActionMetadata :: Maybe ChannelId -> Maybe Integer -> Maybe String -> AutoModerationRuleActionMetadata
+ Discord.Types: AutoModerationRuleCreate :: AutoModerationRule -> Event
+ Discord.Types: AutoModerationRuleDelete :: AutoModerationRule -> Event
+ Discord.Types: AutoModerationRuleTriggerMetadata :: [String] -> [String] -> Maybe [AutoModerationRuleTriggerMetadataPreset] -> [String] -> Maybe Int -> Maybe Bool -> AutoModerationRuleTriggerMetadata
+ Discord.Types: AutoModerationRuleUpdate :: AutoModerationRule -> Event
+ Discord.Types: BeforeLogEntry :: AuditLogEntryId -> AuditLogTiming
+ Discord.Types: BlockMessage :: AutoModerationRuleActionType
+ Discord.Types: DiscordInstallParams :: [Text] -> Text -> DiscordInstallParams
+ Discord.Types: DiscordTeam :: Maybe Text -> DiscordTeamId -> [DiscordTeamMember] -> Text -> UserId -> DiscordTeam
+ Discord.Types: DiscordTeamMember :: DiscordTeamMemberState -> DiscordTeamId -> UserId -> Text -> DiscordTeamMember
+ Discord.Types: DiscordTeamMemberStateAccepted :: DiscordTeamMemberState
+ Discord.Types: DiscordTeamMemberStateInvited :: DiscordTeamMemberState
+ Discord.Types: DiscordTeamMemberStateUnknown :: DiscordTeamMemberState
+ Discord.Types: GetAuditLogOpts :: Maybe UserId -> Maybe AuditLogEvent -> Maybe AuditLogTiming -> Maybe Int -> GetAuditLogOpts
+ Discord.Types: GuildAuditLogEntryCreate :: AuditLogEntry -> Event
+ Discord.Types: Keyword :: AutoModerationRuleTriggerType
+ Discord.Types: KeywordPreset :: AutoModerationRuleTriggerType
+ Discord.Types: LatestLogEntries :: AuditLogTiming
+ Discord.Types: MentionSpam :: AutoModerationRuleTriggerType
+ Discord.Types: MessageSent :: AutoModerationRuleEventType
+ Discord.Types: Profanity :: AutoModerationRuleTriggerMetadataPreset
+ Discord.Types: SendAlertMessage :: AutoModerationRuleActionType
+ Discord.Types: SexualContent :: AutoModerationRuleTriggerMetadataPreset
+ Discord.Types: Slurs :: AutoModerationRuleTriggerMetadataPreset
+ Discord.Types: Spam :: AutoModerationRuleTriggerType
+ Discord.Types: Timeout :: AutoModerationRuleActionType
+ Discord.Types: [auditLogApplicationCommands] :: AuditLog -> [ApplicationCommand]
+ Discord.Types: [auditLogAutoModerationRules] :: AuditLog -> [AutoModerationRule]
+ Discord.Types: [auditLogChangeKey] :: AuditLogChange -> String
+ Discord.Types: [auditLogChangeNewValue] :: AuditLogChange -> Maybe Value
+ Discord.Types: [auditLogChangeOldValue] :: AuditLogChange -> Maybe Value
+ Discord.Types: [auditLogEntries] :: AuditLog -> [AuditLogEntry]
+ Discord.Types: [auditLogEntryActionType] :: AuditLogEntry -> AuditLogEvent
+ Discord.Types: [auditLogEntryChanges] :: AuditLogEntry -> Maybe [AuditLogChange]
+ Discord.Types: [auditLogEntryId] :: AuditLogEntry -> AuditLogEntryId
+ Discord.Types: [auditLogEntryOptions] :: AuditLogEntry -> Maybe AuditLogEntryOptions
+ Discord.Types: [auditLogEntryReasons] :: AuditLogEntry -> Maybe String
+ Discord.Types: [auditLogEntryTargetId] :: AuditLogEntry -> Maybe Snowflake
+ Discord.Types: [auditLogEntryUserId] :: AuditLogEntry -> Maybe UserId
+ Discord.Types: [auditLogIntegrations] :: AuditLog -> [Integration]
+ Discord.Types: [auditLogThreads] :: AuditLog -> [Channel]
+ Discord.Types: [auditLogUsers] :: AuditLog -> [User]
+ Discord.Types: [auditLogWebhooks] :: AuditLog -> [Webhook]
+ Discord.Types: [auditlogScheduledEvents] :: AuditLog -> [ScheduledEvent]
+ Discord.Types: [autoModerationActionExecuteInfoAction] :: AutoModerationActionExecuteInfo -> AutoModerationRuleAction
+ Discord.Types: [autoModerationActionExecuteInfoAlertMessageId] :: AutoModerationActionExecuteInfo -> Maybe MessageId
+ Discord.Types: [autoModerationActionExecuteInfoChannelId] :: AutoModerationActionExecuteInfo -> Maybe ChannelId
+ Discord.Types: [autoModerationActionExecuteInfoContent] :: AutoModerationActionExecuteInfo -> String
+ Discord.Types: [autoModerationActionExecuteInfoGuildId] :: AutoModerationActionExecuteInfo -> GuildId
+ Discord.Types: [autoModerationActionExecuteInfoMatchedContent] :: AutoModerationActionExecuteInfo -> Maybe String
+ Discord.Types: [autoModerationActionExecuteInfoMatchedKeyword] :: AutoModerationActionExecuteInfo -> Maybe String
+ Discord.Types: [autoModerationActionExecuteInfoMessageId] :: AutoModerationActionExecuteInfo -> Maybe MessageId
+ Discord.Types: [autoModerationActionExecuteInfoRuleId] :: AutoModerationActionExecuteInfo -> AutoModerationRuleId
+ Discord.Types: [autoModerationActionExecuteInfoTriggerType] :: AutoModerationActionExecuteInfo -> AutoModerationRuleTriggerType
+ Discord.Types: [autoModerationActionExecuteInfoUserId] :: AutoModerationActionExecuteInfo -> UserId
+ Discord.Types: [autoModerationRuleActionMetadataChannelId] :: AutoModerationRuleActionMetadata -> Maybe ChannelId
+ Discord.Types: [autoModerationRuleActionMetadataCustomMessage] :: AutoModerationRuleActionMetadata -> Maybe String
+ Discord.Types: [autoModerationRuleActionMetadataTimeoutDuration] :: AutoModerationRuleActionMetadata -> Maybe Integer
+ Discord.Types: [autoModerationRuleActionMetadata] :: AutoModerationRuleAction -> Maybe AutoModerationRuleActionMetadata
+ Discord.Types: [autoModerationRuleActionType] :: AutoModerationRuleAction -> AutoModerationRuleActionType
+ Discord.Types: [autoModerationRuleActions] :: AutoModerationRule -> [AutoModerationRuleAction]
+ Discord.Types: [autoModerationRuleCreatorId] :: AutoModerationRule -> UserId
+ Discord.Types: [autoModerationRuleEnabled] :: AutoModerationRule -> Bool
+ Discord.Types: [autoModerationRuleEventType] :: AutoModerationRule -> AutoModerationRuleEventType
+ Discord.Types: [autoModerationRuleExemptChannels] :: AutoModerationRule -> [ChannelId]
+ Discord.Types: [autoModerationRuleExemptRoles] :: AutoModerationRule -> [RoleId]
+ Discord.Types: [autoModerationRuleGuildId] :: AutoModerationRule -> GuildId
+ Discord.Types: [autoModerationRuleId] :: AutoModerationRule -> AutoModerationRuleId
+ Discord.Types: [autoModerationRuleName] :: AutoModerationRule -> String
+ Discord.Types: [autoModerationRuleTriggerMetadataAllowList] :: AutoModerationRuleTriggerMetadata -> [String]
+ Discord.Types: [autoModerationRuleTriggerMetadataKeywordFilter] :: AutoModerationRuleTriggerMetadata -> [String]
+ Discord.Types: [autoModerationRuleTriggerMetadataMentionLimit] :: AutoModerationRuleTriggerMetadata -> Maybe Int
+ Discord.Types: [autoModerationRuleTriggerMetadataPresets] :: AutoModerationRuleTriggerMetadata -> Maybe [AutoModerationRuleTriggerMetadataPreset]
+ Discord.Types: [autoModerationRuleTriggerMetadataRaidProtection] :: AutoModerationRuleTriggerMetadata -> Maybe Bool
+ Discord.Types: [autoModerationRuleTriggerMetadataRegexPatterns] :: AutoModerationRuleTriggerMetadata -> [String]
+ Discord.Types: [autoModerationRuleTriggerMetadata] :: AutoModerationRule -> AutoModerationRuleTriggerMetadata
+ Discord.Types: [autoModerationRuleTriggerType] :: AutoModerationRule -> AutoModerationRuleTriggerType
+ Discord.Types: [discordInstallParamsPermissions] :: DiscordInstallParams -> Text
+ Discord.Types: [discordInstallParamsScopes] :: DiscordInstallParams -> [Text]
+ Discord.Types: [discordTeamIcon] :: DiscordTeam -> Maybe Text
+ Discord.Types: [discordTeamId] :: DiscordTeam -> DiscordTeamId
+ Discord.Types: [discordTeamMemberOwnerRole] :: DiscordTeamMember -> Text
+ Discord.Types: [discordTeamMemberParentTeam] :: DiscordTeamMember -> DiscordTeamId
+ Discord.Types: [discordTeamMemberState] :: DiscordTeamMember -> DiscordTeamMemberState
+ Discord.Types: [discordTeamMemberUserId] :: DiscordTeamMember -> UserId
+ Discord.Types: [discordTeamMembers] :: DiscordTeam -> [DiscordTeamMember]
+ Discord.Types: [discordTeamName] :: DiscordTeam -> Text
+ Discord.Types: [discordTeamOwnerUserId] :: DiscordTeam -> UserId
+ Discord.Types: [fullApplicationApproximateGuildCount] :: FullApplication -> Maybe Integer
+ Discord.Types: [fullApplicationBotPublic] :: FullApplication -> Bool
+ Discord.Types: [fullApplicationBotUserId] :: FullApplication -> Maybe UserId
+ Discord.Types: [fullApplicationCoverImage] :: FullApplication -> Maybe Text
+ Discord.Types: [fullApplicationCustomInstallUrl] :: FullApplication -> Maybe Text
+ Discord.Types: [fullApplicationDescription] :: FullApplication -> Text
+ Discord.Types: [fullApplicationGameSKUId] :: FullApplication -> Maybe GameSKUId
+ Discord.Types: [fullApplicationGuildId] :: FullApplication -> Maybe GuildId
+ Discord.Types: [fullApplicationIcon] :: FullApplication -> Maybe Text
+ Discord.Types: [fullApplicationInstallParams] :: FullApplication -> Maybe DiscordInstallParams
+ Discord.Types: [fullApplicationInteractionEndpointURL] :: FullApplication -> Maybe Text
+ Discord.Types: [fullApplicationOwnerId] :: FullApplication -> Maybe UserId
+ Discord.Types: [fullApplicationPrivacyPolicyUrl] :: FullApplication -> Maybe Text
+ Discord.Types: [fullApplicationRPCOrigins] :: FullApplication -> Maybe [Text]
+ Discord.Types: [fullApplicationRedirectURIs] :: FullApplication -> Maybe [Text]
+ Discord.Types: [fullApplicationRequiresCodeGrant] :: FullApplication -> Bool
+ Discord.Types: [fullApplicationRoleConnectionVerificationURL] :: FullApplication -> Maybe Text
+ Discord.Types: [fullApplicationTags] :: FullApplication -> Maybe [Text]
+ Discord.Types: [fullApplicationTeam] :: FullApplication -> Maybe DiscordTeam
+ Discord.Types: [fullApplicationTermsOfServiceUrl] :: FullApplication -> Maybe Text
+ Discord.Types: [fullApplicationVerifyKey] :: FullApplication -> Text
+ Discord.Types: [fullapplicationSlug] :: FullApplication -> Maybe Text
+ Discord.Types: [gatewayIntentAutoModerationConfiguration] :: GatewayIntent -> Bool
+ Discord.Types: [gatewayIntentAutoModerationExecution] :: GatewayIntent -> Bool
+ Discord.Types: [getAuditLogActionType] :: GetAuditLogOpts -> Maybe AuditLogEvent
+ Discord.Types: [getAuditLogLimit] :: GetAuditLogOpts -> Maybe Int
+ Discord.Types: [getAuditLogTiming] :: GetAuditLogOpts -> Maybe AuditLogTiming
+ Discord.Types: [getAuditLogUserId] :: GetAuditLogOpts -> Maybe UserId
+ Discord.Types: data AuditLog
+ Discord.Types: data AuditLogChange
+ Discord.Types: data AuditLogEntry
+ Discord.Types: data AuditLogEntryOptions
+ Discord.Types: data AuditLogEvent
+ Discord.Types: data AuditLogTiming
+ Discord.Types: data AutoModerationActionExecuteInfo
+ Discord.Types: data AutoModerationRule
+ Discord.Types: data AutoModerationRuleAction
+ Discord.Types: data AutoModerationRuleActionMetadata
+ Discord.Types: data AutoModerationRuleActionType
+ Discord.Types: data AutoModerationRuleEventType
+ Discord.Types: data AutoModerationRuleTriggerMetadata
+ Discord.Types: data AutoModerationRuleTriggerMetadataPreset
+ Discord.Types: data AutoModerationRuleTriggerType
+ Discord.Types: data DiscordInstallParams
+ Discord.Types: data DiscordTeam
+ Discord.Types: data DiscordTeamMember
+ Discord.Types: data DiscordTeamMemberState
+ Discord.Types: data GetAuditLogOpts
+ Discord.Types: toAuditLogEvent :: Int -> Maybe AuditLogEvent
+ Discord.Types: type AuditLogEntryId = DiscordId AuditLogEntryIdType
+ Discord.Types: type AutoModerationRuleId = DiscordId AutoModerationRuleIdType
+ Discord.Types: type DiscordTeamId = DiscordId DiscordTeamIdType
+ Discord.Types: type GameSKUId = DiscordId GameSKUIdType
- Discord.Internal.Types.ApplicationInfo: FullApplication :: ApplicationId -> Text -> Int -> FullApplication
+ Discord.Internal.Types.ApplicationInfo: FullApplication :: ApplicationId -> Text -> Maybe Text -> Text -> Maybe [Text] -> Bool -> Bool -> Maybe UserId -> Maybe Text -> Maybe Text -> Maybe UserId -> Text -> Maybe DiscordTeam -> Maybe GuildId -> Maybe GameSKUId -> Maybe Text -> Maybe Text -> Maybe Integer -> Maybe Integer -> Maybe [Text] -> Maybe Text -> Maybe Text -> Maybe [Text] -> Maybe DiscordInstallParams -> Maybe Text -> FullApplication
- Discord.Internal.Types.ApplicationInfo: [fullApplicationFlags] :: FullApplication -> Int
+ Discord.Internal.Types.ApplicationInfo: [fullApplicationFlags] :: FullApplication -> Maybe Integer
- Discord.Internal.Types.Gateway: GatewayIntent :: Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> GatewayIntent
+ Discord.Internal.Types.Gateway: GatewayIntent :: Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> GatewayIntent
- Discord.Types: FullApplication :: ApplicationId -> Text -> Int -> FullApplication
+ Discord.Types: FullApplication :: ApplicationId -> Text -> Maybe Text -> Text -> Maybe [Text] -> Bool -> Bool -> Maybe UserId -> Maybe Text -> Maybe Text -> Maybe UserId -> Text -> Maybe DiscordTeam -> Maybe GuildId -> Maybe GameSKUId -> Maybe Text -> Maybe Text -> Maybe Integer -> Maybe Integer -> Maybe [Text] -> Maybe Text -> Maybe Text -> Maybe [Text] -> Maybe DiscordInstallParams -> Maybe Text -> FullApplication
- Discord.Types: GatewayIntent :: Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> GatewayIntent
+ Discord.Types: GatewayIntent :: Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> GatewayIntent
- Discord.Types: [fullApplicationFlags] :: FullApplication -> Int
+ Discord.Types: [fullApplicationFlags] :: FullApplication -> Maybe Integer

Files

changelog.md view
@@ -8,6 +8,18 @@  - +## 1.17.0++- [S3NP41-v](https://github.com/discord-haskell/discord-haskell/pull/206) (and [2](https://github.com/discord-haskell/discord-haskell/pull/207)) Audit log and moderation types and gateway events as well as a new intent or two++- [L0neGamer](https://github.com/discord-haskell/discord-haskell/pull/205) Derive instances instead of defining them ourselves++- [julmb](https://github.com/discord-haskell/discord-haskell/pull/204) Add ToJSONKey and FromJSONKey instances to ID types++- [aquarial](https://github.com/discord-haskell/discord-haskell/pull/203) Add more fields to FullApplication++- [L0neGamer](https://github.com/discord-haskell/discord-haskell/pull/202) GHC 9.8 officially supported+ ## 1.16.1  - [julmb](https://github.com/discord-haskell/discord-haskell/pull/200) Default instance for InteractionResponseMessage
discord-haskell.cabal view
@@ -1,6 +1,6 @@ cabal-version:       2.0 name:                discord-haskell-version:             1.16.1+version:             1.17.0 description:         Functions and data types to write discord bots.                      Official discord docs <https://discord.com/developers/docs/reference>.                      .@@ -20,6 +20,7 @@                    , GHC == 9.2                    , GHC == 9.4                    , GHC == 9.6+                   , GHC == 9.8 extra-doc-files:     README.md                    , changelog.md @@ -143,6 +144,7 @@     , Discord.Internal.Rest.ApplicationInfo     , Discord.Internal.Rest.Interactions     , Discord.Internal.Rest.ScheduledEvents+    , Discord.Internal.Rest.AutoModeration     , Discord.Internal.Types     , Discord.Internal.Types.Prelude     , Discord.Internal.Types.Channel@@ -159,10 +161,12 @@     , Discord.Internal.Types.Emoji     , Discord.Internal.Types.RolePermissions     , Discord.Internal.Types.ScheduledEvents+    , Discord.Internal.Types.AutoModeration+    , Discord.Internal.Types.AuditLog   build-depends:   -- https://gitlab.haskell.org/ghc/ghc/-/wikis/commentary/libraries/version-history-  -- below also sets the GHC version effectively. set to == 8.10.*, == 9.0.*., == 9.2.*, == 9.4.*, == 9.6.*-    base == 4.14.* || == 4.15.* || == 4.16.* || == 4.17.* || == 4.18.*,+  -- below also sets the GHC version effectively. set to == 8.10.*, == 9.0.*., == 9.2.*, == 9.4.*, == 9.6.*, == 9.8.*+    base == 4.14.* || == 4.15.* || == 4.16.* || == 4.17.* || == 4.18.* || == 4.19.*,     aeson >= 2.0 && < 2.3,     async >=2.2 && <2.3,     bytestring >=0.10 && <0.13,@@ -170,6 +174,7 @@     containers >=0.6 && <0.7,     data-default >=0.7 && <0.8,     emojis >=0.1.3 && <0.2,+    hashable >= 1.4.0.0 && <1.5,     http-client >=0.6 && <0.8,     iso8601-time >=0.1 && <0.2,     MonadRandom >=0.5 && <0.7,@@ -177,7 +182,7 @@     safe-exceptions >=0.1 && <0.2,     text >=1.2 && <3,     time >=1.9 && <1.13,-    websockets >=0.12 && <0.13,+    websockets >=0.12 && <0.14,     network >=3.0.0.0 && <3.2.0.0,     wuss >=1.1 && <3,     mtl >=2.2 && <2.4,
+ src/Discord/Internal/Rest/AutoModeration.hs view
@@ -0,0 +1,97 @@+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Discord.Internal.Rest.AutoModeration 
+  ( AutoModerationRequest(..)
+  , MakeAutoModerationRule(..)
+  ) where
+
+import Data.Aeson
+import Discord.Internal.Types
+import Discord.Internal.Rest.Prelude
+import           Network.HTTP.Req ((/:), (/~))
+import qualified Network.HTTP.Req as R
+
+instance Request (AutoModerationRequest a) where
+  majorRoute  = autoModerationMajorRoute
+  jsonRequest = autoModerationJsonRequest
+
+data AutoModerationRequest a where
+  -- | Returns all audo moderation rules in a guild
+  ListAutoModerationRules  :: GuildId -> AutoModerationRequest [AutoModerationRule]
+  -- | Returns an auto moderation rule from its id
+  GetAutoModerationRule    :: GuildId -> AutoModerationRuleId -> AutoModerationRequest AutoModerationRule
+  -- | Creates an auto moderation rule in a guild
+  CreateAutoModerationRule :: GuildId -> MakeAutoModerationRule -> AutoModerationRequest ()
+  -- | Modifies (Replaces) an auto moderation rule in a guild
+  ModifyAutoModerationRule :: GuildId -> AutoModerationRuleId -> MakeAutoModerationRule -> AutoModerationRequest AutoModerationRule
+  -- | Deletes an auto moderation rule from its id
+  DeleteAutoModerationRule :: GuildId -> AutoModerationRuleId -> AutoModerationRequest ()
+
+
+data MakeAutoModerationRule = MakeAutoModerationRule
+  { makeAutoModerationRuleName            :: String
+  , makeAutoModerationRuleEventType       :: AutoModerationRuleEventType
+  , makeAutoModerationRuleTriggerType     :: AutoModerationRuleTriggerType
+  , makeAutoModerationRuleTriggerMetadata :: Maybe AutoModerationRuleTriggerMetadata
+  , makeAutoModerationRuleActions         :: [AutoModerationRuleAction]
+  , makeAutoModerationRuleEnabled         :: Bool
+  , makeAutoModerationRuleExemptRoles     :: [RoleId]
+  , makeAutoModerationRuleExemptChannels  :: [ChannelId]
+  } deriving ( Show, Read )
+
+instance FromJSON MakeAutoModerationRule where
+  parseJSON = withObject "MakeAutoModerationRule" $ \o ->
+    MakeAutoModerationRule <$> o .:  "name"
+                           <*> o .:  "event_type"
+                           <*> o .:  "trigger_type"
+                           <*> o .:? "trigger_metadata"
+                           <*> o .:  "actions"
+                           <*> o .:  "enabled"
+                           <*> o .:  "exempt_roles"
+                           <*> o .:  "exempt_channels"
+
+instance ToJSON MakeAutoModerationRule where
+  toJSON MakeAutoModerationRule{..} = objectFromMaybes
+    [ "name"              .== makeAutoModerationRuleName
+    , "event_type"        .== makeAutoModerationRuleEventType
+    , "trigger_type"      .== makeAutoModerationRuleTriggerType
+    , "trigger_metadata"  .=? makeAutoModerationRuleTriggerMetadata
+    , "actions"           .== makeAutoModerationRuleActions
+    , "enabled"           .== makeAutoModerationRuleEnabled
+    , "exempt_roles"      .== makeAutoModerationRuleExemptRoles
+    , "exempt_channels"   .== makeAutoModerationRuleExemptChannels
+    ]
+
+autoModerationMajorRoute :: AutoModerationRequest a -> String
+autoModerationMajorRoute c = case c of
+  (ListAutoModerationRules g) ->          "guild " <> show g
+  (GetAutoModerationRule g _) ->          "guild " <> show g
+  (CreateAutoModerationRule g _) ->       "guild " <> show g
+  (ModifyAutoModerationRule g _ _) ->     "guild " <> show g
+  (DeleteAutoModerationRule g _) ->       "guild " <> show g
+
+autoModerationJsonRequest :: AutoModerationRequest r -> JsonRequest
+autoModerationJsonRequest c = case c of
+  (ListAutoModerationRules guild) ->
+      Get (guilds /~ guild /: "auto-moderation" /: "rules") mempty
+  
+  (GetAutoModerationRule guild amid) ->
+      Get (guilds /~ guild /: "auto-moderation" /: "rules" /~ amid) mempty
+
+  (CreateAutoModerationRule guild autoModRule) ->
+      let body = pure (R.ReqBodyJson autoModRule)
+      in Post (guilds /~ guild /: "auto-moderation" /: "rules") body mempty
+
+  (ModifyAutoModerationRule guild amid patch) ->
+      let body = pure (R.ReqBodyJson patch)
+      in Patch (guilds /~ guild /: "auto-moderation" /: "rules" /~ amid) body mempty
+
+  (DeleteAutoModerationRule guild amid) ->
+      Delete (guilds /~ guild /: "auto-moderation" /: "rules" /~ amid) mempty
+  
+  where
+    guilds :: R.Url 'R.Https
+    guilds = baseUrl /: "guilds"
src/Discord/Internal/Rest/Guild.hs view
@@ -28,6 +28,8 @@ import Discord.Internal.Types import Data.Default (Default(..)) +import Discord.Internal.Types.AuditLog ( AuditLogEvent(MkAuditLogEvent) )+ instance Request (GuildRequest a) where   majorRoute = guildMajorRoute   jsonRequest = guildJsonRequest@@ -108,6 +110,10 @@   --   that would be removed in a prune operation. Requires the 'KICK_MEMBERS'   --   permission.   GetGuildPruneCount       :: GuildId -> Integer -> GuildRequest Object+  -- | Returns an AuditLog object, includes options about time, action type,+  --   user that took the action and amount of entries to fetch.+  --   Requires 'VIEW_AUDIT_LOG' permission+  GetGuildAuditLog         :: GuildId -> GetAuditLogOpts -> GuildRequest AuditLog   -- | Begin a prune operation. Requires the 'KICK_MEMBERS' permission. Returns an   --   object with one 'pruned' key indicating the number of members that were removed   --   in the prune operation. Fires multiple Guild Member Remove 'Events'.@@ -320,6 +326,7 @@     ListActiveThreads <$> o .: "threads"                       <*> o .: "members" + guildMembersTimingToQuery :: GuildMembersTiming -> R.Option 'R.Https guildMembersTimingToQuery (GuildMembersTiming mLimit mAfter) =   let limit = case mLimit of@@ -357,6 +364,7 @@   (ModifyGuildRole g _ _) ->         "guild_role " <> show g   (DeleteGuildRole g _) ->           "guild_role " <> show g   (GetGuildPruneCount g _) ->       "guild_prune " <> show g+  (GetGuildAuditLog g _) ->               "guild " <> show g   (BeginGuildPrune g _) ->          "guild_prune " <> show g   (GetGuildVoiceRegions g) ->       "guild_voice " <> show g   (GetGuildInvites g) ->            "guild_invit " <> show g@@ -453,6 +461,27 @@    (GetGuildPruneCount guild days) ->       Get (guilds /~ guild /: "prune") ("days" R.=: days)++  (GetGuildAuditLog guild auditOpts) ->+      let user_id = case getAuditLogUserId auditOpts of+            Nothing  -> mempty+            Just uid -> "user_id" R.=: uid+          action_type = case getAuditLogActionType auditOpts of+            Nothing                  -> mempty+            Just (MkAuditLogEvent n) -> "action_type" R.=: n++          timing = case getAuditLogTiming auditOpts of+            Nothing                    -> mempty+            Just LatestLogEntries      -> mempty+            Just (BeforeLogEntry snow) -> "before" R.=: snow+            Just (AfterLogEntry snow)  -> "after"  R.=: snow++          limit = case getAuditLogLimit auditOpts of+            Nothing -> mempty+            Just n  -> "limit" R.=: max 1 (min 100 n)+      +          body = user_id <> action_type <> timing <> limit+      in Get (guilds /~ guild /: "audit-logs") body    (BeginGuildPrune guild days) ->       Post (guilds /~ guild /: "prune") (pure R.NoReqBody) ("days" R.=: days)
src/Discord/Internal/Types.hs view
@@ -12,6 +12,8 @@     module Discord.Internal.Types.Components,     module Discord.Internal.Types.Emoji,     module Discord.Internal.Types.RolePermissions,+    module Discord.Internal.Types.AutoModeration,+    module Discord.Internal.Types.AuditLog,     module Data.Aeson,     module Data.Time.Clock,     userFacingEvent,@@ -32,12 +34,18 @@ import Discord.Internal.Types.Prelude import Discord.Internal.Types.User import Discord.Internal.Types.RolePermissions+import Discord.Internal.Types.AutoModeration+import Discord.Internal.Types.AuditLog hiding ( MkAuditLogEvent )  -- | Converts an internal event to its user facing counterpart userFacingEvent :: EventInternalParse -> Event userFacingEvent event = case event of   InternalReady a b c d e f g -> Ready a b c d e f g   InternalResumed a -> Resumed a+  InternalAutoModerationRuleCreate a -> AutoModerationRuleCreate a+  InternalAutoModerationRuleUpdate a -> AutoModerationRuleUpdate a+  InternalAutoModerationRuleDelete a -> AutoModerationRuleDelete a+  InternalAutoModerationActionExecution a -> AutoModerationActionExecution a   InternalChannelCreate a -> ChannelCreate a   InternalChannelUpdate a -> ChannelUpdate a   InternalChannelDelete a -> ChannelDelete a@@ -65,6 +73,7 @@   InternalMessageCreate a -> MessageCreate a   InternalMessageUpdate a b -> MessageUpdate a b   InternalMessageDelete a b -> MessageDelete a b+  InternalGuildAuditLogEntryCreate a -> GuildAuditLogEntryCreate a   InternalMessageDeleteBulk a b -> MessageDeleteBulk a b   InternalMessageReactionAdd a -> MessageReactionAdd a   InternalMessageReactionRemove a -> MessageReactionRemove a
src/Discord/Internal/Types/ApplicationInfo.hs view
@@ -5,19 +5,130 @@ module Discord.Internal.Types.ApplicationInfo where  import Data.Aeson+import qualified Data.Aeson.Key as Key+import qualified Data.Aeson.KeyMap as KM import qualified Data.Text as T import Discord.Internal.Types.Prelude  -- | Structure containing partial information about an Application+--    <https://discord.com/developers/docs/resources/application#application-object> data FullApplication = FullApplication   { fullApplicationID :: ApplicationId   , fullApplicationName :: T.Text-  , fullApplicationFlags :: Int-  } deriving (Show, Eq, Read)+  , fullApplicationIcon :: Maybe T.Text -- ^ Icon hash+  , fullApplicationDescription :: T.Text+  , fullApplicationRPCOrigins :: Maybe [T.Text] -- ^ List of RPC origin URLs, if RPC is enabled+  , fullApplicationBotPublic :: Bool -- ^ When false, only the app owner can add the app to guilds+  , fullApplicationRequiresCodeGrant :: Bool -- ^ When true, the app's bot will only join upon completion of the full OAuth2 code grant flow+  , fullApplicationBotUserId :: Maybe UserId -- ^ UserId of the bot user associated with the app+  -- , fullApplicationBot :: User -- partial user, test what it has?+  , fullApplicationTermsOfServiceUrl :: Maybe T.Text+  , fullApplicationPrivacyPolicyUrl :: Maybe T.Text+  , fullApplicationOwnerId :: Maybe UserId -- ^ UserId for the bot user associated with the app+  -- , fullApplicationOwner :: User -- ^ partial user, test what it has?+  , fullApplicationVerifyKey :: T.Text -- ^ Hex encoded key for verification in interactions and the GameSDK's GetTicket+  , fullApplicationTeam :: Maybe DiscordTeam -- ^ Included if the app belongs to a team+  , fullApplicationGuildId :: Maybe GuildId -- ^ Guild ID associated with the App. +  -- fullapplicationGuild :: PartialGuild -- ^ Don't include this because it's partial+  , fullApplicationGameSKUId :: Maybe GameSKUId+  , fullapplicationSlug  :: Maybe T.Text -- ^ If this app is a game sold on Discord, this field will be the URL slug that links to the store page+  , fullApplicationCoverImage :: Maybe T.Text -- ^ App's default rich presence invite cover image hash+  , fullApplicationFlags :: Maybe Integer -- ^ App's public flags+  , fullApplicationApproximateGuildCount :: Maybe Integer -- ^ Approximate count of guilds the app has been added to+  , fullApplicationRedirectURIs :: Maybe [T.Text] -- ^ Array of redirect URIs for the app+  , fullApplicationInteractionEndpointURL :: Maybe T.Text -- ^ Interactions endpoint URL for the app+  , fullApplicationRoleConnectionVerificationURL :: Maybe T.Text -- ^ Role connection verification URL for the app+  , fullApplicationTags :: Maybe [T.Text] -- ^ List of tags describing the content and functionality of the app. Max of 5 tags.+  , fullApplicationInstallParams :: Maybe DiscordInstallParams+  , fullApplicationCustomInstallUrl :: Maybe T.Text -- ^ Default custom authorization URL for the app, if enabled+  } deriving (Show, Read, Eq, Ord) + instance FromJSON FullApplication where   parseJSON = withObject "FullApplication" $ \o ->     FullApplication <$> o .: "id"                     <*> o .: "name"-                    <*> o .: "flags"+                    <*> o .:? "icon"+                    <*> o .: "description"+                    <*> o .:? "rpc_origins"+                    <*> o .: "bot_public"+                    <*> o .: "bot_require_code_grant"+                    <*> (extractId <$> (o .:? "bot"))+                    <*> o .:? "terms_of_service_url"+                    <*> o .:? "privacy_policy_url"+                    <*> (extractId <$> (o .:? "owner"))+                    <*> o .: "verify_key"+                    <*> o .:? "team"+                    <*> o .:? "guild_id"+                    -- <*> o .:? "guild"+                    <*> o .:? "primary_sku_id"+                    <*> o .:? "slug"+                    <*> o .:? "cover_image"+                    <*> o .:? "flags"+                    <*> o .:? "approximate_guild_count"+                    <*> o .:? "redirect_uris"+                    <*> o .:? "interactions_endpoint_url"+                    <*> o .:? "role_connections_verification_url"+                    <*> o .:? "tags"+                    <*> o .:? "install_params"+                    <*> o .:? "custom_install_url"+    where+    extractId :: FromJSON a => Maybe Object -> Maybe a+    extractId maybeBot = do+      bot <- maybeBot+      v <- KM.lookup (Key.fromText "id") bot+      case fromJSON v of+          Success a -> Just a+          _         -> Nothing +data DiscordTeam = DiscordTeam+  { discordTeamIcon :: Maybe T.Text+  , discordTeamId :: DiscordTeamId+  , discordTeamMembers :: [DiscordTeamMember]+  , discordTeamName :: T.Text+  , discordTeamOwnerUserId :: UserId+  } deriving (Show, Read, Eq, Ord)++instance FromJSON DiscordTeam where+  parseJSON = withObject "DiscordTeam" $ \o ->+    DiscordTeam <$> o .:? "icon" -- ^ Hash of the image of the team's icon+                <*> o .:  "id"+                <*> o .:  "members"+                <*> o .:  "name"+                <*> o .:  "owner_user_id" -- ^ User ID of the current team owner++data DiscordTeamMember = DiscordTeamMember+  { discordTeamMemberState :: DiscordTeamMemberState+  , discordTeamMemberParentTeam :: DiscordTeamId+  , discordTeamMemberUserId :: UserId+  , discordTeamMemberOwnerRole :: T.Text+  } deriving (Show, Read, Eq, Ord)++instance FromJSON DiscordTeamMember where+  parseJSON = withObject "DiscordTeamMember" $ \o ->+    DiscordTeamMember <$> (parseState <$> (o .: "membership_state"))+                      <*> o .: "team_id"+                      <*> (o .: "user" >>= (.: "id"))+                      <*> o .: "role"+    where+      parseState :: Integer -> DiscordTeamMemberState+      parseState 1 = DiscordTeamMemberStateInvited+      parseState 2 = DiscordTeamMemberStateAccepted+      parseState _ = DiscordTeamMemberStateUnknown++data DiscordTeamMemberState = DiscordTeamMemberStateInvited+                            | DiscordTeamMemberStateAccepted+                            | DiscordTeamMemberStateUnknown+  deriving (Show, Read, Eq, Ord)++++data DiscordInstallParams = DiscordInstallParams+    { discordInstallParamsScopes :: [T.Text]+    , discordInstallParamsPermissions :: T.Text+    } deriving (Show, Read, Eq, Ord)++instance FromJSON DiscordInstallParams where+  parseJSON = withObject "DiscordInstallParams" $ \o ->+    DiscordInstallParams <$> o .: "scopes"+                         <*> o .: "permissions"
+ src/Discord/Internal/Types/AuditLog.hs view
@@ -0,0 +1,149 @@+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Discord.Internal.Types.AuditLog 
+  ( AuditLog (..)
+  , AuditLogEntry (..)
+  , AuditLogChange (..)
+  , AuditLogEntryOptions
+  , AuditLogTiming (..)
+  , GetAuditLogOpts (..)
+  , AuditLogEvent (..)
+  , toAuditLogEvent
+  ) where
+
+
+import Data.Aeson
+
+import Discord.Internal.Types.Guild (Integration)
+import Discord.Internal.Types.Prelude
+import Discord.Internal.Types.User
+import Discord.Internal.Types.ScheduledEvents
+import Discord.Internal.Types.Channel
+import Discord.Internal.Types.ApplicationCommands
+import Discord.Internal.Types.AutoModeration
+import Data.Default (Default(..))
+
+
+
+-- | Audit log object, along with the entries it also contains referenced users, integrations [...] and so on
+data AuditLog = AuditLog
+  { auditLogEntries             :: [AuditLogEntry]
+  , auditLogUsers               :: [User]
+  , auditLogIntegrations        :: [Integration]
+  , auditLogWebhooks            :: [Webhook]
+  , auditlogScheduledEvents     :: [ScheduledEvent]
+  , auditLogThreads             :: [Channel]
+  , auditLogApplicationCommands :: [ApplicationCommand]
+  , auditLogAutoModerationRules :: [AutoModerationRule]
+  } deriving ( Eq, Show, Read )
+
+
+instance FromJSON AuditLog where
+  parseJSON = withObject "AuditLog" $ \o ->
+    AuditLog <$> o .: "audit_log_entries"
+             <*> o .: "users"
+             <*> o .: "integrations"
+             <*> o .: "webhooks"
+             <*> o .: "guild_scheduled_events"
+             <*> o .: "threads"
+             <*> o .: "application_commands"
+             <*> o .: "auto_moderation_rules"
+
+-- | An audit log entry object, so to speak the actual event that took place
+data AuditLogEntry = AuditLogEntry
+  { auditLogEntryId         :: AuditLogEntryId
+  , auditLogEntryActionType :: AuditLogEvent
+  , auditLogEntryUserId     :: Maybe UserId
+  , auditLogEntryTargetId   :: Maybe Snowflake
+  , auditLogEntryChanges    :: Maybe [AuditLogChange]
+  , auditLogEntryOptions    :: Maybe AuditLogEntryOptions
+  , auditLogEntryReasons    :: Maybe String
+  } deriving ( Eq, Show, Read )
+
+instance FromJSON AuditLogEntry where
+  parseJSON = withObject "AuditLogEntry" $ \o ->
+    AuditLogEntry <$> o .:  "id"
+                  <*> o .:  "action_type"
+                  <*> o .:? "user_id"
+                  <*> o .:? "target_id"
+                  <*> o .:? "changes"
+                  <*> o .:? "options"
+                  <*> o .:? "reasons"
+
+newtype AuditLogEvent = MkAuditLogEvent Int
+  deriving ( Eq, Show, Read )
+
+instance FromJSON AuditLogEvent where
+  parseJSON = fmap MkAuditLogEvent . parseJSON
+
+-- | A change object, new value and old value fields are of Aesons `Value` type,
+--   because it can be pretty much any value from discord api
+data AuditLogChange = AuditLogChange
+  { auditLogChangeKey      :: String
+  , auditLogChangeNewValue :: Maybe Value
+  , auditLogChangeOldValue :: Maybe Value
+  } deriving ( Eq, Show, Read )
+
+instance FromJSON AuditLogChange where
+  parseJSON = withObject "AuditLogChange" $ \o ->
+    AuditLogChange <$> o .:  "key"
+                   <*> o .:? "new_value"
+                   <*> o .:? "old_value"
+
+-- | Optional data for the Audit Log Entry object
+data AuditLogEntryOptions = AuditLogEntryOptions
+  { auditLogEntryOptionApplicationId                  :: Maybe ApplicationId
+  , auditLogEntryOptionAutoModerationRuleName         :: Maybe String
+  , auditLogEntryOptionAutoModerationRuleTriggerType  :: Maybe String
+  , auditLogEntryOptionChannelId                      :: Maybe ChannelId
+  , auditLogEntryOptionCount                          :: Maybe String
+  , auditLogEntryOptionDeleteMemberDays               :: Maybe String
+  , auditLogEntryOptionId                             :: Maybe Snowflake
+  , auditLogEntryOptionMembersRemoved                 :: Maybe String
+  , auditLogEntryOptionMessageId                      :: Maybe MessageId
+  , auditLogEntryOptionRoleName                       :: Maybe String
+  , auditLogEntryOptionType                           :: Maybe String
+  , auditLogEntryOptionIntegrationType                :: Maybe String
+  } deriving ( Eq, Show, Read )
+
+instance FromJSON AuditLogEntryOptions where
+  parseJSON = withObject "AuditLogEntryOption" $ \o ->
+    AuditLogEntryOptions <$> o .:? "application_id"
+                         <*> o .:? "auto_moderation_rule_name"
+                         <*> o .:? "auto_moderation_rule_trigger_type"
+                         <*> o .:? "channel_id"
+                         <*> o .:? "count"
+                         <*> o .:? "delete_member_days"
+                         <*> o .:? "id"
+                         <*> o .:? "members_removed"
+                         <*> o .:? "message_id"
+                         <*> o .:? "role_name"
+                         <*> o .:? "type"
+                         <*> o .:? "integration_type"
+
+-- | Options for `GetAuditLog` request
+data GetAuditLogOpts = GetAuditLogOpts
+  { getAuditLogUserId     :: Maybe UserId
+  , getAuditLogActionType :: Maybe AuditLogEvent
+  , getAuditLogTiming     :: Maybe AuditLogTiming
+  , getAuditLogLimit      :: Maybe Int
+  } deriving ( Eq, Show, Read)
+
+instance Default GetAuditLogOpts where
+  def = GetAuditLogOpts { getAuditLogUserId     = Nothing
+                        , getAuditLogActionType = Nothing
+                        , getAuditLogTiming     = Nothing
+                        , getAuditLogLimit      = Nothing
+                        }
+
+data AuditLogTiming = BeforeLogEntry AuditLogEntryId
+                    | AfterLogEntry AuditLogEntryId
+                    | LatestLogEntries
+  deriving ( Show, Read, Eq, Ord)
+
+-- | See <https://discord.com/developers/docs/resources/audit-log#audit-log-entry-object-audit-log-events> for more information on Events
+toAuditLogEvent :: Int -> Maybe AuditLogEvent
+toAuditLogEvent i = if i `elem` (1 : 121 : [10..15] <> [20..42] <> [50..52] <> [60..62] <> [72..75] <> [80..85] <> [90..92] <> [100..102] <> [110..112] <> [140..145] <> [150, 151])
+  then Just (MkAuditLogEvent i) else Nothing
+ src/Discord/Internal/Types/AutoModeration.hs view
@@ -0,0 +1,192 @@+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Discord.Internal.Types.AutoModeration where
+
+import Data.Aeson
+import Discord.Internal.Types.Prelude
+import Data.Scientific ( toBoundedInteger )
+
+
+data AutoModerationRule = AutoModerationRule
+  { autoModerationRuleId              :: AutoModerationRuleId
+  , autoModerationRuleGuildId         :: GuildId
+  , autoModerationRuleName            :: String
+  , autoModerationRuleCreatorId       :: UserId
+  , autoModerationRuleEventType       :: AutoModerationRuleEventType
+  , autoModerationRuleTriggerType     :: AutoModerationRuleTriggerType
+  , autoModerationRuleTriggerMetadata :: AutoModerationRuleTriggerMetadata
+  , autoModerationRuleActions         :: [AutoModerationRuleAction]
+  , autoModerationRuleEnabled         :: Bool
+  , autoModerationRuleExemptRoles     :: [RoleId]
+  , autoModerationRuleExemptChannels  :: [ChannelId]
+  } deriving ( Eq, Show, Read )
+
+instance FromJSON AutoModerationRule where
+  parseJSON = withObject "AutoModerationRule" $ \o ->
+    AutoModerationRule <$> o .: "id"
+                       <*> o .: "guild_id"
+                       <*> o .: "name"
+                       <*> o .: "creator_id"
+                       <*> o .: "event_type"
+                       <*> o .: "trigger_type"
+                       <*> o .: "trigger_metadata"
+                       <*> o .: "actions"
+                       <*> o .: "enabled"
+                       <*> o .: "exempt_roles"
+                       <*> o .: "exempt_channels"
+
+instance ToJSON AutoModerationRule where
+  toJSON AutoModerationRule{..} = object
+    [ ("id", toJSON autoModerationRuleGuildId)
+    , ("guild_id", toJSON autoModerationRuleGuildId)
+    , ("name", toJSON autoModerationRuleName)
+    , ("creator_id", toJSON autoModerationRuleCreatorId)
+    , ("event_type", toJSON autoModerationRuleEventType)
+    , ("trigger_type", toJSON autoModerationRuleTriggerType)
+    , ("trigger_metadata", toJSON autoModerationRuleTriggerMetadata)
+    , ("actions", toJSON autoModerationRuleActions)
+    , ("enabled", toJSON autoModerationRuleEnabled)
+    , ("exempt_roles", toJSON autoModerationRuleExemptRoles)
+    , ("exempt_channels", toJSON autoModerationRuleExemptChannels)
+    ]
+
+-- Discord makes it pretty clear they left room for updates, so far this is the only event type
+-- See <https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-rule-object-event-types>
+data AutoModerationRuleEventType
+  = MessageSent
+  deriving ( Eq, Show, Read )
+
+instance FromJSON AutoModerationRuleEventType where
+  parseJSON = withScientific "AutoModerationRuleEventType" $ \v -> case toBoundedInteger v :: Maybe Int of
+    Just 1 -> return MessageSent
+    _      -> fail $ "Could not parse event type: " <> show v
+
+instance ToJSON AutoModerationRuleEventType where
+  toJSON MessageSent = Number 1
+
+
+data AutoModerationRuleTriggerType
+  = Keyword
+  | Spam
+  | KeywordPreset
+  | MentionSpam
+  deriving ( Eq, Show, Read )
+
+instance FromJSON AutoModerationRuleTriggerType where
+  parseJSON = withScientific "AutoModerationTriggerType" $ \v -> case toBoundedInteger v :: Maybe Int of
+    Just 1 -> return Keyword
+    Just 3 -> return Spam
+    Just 4 -> return KeywordPreset
+    Just 5 -> return MentionSpam
+    _      -> fail $ "Could not parse trigger type: " <> show v
+
+instance ToJSON AutoModerationRuleTriggerType where
+  toJSON Keyword        = Number 1
+  toJSON Spam           = Number 3
+  toJSON KeywordPreset  = Number 4
+  toJSON MentionSpam    = Number 5
+
+data AutoModerationRuleTriggerMetadata = AutoModerationRuleTriggerMetadata
+  { autoModerationRuleTriggerMetadataKeywordFilter  :: [String]
+  , autoModerationRuleTriggerMetadataRegexPatterns  :: [String]
+  , autoModerationRuleTriggerMetadataPresets        :: Maybe [AutoModerationRuleTriggerMetadataPreset]
+  , autoModerationRuleTriggerMetadataAllowList      :: [String]
+  , autoModerationRuleTriggerMetadataMentionLimit   :: Maybe Int
+  , autoModerationRuleTriggerMetadataRaidProtection :: Maybe Bool
+  } deriving ( Eq, Show, Read )
+
+instance FromJSON AutoModerationRuleTriggerMetadata where
+  parseJSON = withObject "AutoModerationRuleTriggerMetadata" $ \o ->
+    AutoModerationRuleTriggerMetadata
+      <$> o .:  "keyword_filter"
+      <*> o .:  "regex_patterns"
+      <*> o .:? "presets"
+      <*> o .:  "allow_list"
+      <*> o .:? "mention_total_limit"
+      <*> o .:? "mention_raid_protection_enabled"
+
+instance ToJSON AutoModerationRuleTriggerMetadata where
+  toJSON AutoModerationRuleTriggerMetadata {..} = objectFromMaybes
+    [ "keyword_filter"  .== autoModerationRuleTriggerMetadataKeywordFilter
+    , "regex_patterns"  .== autoModerationRuleTriggerMetadataRegexPatterns
+    , "presets"         .=? autoModerationRuleTriggerMetadataPresets
+    , "allow_list"      .== autoModerationRuleTriggerMetadataAllowList
+    , "mention_total_limit" .=? autoModerationRuleTriggerMetadataMentionLimit
+    , "mention_raid_protection_enabled" .=? autoModerationRuleTriggerMetadataRaidProtection
+    ]
+
+data AutoModerationRuleTriggerMetadataPreset 
+  = Profanity
+  | SexualContent
+  | Slurs
+  deriving ( Eq, Show, Read )
+
+instance FromJSON AutoModerationRuleTriggerMetadataPreset where
+  parseJSON = withScientific "AutoModerationRuleTriggerMetadataPreset" $ \v -> case toBoundedInteger v :: Maybe Int of
+    Just 1 -> return Profanity
+    Just 3 -> return SexualContent
+    Just 4 -> return Slurs
+    _      -> fail $ "Could not parse preset type: " <> show v
+
+instance ToJSON AutoModerationRuleTriggerMetadataPreset where
+  toJSON Profanity      = Number 1
+  toJSON SexualContent  = Number 2
+  toJSON Slurs          = Number 3
+
+data AutoModerationRuleAction = AutoModerationRuleAction
+  { autoModerationRuleActionType      :: AutoModerationRuleActionType
+  , autoModerationRuleActionMetadata  :: Maybe AutoModerationRuleActionMetadata
+  } deriving ( Eq, Show, Read )
+
+instance FromJSON AutoModerationRuleAction where
+  parseJSON = withObject "AutoModerationRuleAction" $ \o ->
+    AutoModerationRuleAction
+      <$> o .: "type"
+      <*> o .: "metadata"
+
+instance ToJSON AutoModerationRuleAction where
+  toJSON AutoModerationRuleAction{..} = object 
+    [ ("type", toJSON autoModerationRuleActionType)
+    , ("metadata", toJSON autoModerationRuleActionMetadata)
+    ]
+
+data AutoModerationRuleActionType
+  = BlockMessage
+  | SendAlertMessage
+  | Timeout
+  deriving ( Eq, Show, Read )
+
+instance FromJSON AutoModerationRuleActionType where
+  parseJSON = withScientific "AutoModerationRuleActionType" $ \v -> case toBoundedInteger v :: Maybe Int of
+    Just 1 -> return BlockMessage
+    Just 3 -> return SendAlertMessage
+    Just 4 -> return Timeout
+    _      -> fail $ "Could not parse action type: " <> show v
+
+instance ToJSON AutoModerationRuleActionType where
+  toJSON BlockMessage     = Number 1
+  toJSON SendAlertMessage = Number 2
+  toJSON Timeout          = Number 3
+
+data AutoModerationRuleActionMetadata = AutoModerationRuleActionMetadata
+  { autoModerationRuleActionMetadataChannelId       :: Maybe ChannelId
+  , autoModerationRuleActionMetadataTimeoutDuration :: Maybe Integer
+  , autoModerationRuleActionMetadataCustomMessage   :: Maybe String
+  } deriving ( Eq, Show, Read )
+
+instance FromJSON AutoModerationRuleActionMetadata where
+  parseJSON = withObject "AutoModerationRuleActionMetadata" $ \o ->
+    AutoModerationRuleActionMetadata
+      <$> o .:? "channel_id"
+      <*> o .:? "duration_seconds"
+      <*> o .:? "custom_message"
+
+instance ToJSON AutoModerationRuleActionMetadata where
+  toJSON AutoModerationRuleActionMetadata{..} = objectFromMaybes
+    [ "channel_id"        .=? autoModerationRuleActionMetadataChannelId
+    , "duration_seconds"  .=? autoModerationRuleActionMetadataTimeoutDuration
+    , "custom_message"    .=? autoModerationRuleActionMetadataCustomMessage
+    ]
src/Discord/Internal/Types/Events.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE RecordWildCards #-}  -- | Data structures pertaining to gateway dispatch 'Event's module Discord.Internal.Types.Events where@@ -19,6 +20,8 @@ import Discord.Internal.Types.Prelude import Discord.Internal.Types.Channel import Discord.Internal.Types.Guild+import Discord.Internal.Types.AuditLog (AuditLogEntry)+import Discord.Internal.Types.AutoModeration (AutoModerationRule, AutoModerationRuleAction, AutoModerationRuleTriggerType) import Discord.Internal.Types.User (User, GuildMember) import Discord.Internal.Types.Interactions (Interaction) import Discord.Internal.Types.Emoji (Emoji)@@ -31,6 +34,14 @@     Ready                      Int User [GuildUnavailable] T.Text HostName (Maybe Shard) PartialApplication   -- | Response to a @Resume@ gateway command   | Resumed                    [T.Text]+  -- | New auto moderation rule was created, requires the AutoModerationConfiguration intent+  | AutoModerationRuleCreate   AutoModerationRule+  -- | Auto moderation rule was changed, requires the AutoModerationConfiguration intent+  | AutoModerationRuleUpdate   AutoModerationRule+  -- | Auto moderation rule was deleted, requires the AutoModerationConfiguration intent+  | AutoModerationRuleDelete   AutoModerationRule+  -- | Action from an auto moderation rule was executed, requires the AutoModerationExecution intent+  | AutoModerationActionExecution  AutoModerationActionExecuteInfo   -- | new guild channel created   | ChannelCreate              Channel   -- | channel was updated@@ -57,6 +68,8 @@   | GuildUpdate                Guild   -- | guild became unavailable, or user left/was removed from a guild   | GuildDelete                GuildUnavailable+  -- | new entry to the audit log was added+  | GuildAuditLogEntryCreate   AuditLogEntry   -- | user was banned from a guild   | GuildBanAdd                GuildId User   -- | user was unbanned from a guild@@ -115,6 +128,10 @@ data EventInternalParse =     InternalReady                      Int User [GuildUnavailable] T.Text HostName (Maybe Shard) PartialApplication   | InternalResumed                    [T.Text]+  | InternalAutoModerationRuleCreate   AutoModerationRule+  | InternalAutoModerationRuleUpdate   AutoModerationRule+  | InternalAutoModerationRuleDelete   AutoModerationRule+  | InternalAutoModerationActionExecution AutoModerationActionExecuteInfo   | InternalChannelCreate              Channel   | InternalChannelUpdate              Channel   | InternalChannelDelete              Channel@@ -128,6 +145,7 @@   | InternalGuildCreate                Guild GuildCreateData   | InternalGuildUpdate                Guild   | InternalGuildDelete                GuildUnavailable+  | InternalGuildAuditLogEntryCreate   AuditLogEntry   | InternalGuildBanAdd                GuildId User   | InternalGuildBanRemove             GuildId User   | InternalGuildEmojiUpdate           GuildId [Emoji]@@ -246,8 +264,51 @@        let utc = posixSecondsToUTCTime posix        pure (TypingInfo uid cid utc) +-- | Structure containing auto moderation action execution information+data AutoModerationActionExecuteInfo = AutoModerationActionExecuteInfo+  { autoModerationActionExecuteInfoGuildId        :: GuildId+  , autoModerationActionExecuteInfoAction         :: AutoModerationRuleAction+  , autoModerationActionExecuteInfoRuleId         :: AutoModerationRuleId+  , autoModerationActionExecuteInfoTriggerType    :: AutoModerationRuleTriggerType+  , autoModerationActionExecuteInfoUserId         :: UserId+  , autoModerationActionExecuteInfoChannelId      :: Maybe ChannelId+  , autoModerationActionExecuteInfoMessageId      :: Maybe MessageId+  , autoModerationActionExecuteInfoAlertMessageId :: Maybe MessageId+  , autoModerationActionExecuteInfoContent        :: String+  , autoModerationActionExecuteInfoMatchedKeyword :: Maybe String+  , autoModerationActionExecuteInfoMatchedContent :: Maybe String+  } deriving ( Eq, Show, Read ) +instance FromJSON AutoModerationActionExecuteInfo where+  parseJSON = withObject "AutoModerationActionExecuteInfo" $ \o ->+    AutoModerationActionExecuteInfo+      <$> o .:  "guild_id"+      <*> o .:  "action"+      <*> o .:  "rule_id"+      <*> o .:  "rule_trigger_type"+      <*> o .:  "user_id"+      <*> o .:? "channel_id"+      <*> o .:? "message_id"+      <*> o .:? "alert_system_message_id"+      <*> o .:  "content"+      <*> o .:? "matched_keyword"+      <*> o .:? "matched_content" +instance ToJSON AutoModerationActionExecuteInfo where+  toJSON AutoModerationActionExecuteInfo{..} = objectFromMaybes+    [ "guild_id"                  .== autoModerationActionExecuteInfoGuildId+    , "action"                    .== autoModerationActionExecuteInfoAction+    , "rule_id"                   .== autoModerationActionExecuteInfoRuleId+    , "rule_trigger_type"         .== autoModerationActionExecuteInfoTriggerType+    , "user_id"                   .== autoModerationActionExecuteInfoUserId+    , "channel_id"                .=? autoModerationActionExecuteInfoChannelId+    , "message_id"                .=? autoModerationActionExecuteInfoMessageId+    , "alert_system_message_id"   .=? autoModerationActionExecuteInfoAlertMessageId+    , "content"                   .== autoModerationActionExecuteInfoContent+    , "matched_keyword"           .=? autoModerationActionExecuteInfoMatchedKeyword+    , "matched_content"           .=? autoModerationActionExecuteInfoMatchedContent+    ]+ -- | Convert ToJSON value to FromJSON value reparse :: (ToJSON a, FromJSON b) => a -> Parser b reparse val = case parseEither parseJSON $ toJSON val of@@ -276,6 +337,10 @@                                          <*> o .: "shard"                                          <*> o .: "application"     "RESUMED"                   -> InternalResumed <$> o .: "_trace"+    "AUTO_MODERATION_RULE_CREATE" -> InternalAutoModerationRuleCreate <$> reparse o+    "AUTO_MODERATION_RULE_UPDATE" -> InternalAutoModerationRuleUpdate <$> reparse o+    "AUTO_MODERATION_RULE_DELETE" -> InternalAutoModerationRuleDelete <$> reparse o+    "AUTO_MODERATION_ACTION_EXECUTION" -> InternalAutoModerationActionExecution <$> reparse o     "CHANNEL_CREATE"            -> InternalChannelCreate             <$> reparse o     "CHANNEL_UPDATE"            -> InternalChannelUpdate             <$> reparse o     "CHANNEL_DELETE"            -> InternalChannelDelete             <$> reparse o@@ -292,6 +357,7 @@     "GUILD_CREATE"              -> parseGuildCreate o     "GUILD_UPDATE"              -> InternalGuildUpdate               <$> reparse o     "GUILD_DELETE"              -> InternalGuildDelete               <$> reparse o+    "GUILD_AUDIT_LOG_ENTRY_CREATE" -> InternalGuildAuditLogEntryCreate <$> reparse o     "GUILD_BAN_ADD"             -> InternalGuildBanAdd    <$> o .: "guild_id" <*> o .: "user"     "GUILD_BAN_REMOVE"          -> InternalGuildBanRemove <$> o .: "guild_id" <*> o .: "user"     "GUILD_EMOJI_UPDATE"        -> InternalGuildEmojiUpdate <$> o .: "guild_id" <*> o .: "emojis"
src/Discord/Internal/Types/Gateway.hs view
@@ -62,25 +62,29 @@   , gatewayIntentDirectMessageReactions :: Bool   , gatewayIntentDirectMessageTyping :: Bool   , gatewayIntentMessageContent :: Bool+  , gatewayIntentAutoModerationConfiguration :: Bool+  , gatewayIntentAutoModerationExecution :: Bool   } deriving (Show, Read, Eq, Ord)  instance Default GatewayIntent where-  def = GatewayIntent { gatewayIntentGuilds                 = True-                      , gatewayIntentMembers                = False -- false-                      , gatewayIntentBans                   = True-                      , gatewayIntentEmojis                 = True-                      , gatewayIntentIntegrations           = True-                      , gatewayIntentWebhooks               = True-                      , gatewayIntentInvites                = True-                      , gatewayIntentVoiceStates            = True-                      , gatewayIntentPresences              = False  -- false-                      , gatewayIntentMessageChanges         = True-                      , gatewayIntentMessageReactions       = True-                      , gatewayIntentMessageTyping          = True-                      , gatewayIntentDirectMessageChanges   = True-                      , gatewayIntentDirectMessageReactions = True-                      , gatewayIntentDirectMessageTyping    = True-                      , gatewayIntentMessageContent         = True+  def = GatewayIntent { gatewayIntentGuilds                      = True+                      , gatewayIntentMembers                     = False -- false+                      , gatewayIntentBans                        = True+                      , gatewayIntentEmojis                      = True+                      , gatewayIntentIntegrations                = True+                      , gatewayIntentWebhooks                    = True+                      , gatewayIntentInvites                     = True+                      , gatewayIntentVoiceStates                 = True+                      , gatewayIntentPresences                   = False  -- false+                      , gatewayIntentMessageChanges              = True+                      , gatewayIntentMessageReactions            = True+                      , gatewayIntentMessageTyping               = True+                      , gatewayIntentDirectMessageChanges        = True+                      , gatewayIntentDirectMessageReactions      = True+                      , gatewayIntentDirectMessageTyping         = True+                      , gatewayIntentMessageContent              = True+                      , gatewayIntentAutoModerationConfiguration = True+                      , gatewayIntentAutoModerationExecution     = True                       }  compileGatewayIntent :: GatewayIntent -> Int@@ -102,6 +106,8 @@                        , (2 ^ 13, gatewayIntentDirectMessageReactions)                        , (2 ^ 14, gatewayIntentDirectMessageTyping)                        , (2 ^ 15, gatewayIntentMessageContent)+                       , (2 ^ 20, gatewayIntentAutoModerationConfiguration)+                       , (2 ^ 21, gatewayIntentAutoModerationExecution)                        ]        ] 
src/Discord/Internal/Types/Prelude.hs view
@@ -4,6 +4,7 @@ {-# LANGUAGE FlexibleInstances  #-} {-# LANGUAGE RankNTypes  #-} {-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DerivingStrategies #-}  -- | Provides base types and utility functions needed for modules in Discord.Internal.Types module Discord.Internal.Types.Prelude@@ -24,6 +25,8 @@   , EmojiId   , StickerId   , UserId+  , DiscordTeamId+  , GameSKUId   , RoleId   , IntegrationId   , WebhookId@@ -33,6 +36,8 @@   , InteractionId   , ScheduledEventId   , ScheduledEventEntityId+  , AuditLogEntryId+  , AutoModerationRuleId    , DiscordToken (..)   , InteractionToken@@ -55,17 +60,17 @@   where -import Data.Bifunctor (first) import Data.Bits (Bits(shiftR)) import Data.Data (Data (dataTypeOf), dataTypeConstrs, fromConstr) import Data.Word (Word64) import Data.Maybe (catMaybes) import Text.Read (readMaybe)+import Data.Hashable (Hashable)  import Data.Aeson.Types import Data.Time.Clock import Data.Time.Clock.POSIX-import Web.Internal.HttpApiData+import Web.HttpApiData  import qualified Data.ByteString as B import qualified Data.Text as T@@ -85,16 +90,10 @@  -- | A unique integer identifier. Can be used to calculate the creation date of an entity. newtype Snowflake = Snowflake { unSnowflake :: Word64 }-  deriving (Ord, Eq)--instance Show Snowflake where-  show (Snowflake a) = show a--instance Read Snowflake where-  readsPrec p = fmap (first Snowflake) . readsPrec p+  deriving newtype (Ord, Eq, Hashable, Show, Read, ToJSONKey, FromJSONKey, ToHttpApiData)  instance ToJSON Snowflake where-  toJSON (Snowflake snowflake) = String . T.pack $ show snowflake+  toJSON = String . T.pack . show  instance FromJSON Snowflake where   parseJSON =@@ -102,21 +101,12 @@       "Snowflake"       ( \snowflake ->           case readMaybe (T.unpack snowflake) of-            Nothing -> fail "null snowflake"+            Nothing -> fail $ "invalid snowflake: " <> show snowflake             (Just i) -> pure i       ) -instance ToHttpApiData Snowflake where-  toUrlPiece = T.pack . show- newtype RolePermissions = RolePermissions { getRolePermissions :: Integer } -  deriving (Eq, Ord, Bits)--instance Read RolePermissions where-  readsPrec p = fmap (first RolePermissions) . readsPrec p--instance ToJSON RolePermissions where-  toJSON = toJSON . getRolePermissions+  deriving newtype (Eq, Ord, Bits, Read, Show, ToJSON)  -- In v8 and above, all permissions are serialized as strings. -- See https://discord.com/developers/docs/topics/permissions#permissions.@@ -124,28 +114,10 @@   parseJSON = withText "RolePermissions" $       \text -> case readMaybe (T.unpack text) of               Just perms -> pure $ RolePermissions perms-              Nothing    -> fail "invalid role permissions integer string"--instance Show RolePermissions where-  show = show . getRolePermissions+              Nothing    -> fail $ "invalid role permissions: " <> show text  newtype DiscordId a = DiscordId { unId :: Snowflake }-  deriving (Ord, Eq)--instance Show (DiscordId a) where-  show = show . unId--instance Read (DiscordId a) where-  readsPrec p = fmap (first DiscordId) . readsPrec p--instance ToJSON (DiscordId a) where-  toJSON = toJSON . unId--instance FromJSON (DiscordId a) where-  parseJSON = fmap DiscordId . parseJSON--instance ToHttpApiData (DiscordId a) where-  toUrlPiece = T.pack . show+  deriving newtype (Ord, Eq, Hashable, Show, Read, ToJSON, ToJSONKey, FromJSON, FromJSONKey, ToHttpApiData)  data ChannelIdType type ChannelId = DiscordId ChannelIdType@@ -174,6 +146,12 @@ data RoleIdType type RoleId = DiscordId RoleIdType +data DiscordTeamIdType+type DiscordTeamId = DiscordId DiscordTeamIdType++data GameSKUIdType+type GameSKUId = DiscordId GameSKUIdType+ data IntegrationIdType type IntegrationId = DiscordId IntegrationIdType @@ -198,23 +176,14 @@ data ScheduledEventEntityIdType type ScheduledEventEntityId = DiscordId ScheduledEventEntityIdType -newtype DiscordToken a = DiscordToken { unToken :: T.Text }-  deriving (Ord, Eq)--instance Show (DiscordToken a) where-  show = show . unToken--instance Read (DiscordToken a) where-  readsPrec p = fmap (first DiscordToken) . readsPrec p--instance ToJSON (DiscordToken a) where-  toJSON = toJSON . unToken+data AuditLogEntryIdType+type AuditLogEntryId = DiscordId AuditLogEntryIdType -instance FromJSON (DiscordToken a) where-  parseJSON = fmap DiscordToken . parseJSON+data AutoModerationRuleIdType+type AutoModerationRuleId = DiscordId AutoModerationRuleIdType -instance ToHttpApiData (DiscordToken a) where-  toUrlPiece = unToken+newtype DiscordToken a = DiscordToken { unToken :: T.Text }+  deriving newtype (Ord, Eq, Show, Read, ToJSON, FromJSON, ToHttpApiData)  type InteractionToken = DiscordToken InteractionIdType 
src/Discord/Requests.hs view
@@ -10,6 +10,7 @@   , module Discord.Internal.Rest.ApplicationCommands   , module Discord.Internal.Rest.Interactions   , module Discord.Internal.Rest.ScheduledEvents+  , module Discord.Internal.Rest.AutoModeration   ) where  import Discord.Internal.Rest.ApplicationInfo@@ -23,3 +24,4 @@ import Discord.Internal.Rest.ApplicationCommands import Discord.Internal.Rest.Interactions import Discord.Internal.Rest.ScheduledEvents+import Discord.Internal.Rest.AutoModeration