titanium_model/
audit.rs

1//! Audit log types for Discord moderation tracking.
2//!
3//! Audit logs record administrative actions in a guild.
4
5use crate::Snowflake;
6use serde::{Deserialize, Serialize};
7use serde_repr::{Deserialize_repr, Serialize_repr};
8
9/// An audit log entry.
10#[derive(Debug, Clone, Deserialize, Serialize)]
11pub struct AuditLogEntry {
12    /// ID of the entry.
13    pub id: Snowflake,
14
15    /// ID of the affected entity (user, channel, role, etc.).
16    #[serde(default)]
17    pub target_id: Option<String>,
18
19    /// Changes made to the target.
20    #[serde(default)]
21    pub changes: Vec<AuditLogChange>,
22
23    /// User or app that made the changes.
24    #[serde(default)]
25    pub user_id: Option<Snowflake>,
26
27    /// Type of action that occurred.
28    pub action_type: AuditLogEvent,
29
30    /// Additional info for certain event types.
31    #[serde(default)]
32    pub options: Option<AuditLogOptions>,
33
34    /// Reason for the change (1-512 characters).
35    #[serde(default)]
36    pub reason: Option<String>,
37}
38
39/// A change in an audit log entry.
40#[derive(Debug, Clone, Deserialize, Serialize)]
41pub struct AuditLogChange {
42    /// Name of the changed entity.
43    pub key: String,
44
45    /// New value of the key.
46    #[serde(default)]
47    pub new_value: Option<crate::json::Value>,
48
49    /// Old value of the key.
50    #[serde(default)]
51    pub old_value: Option<crate::json::Value>,
52}
53
54/// Additional audit log entry options.
55#[derive(Debug, Clone, Default, Deserialize, Serialize)]
56pub struct AuditLogOptions {
57    /// ID of the app whose permissions were targeted.
58    #[serde(default)]
59    pub application_id: Option<Snowflake>,
60
61    /// Name of the Auto Moderation rule that was triggered.
62    #[serde(default)]
63    pub auto_moderation_rule_name: Option<String>,
64
65    /// Trigger type of the Auto Moderation rule.
66    #[serde(default)]
67    pub auto_moderation_rule_trigger_type: Option<String>,
68
69    /// Channel in which the entities were targeted.
70    #[serde(default)]
71    pub channel_id: Option<Snowflake>,
72
73    /// Number of entities that were targeted.
74    #[serde(default)]
75    pub count: Option<String>,
76
77    /// Number of days for prune.
78    #[serde(default)]
79    pub delete_member_days: Option<String>,
80
81    /// ID of the overwritten entity.
82    #[serde(default)]
83    pub id: Option<Snowflake>,
84
85    /// Number of members removed by the prune.
86    #[serde(default)]
87    pub members_removed: Option<String>,
88
89    /// ID of the message that was targeted.
90    #[serde(default)]
91    pub message_id: Option<Snowflake>,
92
93    /// Name of the role.
94    #[serde(default)]
95    pub role_name: Option<String>,
96
97    /// Type of overwritten entity.
98    #[serde(default, rename = "type")]
99    pub overwrite_type: Option<String>,
100
101    /// Type of integration.
102    #[serde(default)]
103    pub integration_type: Option<String>,
104}
105
106/// Audit log event types.
107#[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}