Add Auto Moderation types & events

This commit is contained in:
kozabrada123 2023-05-27 16:50:38 +02:00
parent ab902c5ef2
commit 8d0083e11d
5 changed files with 213 additions and 5 deletions

View File

@ -233,10 +233,22 @@ impl Gateway {
} }
"RESUMED" => {} "RESUMED" => {}
"APPLICATION_COMMAND_PERMISSIONS_UPDATE" => {} "APPLICATION_COMMAND_PERMISSIONS_UPDATE" => {}
"AUTO_MODERATION_RULE_CREATE" => {} "AUTO_MODERATION_RULE_CREATE" => {
"AUTO_MODERATION_RULE_UPDATE" => {} let new_data: types::AutoModerationRuleCreate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap();
"AUTO_MODERATION_RULE_DELETE" => {} self.events.lock().await.auto_moderation.rule_create.update_data(new_data).await;
"AUTO_MODERATION_ACTION_EXECUTION" => {} }
"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" => { "CHANNEL_CREATE" => {
let new_data: types::ChannelCreate = serde_json::from_str(gateway_payload.d.unwrap().get()).unwrap(); 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; self.events.lock().await.channel.create.update_data(new_data).await;
@ -692,6 +704,7 @@ mod events {
use super::*; use super::*;
#[derive(Default, Debug)] #[derive(Default, Debug)]
pub struct Events { pub struct Events {
pub auto_moderation: AutoModeration,
pub session: Session, pub session: Session,
pub message: Message, pub message: Message,
pub user: User, pub user: User,
@ -708,6 +721,14 @@ mod events {
pub gateway_resume: GatewayEvent<types::GatewayResume>, pub gateway_resume: GatewayEvent<types::GatewayResume>,
} }
#[derive(Default, Debug)]
pub struct AutoModeration {
pub rule_create: GatewayEvent<types::AutoModerationRuleCreate>,
pub rule_update: GatewayEvent<types::AutoModerationRuleUpdate>,
pub rule_delete: GatewayEvent<types::AutoModerationRuleDelete>,
pub action_execution: GatewayEvent<types::AutoModerationActionExecution>,
}
#[derive(Default, Debug)] #[derive(Default, Debug)]
pub struct Session { pub struct Session {
pub ready: GatewayEvent<types::GatewayReady>, pub ready: GatewayEvent<types::GatewayReady>,

View File

@ -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<AutoModerationAction>,
pub enabled: bool,
pub exempt_roles: Vec<Snowflake>,
pub exempt_channels: Vec<Snowflake>,
}
#[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<String>,
pub regex_patterns: Vec<String>,
pub allow_list: Vec<String>,
}
#[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<AutoModerationRuleKeywordPresetType>,
pub allow_list: Vec<String>,
}
#[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<AutoModerationActionMetadata>
}
#[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<String>
}
#[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,
}

View File

@ -18,6 +18,7 @@ mod voice_state;
mod webhook; mod webhook;
mod audit_log; mod audit_log;
mod relationship; mod relationship;
mod auto_moderation;
pub use application::*; pub use application::*;
pub use attachment::*; pub use attachment::*;
@ -38,4 +39,5 @@ pub use user_settings::*;
pub use voice_state::*; pub use voice_state::*;
pub use webhook::*; pub use webhook::*;
pub use audit_log::*; pub use audit_log::*;
pub use relationship::*; pub use relationship::*;
pub use auto_moderation::*;

View File

@ -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<Snowflake>,
pub message_id: Option<Snowflake>,
pub alert_system_message_id: Option<Snowflake>,
pub content: Option<String>,
pub matched_keyword: Option<String>,
pub matched_content: Option<String>
}
impl WebSocketEvent for AutoModerationActionExecution {}

View File

@ -21,6 +21,7 @@ mod invite;
mod call; mod call;
mod lazy_request; mod lazy_request;
mod relationship; mod relationship;
mod auto_moderation;
pub use channel::*; pub use channel::*;
pub use guild::*; pub use guild::*;
@ -43,6 +44,7 @@ pub use invite::*;
pub use call::*; pub use call::*;
pub use lazy_request::*; pub use lazy_request::*;
pub use relationship::*; pub use relationship::*;
pub use auto_moderation::*;
pub trait WebSocketEvent {} pub trait WebSocketEvent {}