1use crate::Snowflake;
6use serde::{Deserialize, Serialize};
7use serde_repr::{Deserialize_repr, Serialize_repr};
8
9#[derive(Debug, Clone, Deserialize, Serialize)]
11pub struct AutoModRule {
12 pub id: Snowflake,
14
15 pub guild_id: Snowflake,
17
18 pub name: String,
20
21 pub creator_id: Snowflake,
23
24 pub event_type: AutoModEventType,
26
27 pub trigger_type: AutoModTriggerType,
29
30 pub trigger_metadata: AutoModTriggerMetadata,
32
33 pub actions: Vec<AutoModAction>,
35
36 pub enabled: bool,
38
39 #[serde(default)]
41 pub exempt_roles: Vec<Snowflake>,
42
43 #[serde(default)]
45 pub exempt_channels: Vec<Snowflake>,
46}
47
48#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize_repr, Deserialize_repr)]
50#[repr(u8)]
51pub enum AutoModEventType {
52 MessageSend = 1,
54 MemberUpdate = 2,
56}
57
58#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize_repr, Deserialize_repr)]
60#[repr(u8)]
61pub enum AutoModTriggerType {
62 Keyword = 1,
64 Spam = 3,
66 KeywordPreset = 4,
68 MentionSpam = 5,
70 MemberProfile = 6,
72}
73
74#[derive(Debug, Clone, Default, Deserialize, Serialize)]
76pub struct AutoModTriggerMetadata {
77 #[serde(default)]
79 pub keyword_filter: Vec<String>,
80
81 #[serde(default)]
83 pub regex_patterns: Vec<String>,
84
85 #[serde(default)]
87 pub presets: Vec<AutoModKeywordPresetType>,
88
89 #[serde(default)]
91 pub allow_list: Vec<String>,
92
93 #[serde(default)]
95 pub mention_total_limit: Option<u32>,
96
97 #[serde(default)]
99 pub mention_raid_protection_enabled: bool,
100}
101
102#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize_repr, Deserialize_repr)]
104#[repr(u8)]
105pub enum AutoModKeywordPresetType {
106 Profanity = 1,
108 SexualContent = 2,
110 Slurs = 3,
112}
113
114#[derive(Debug, Clone, Deserialize, Serialize)]
116pub struct AutoModAction {
117 #[serde(rename = "type")]
119 pub action_type: AutoModActionType,
120
121 #[serde(default)]
123 pub metadata: Option<AutoModActionMetadata>,
124}
125
126#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize_repr, Deserialize_repr)]
128#[repr(u8)]
129pub enum AutoModActionType {
130 BlockMessage = 1,
132 SendAlertMessage = 2,
134 Timeout = 3,
136 BlockMemberInteraction = 4,
138}
139
140#[derive(Debug, Clone, Default, Deserialize, Serialize)]
142pub struct AutoModActionMetadata {
143 #[serde(default)]
145 pub channel_id: Option<Snowflake>,
146
147 #[serde(default)]
149 pub duration_seconds: Option<u64>,
150
151 #[serde(default)]
153 pub custom_message: Option<String>,
154}
155
156#[derive(Debug, Clone, Deserialize, Serialize)]
158pub struct AutoModActionExecution {
159 pub guild_id: Snowflake,
161
162 pub action: AutoModAction,
164
165 pub rule_id: Snowflake,
167
168 pub rule_trigger_type: AutoModTriggerType,
170
171 pub user_id: Snowflake,
173
174 #[serde(default)]
176 pub channel_id: Option<Snowflake>,
177
178 #[serde(default)]
180 pub message_id: Option<Snowflake>,
181
182 #[serde(default)]
184 pub alert_system_message_id: Option<Snowflake>,
185
186 #[serde(default)]
188 pub content: String,
189
190 #[serde(default)]
192 pub matched_keyword: Option<String>,
193
194 #[serde(default)]
196 pub matched_content: Option<String>,
197}
198
199#[cfg(test)]
200mod tests {
201 use super::*;
202
203 #[test]
204 fn test_automod_action_type() {
205 let json = "1";
206 let action_type: AutoModActionType = crate::json::from_str(json).unwrap();
207 assert_eq!(action_type, AutoModActionType::BlockMessage);
208 }
209
210 #[test]
211 fn test_automod_trigger_metadata() {
212 let json = r#"{
213 "keyword_filter": ["badword"],
214 "regex_patterns": ["\\d+"],
215 "allow_list": ["exception"]
216 }"#;
217
218 let metadata: AutoModTriggerMetadata = crate::json::from_str(json).unwrap();
219 assert_eq!(metadata.keyword_filter.len(), 1);
220 }
221}