From ce0af48f7ff1e57843967da4b1389cab5569e26a Mon Sep 17 00:00:00 2001 From: kozabrada123 <“kozabrada123@users.noreply.github.com”> Date: Sat, 27 May 2023 16:50:38 +0200 Subject: [PATCH] Add Auto Moderation types & events --- src/gateway.rs | 29 +++++- src/types/entities/auto_moderation.rs | 135 ++++++++++++++++++++++++++ src/types/entities/mod.rs | 4 +- src/types/events/auto_moderation.rs | 48 +++++++++ src/types/events/mod.rs | 2 + 5 files changed, 213 insertions(+), 5 deletions(-) create mode 100644 src/types/entities/auto_moderation.rs create mode 100644 src/types/events/auto_moderation.rs diff --git a/src/gateway.rs b/src/gateway.rs index 4105f92..87a9c32 100644 --- a/src/gateway.rs +++ b/src/gateway.rs @@ -233,10 +233,22 @@ impl Gateway { } "RESUMED" => {} "APPLICATION_COMMAND_PERMISSIONS_UPDATE" => {} - "AUTO_MODERATION_RULE_CREATE" => {} - "AUTO_MODERATION_RULE_UPDATE" => {} - "AUTO_MODERATION_RULE_DELETE" => {} - "AUTO_MODERATION_ACTION_EXECUTION" => {} + "AUTO_MODERATION_RULE_CREATE" => { + let new_data: types::AutoModerationRuleCreate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events.lock().await.auto_moderation.rule_create.update_data(new_data).await; + } + "AUTO_MODERATION_RULE_UPDATE" => { + let new_data: types::AutoModerationRuleUpdate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events.lock().await.auto_moderation.rule_update.update_data(new_data).await; + } + "AUTO_MODERATION_RULE_DELETE" => { + let new_data: types::AutoModerationRuleDelete = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events.lock().await.auto_moderation.rule_delete.update_data(new_data).await; + } + "AUTO_MODERATION_ACTION_EXECUTION" => { + let new_data: types::AutoModerationActionExecution = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); + self.events.lock().await.auto_moderation.action_execution.update_data(new_data).await; + } "CHANNEL_CREATE" => { let new_data: types::ChannelCreate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); self.events.lock().await.channel.create.update_data(new_data).await; @@ -692,6 +704,7 @@ mod events { use super::*; #[derive(Default, Debug)] pub struct Events { + pub auto_moderation: AutoModeration, pub session: Session, pub message: Message, pub user: User, @@ -708,6 +721,14 @@ mod events { pub gateway_resume: GatewayEvent, } + #[derive(Default, Debug)] + pub struct AutoModeration { + pub rule_create: GatewayEvent, + pub rule_update: GatewayEvent, + pub rule_delete: GatewayEvent, + pub action_execution: GatewayEvent, + } + #[derive(Default, Debug)] pub struct Session { pub ready: GatewayEvent, diff --git a/src/types/entities/auto_moderation.rs b/src/types/entities/auto_moderation.rs new file mode 100644 index 0000000..0b723c1 --- /dev/null +++ b/src/types/entities/auto_moderation.rs @@ -0,0 +1,135 @@ +use serde::{Deserialize, Serialize}; +use serde_repr::{Serialize_repr, Deserialize_repr}; + +use crate::types::utils::Snowflake; + +#[derive(Serialize, Deserialize, Debug, Default, Clone)] +/// See https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-rule-object +pub struct AutoModerationRule { + pub id: Snowflake, + pub guild_id: Snowflake, + pub name: String, + pub creator_id: Snowflake, + pub event_type: AutoModerationRuleEventType, + pub trigger_type: AutoModerationRuleTriggerType, + pub trigger_metadata: AutoModerationRuleTriggerMetadata, + pub actions: Vec, + pub enabled: bool, + pub exempt_roles: Vec, + pub exempt_channels: Vec, +} + +#[derive(Serialize_repr, Deserialize_repr, Debug, Clone, Default)] +#[repr(u8)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +/// See https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-rule-object-event-types +pub enum AutoModerationRuleEventType { + #[default] + MessageSend = 1 +} + +#[derive(Serialize_repr, Deserialize_repr, Debug, Clone, Default)] +#[repr(u8)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +/// See https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-rule-object-trigger-types +pub enum AutoModerationRuleTriggerType { + #[default] + Keyword = 1, + Spam = 3, + KeywordPreset = 4, + MentionSpam = 5 +} + +#[derive(Serialize, Deserialize, Debug, Clone, Default)] +#[serde(untagged)] +/// See https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-rule-object-trigger-metadata +pub enum AutoModerationRuleTriggerMetadata { + ForKeyword(AutoModerationRuleTriggerMetadataForKeyword), + ForKeywordPreset(AutoModerationRuleTriggerMetadataForKeywordPreset), + ForMentionSpam(AutoModerationRuleTriggerMetadataForMentionSpam), + #[default] + None +} + +#[derive(Serialize, Deserialize, Debug, Clone, Default)] +/// See https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-rule-object-trigger-metadata +pub struct AutoModerationRuleTriggerMetadataForKeyword { + pub keyword_filter: Vec, + pub regex_patterns: Vec, + pub allow_list: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone, Default)] +/// See https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-rule-object-trigger-metadata +pub struct AutoModerationRuleTriggerMetadataForKeywordPreset { + pub presets: Vec, + pub allow_list: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone, Default)] +/// See https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-rule-object-trigger-metadata +pub struct AutoModerationRuleTriggerMetadataForMentionSpam { + /// Max 50 + pub mention_total_limit: u8, + pub mention_raid_protection_enabled: bool +} + +#[derive(Serialize_repr, Deserialize_repr, Debug, Clone, Default)] +#[repr(u8)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +/// See https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-rule-object-keyword-preset-types +pub enum AutoModerationRuleKeywordPresetType { + #[default] + Profanity = 1, + SexualContent = 2, + Slurs = 3 +} + +#[derive(Serialize, Deserialize, Debug, Clone, Default)] +/// See https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-action-object +pub struct AutoModerationAction { + #[serde(rename = "type")] + pub action_type: AutoModerationActionType, + pub metadata: Option +} + +#[derive(Serialize_repr, Deserialize_repr, Debug, Clone, Default)] +#[repr(u8)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +/// See https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-action-object-action-types +pub enum AutoModerationActionType { + #[default] + BlockMessage = 1, + SendAlertMessage = 2, + Timeout = 3 +} + +#[derive(Serialize, Deserialize, Debug, Clone, Default)] +#[serde(untagged)] +/// See https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-action-object-action-metadata +pub enum AutoModerationActionMetadata { + ForBlockMessage(AutoModerationActionMetadataForBlockMessage), + ForSendAlertMessage(AutoModerationActionMetadataForSendAlertMessage), + ForTimeout(AutoModerationActionMetadataForTimeout), + #[default] + None +} + +#[derive(Serialize, Deserialize, Debug, Clone, Default)] +/// See https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-action-object-action-metadata +pub struct AutoModerationActionMetadataForBlockMessage { + pub custom_message: Option +} + +#[derive(Serialize, Deserialize, Debug, Clone, Default)] +/// See https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-action-object-action-metadata +pub struct AutoModerationActionMetadataForSendAlertMessage { + pub channel_id: Snowflake +} + +#[derive(Serialize, Deserialize, Debug, Clone, Default)] +/// See https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-action-object-action-metadata +pub struct AutoModerationActionMetadataForTimeout { + /// Max 2419200 + pub duration_seconds: u32, +} \ No newline at end of file diff --git a/src/types/entities/mod.rs b/src/types/entities/mod.rs index a34246e..5ade576 100644 --- a/src/types/entities/mod.rs +++ b/src/types/entities/mod.rs @@ -18,6 +18,7 @@ mod voice_state; mod webhook; mod audit_log; mod relationship; +mod auto_moderation; pub use application::*; pub use attachment::*; @@ -38,4 +39,5 @@ pub use user_settings::*; pub use voice_state::*; pub use webhook::*; pub use audit_log::*; -pub use relationship::*; \ No newline at end of file +pub use relationship::*; +pub use auto_moderation::*; \ No newline at end of file diff --git a/src/types/events/auto_moderation.rs b/src/types/events/auto_moderation.rs new file mode 100644 index 0000000..3c6696d --- /dev/null +++ b/src/types/events/auto_moderation.rs @@ -0,0 +1,48 @@ +use serde::{Deserialize, Serialize}; + +use crate::types::{WebSocketEvent, AutoModerationRule, Snowflake, AutoModerationAction, AutoModerationRuleTriggerType}; + +#[derive(Debug, Deserialize, Serialize, Default)] +/// See https://discord.com/developers/docs/topics/gateway-events#auto-moderation-rule-create +pub struct AutoModerationRuleCreate { + #[serde(flatten)] + pub rule: AutoModerationRule, +} + +impl WebSocketEvent for AutoModerationRuleCreate {} + +#[derive(Debug, Deserialize, Serialize, Default)] +/// See https://discord.com/developers/docs/topics/gateway-events#auto-moderation-rule-update +pub struct AutoModerationRuleUpdate { + #[serde(flatten)] + pub rule: AutoModerationRule, +} + +impl WebSocketEvent for AutoModerationRuleUpdate {} + +#[derive(Debug, Deserialize, Serialize, Default)] +/// See https://discord.com/developers/docs/topics/gateway-events#auto-moderation-rule-delete +pub struct AutoModerationRuleDelete { + #[serde(flatten)] + pub rule: AutoModerationRule, +} + +impl WebSocketEvent for AutoModerationRuleDelete {} + +#[derive(Debug, Deserialize, Serialize, Default)] +/// See https://discord.com/developers/docs/topics/gateway-events#auto-moderation-action-execution +pub struct AutoModerationActionExecution { + pub guild_id: Snowflake, + pub action: AutoModerationAction, + pub rule_id: Snowflake, + pub rule_trigger_type: AutoModerationRuleTriggerType, + pub user_id: Snowflake, + pub channel_id: Option, + pub message_id: Option, + pub alert_system_message_id: Option, + pub content: Option, + pub matched_keyword: Option, + pub matched_content: Option +} + +impl WebSocketEvent for AutoModerationActionExecution {} \ No newline at end of file diff --git a/src/types/events/mod.rs b/src/types/events/mod.rs index 514f387..8afb5b8 100644 --- a/src/types/events/mod.rs +++ b/src/types/events/mod.rs @@ -21,6 +21,7 @@ mod invite; mod call; mod lazy_request; mod relationship; +mod auto_moderation; pub use channel::*; pub use guild::*; @@ -43,6 +44,7 @@ pub use invite::*; pub use call::*; pub use lazy_request::*; pub use relationship::*; +pub use auto_moderation::*; pub trait WebSocketEvent {}