1use crate::Snowflake;
6use serde::{Deserialize, Serialize};
7use serde_repr::{Deserialize_repr, Serialize_repr};
8
9#[derive(Debug, Clone, Deserialize, Serialize)]
11pub struct AuditLogEntry {
12 pub id: Snowflake,
14
15 #[serde(default)]
17 pub target_id: Option<String>,
18
19 #[serde(default)]
21 pub changes: Vec<AuditLogChange>,
22
23 #[serde(default)]
25 pub user_id: Option<Snowflake>,
26
27 pub action_type: AuditLogEvent,
29
30 #[serde(default)]
32 pub options: Option<AuditLogOptions>,
33
34 #[serde(default)]
36 pub reason: Option<String>,
37}
38
39#[derive(Debug, Clone, Deserialize, Serialize)]
41pub struct AuditLogChange {
42 pub key: String,
44
45 #[serde(default)]
47 pub new_value: Option<crate::json::Value>,
48
49 #[serde(default)]
51 pub old_value: Option<crate::json::Value>,
52}
53
54#[derive(Debug, Clone, Default, Deserialize, Serialize)]
56pub struct AuditLogOptions {
57 #[serde(default)]
59 pub application_id: Option<Snowflake>,
60
61 #[serde(default)]
63 pub auto_moderation_rule_name: Option<String>,
64
65 #[serde(default)]
67 pub auto_moderation_rule_trigger_type: Option<String>,
68
69 #[serde(default)]
71 pub channel_id: Option<Snowflake>,
72
73 #[serde(default)]
75 pub count: Option<String>,
76
77 #[serde(default)]
79 pub delete_member_days: Option<String>,
80
81 #[serde(default)]
83 pub id: Option<Snowflake>,
84
85 #[serde(default)]
87 pub members_removed: Option<String>,
88
89 #[serde(default)]
91 pub message_id: Option<Snowflake>,
92
93 #[serde(default)]
95 pub role_name: Option<String>,
96
97 #[serde(default, rename = "type")]
99 pub overwrite_type: Option<String>,
100
101 #[serde(default)]
103 pub integration_type: Option<String>,
104}
105
106#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize_repr, Deserialize_repr)]
108#[repr(u16)]
109pub enum AuditLogEvent {
110 GuildUpdate = 1,
111 ChannelCreate = 10,
112 ChannelUpdate = 11,
113 ChannelDelete = 12,
114 ChannelOverwriteCreate = 13,
115 ChannelOverwriteUpdate = 14,
116 ChannelOverwriteDelete = 15,
117 MemberKick = 20,
118 MemberPrune = 21,
119 MemberBanAdd = 22,
120 MemberBanRemove = 23,
121 MemberUpdate = 24,
122 MemberRoleUpdate = 25,
123 MemberMove = 26,
124 MemberDisconnect = 27,
125 BotAdd = 28,
126 RoleCreate = 30,
127 RoleUpdate = 31,
128 RoleDelete = 32,
129 InviteCreate = 40,
130 InviteUpdate = 41,
131 InviteDelete = 42,
132 WebhookCreate = 50,
133 WebhookUpdate = 51,
134 WebhookDelete = 52,
135 EmojiCreate = 60,
136 EmojiUpdate = 61,
137 EmojiDelete = 62,
138 MessageDelete = 72,
139 MessageBulkDelete = 73,
140 MessagePin = 74,
141 MessageUnpin = 75,
142 IntegrationCreate = 80,
143 IntegrationUpdate = 81,
144 IntegrationDelete = 82,
145 StageInstanceCreate = 83,
146 StageInstanceUpdate = 84,
147 StageInstanceDelete = 85,
148 StickerCreate = 90,
149 StickerUpdate = 91,
150 StickerDelete = 92,
151 GuildScheduledEventCreate = 100,
152 GuildScheduledEventUpdate = 101,
153 GuildScheduledEventDelete = 102,
154 ThreadCreate = 110,
155 ThreadUpdate = 111,
156 ThreadDelete = 112,
157 ApplicationCommandPermissionUpdate = 121,
158 SoundboardSoundCreate = 130,
159 SoundboardSoundUpdate = 131,
160 SoundboardSoundDelete = 132,
161 AutoModerationRuleCreate = 140,
162 AutoModerationRuleUpdate = 141,
163 AutoModerationRuleDelete = 142,
164 AutoModerationBlockMessage = 143,
165 AutoModerationFlagToChannel = 144,
166 AutoModerationUserCommunicationDisabled = 145,
167 CreatorMonetizationRequestCreated = 150,
168 CreatorMonetizationTermsAccepted = 151,
169 OnboardingPromptCreate = 163,
170 OnboardingPromptUpdate = 164,
171 OnboardingPromptDelete = 165,
172 OnboardingCreate = 166,
173 OnboardingUpdate = 167,
174 HomeSettingsCreate = 190,
175 HomeSettingsUpdate = 191,
176}
177
178#[cfg(test)]
179mod tests {
180 use super::*;
181
182 #[test]
183 fn test_audit_log_entry() {
184 let json = r#"{
185 "id": "123",
186 "target_id": "456",
187 "changes": [],
188 "action_type": 1
189 }"#;
190
191 let entry: AuditLogEntry = crate::json::from_str(json).unwrap();
192 assert_eq!(entry.action_type, AuditLogEvent::GuildUpdate);
193 }
194}