1use crate::Snowflake;
6use crate::TitanString;
7use serde::{Deserialize, Serialize};
8
9#[derive(Debug, Clone, Deserialize, Serialize)]
11pub struct ThreadMetadata<'a> {
12 pub archived: bool,
14
15 pub auto_archive_duration: u32,
17
18 pub archive_timestamp: TitanString<'a>,
20
21 #[serde(default)]
23 pub locked: bool,
24
25 #[serde(default)]
27 pub invitable: Option<bool>,
28}
29
30#[derive(Debug, Clone, Deserialize, Serialize)]
32pub struct ThreadMember<'a> {
33 #[serde(default)]
35 pub id: Option<Snowflake>,
36
37 #[serde(default)]
39 pub user_id: Option<Snowflake>,
40
41 pub join_timestamp: TitanString<'a>,
43
44 pub flags: u64,
46
47 #[serde(default)]
49 pub member: Option<super::member::GuildMember<'a>>,
50}
51
52#[derive(Debug, Clone, Deserialize, Serialize)]
54pub struct ForumTag<'a> {
55 pub id: Snowflake,
57
58 pub name: TitanString<'a>,
60
61 pub moderated: bool,
63
64 pub emoji_id: Option<Snowflake>,
66
67 #[serde(default)]
69 pub emoji_name: Option<TitanString<'a>>,
70}
71
72#[derive(Debug, Clone, Deserialize, Serialize)]
74pub struct DefaultReaction<'a> {
75 pub emoji_id: Option<Snowflake>,
77
78 #[serde(default)]
80 pub emoji_name: Option<TitanString<'a>>,
81}
82
83#[derive(Debug, Clone, Deserialize, Serialize)]
85pub struct ThreadDeleteEvent {
86 pub id: Snowflake,
88
89 pub guild_id: Snowflake,
91
92 pub parent_id: Option<Snowflake>,
94
95 #[serde(rename = "type")]
97 pub channel_type: u8,
98}
99
100#[derive(Debug, Clone, Deserialize, Serialize)]
102pub struct ThreadListSyncEvent<'a> {
103 pub guild_id: Snowflake,
105
106 #[serde(default)]
108 pub channel_ids: Option<Vec<Snowflake>>,
109
110 pub threads: Vec<super::Channel<'a>>,
112
113 pub members: Vec<ThreadMember<'a>>,
115}
116
117#[derive(Debug, Clone, Deserialize, Serialize)]
119pub struct ThreadMemberUpdateEvent<'a> {
120 #[serde(flatten)]
121 pub member: ThreadMember<'a>,
122 pub guild_id: Snowflake,
123}
124
125#[derive(Debug, Clone, Deserialize, Serialize)]
127pub struct ThreadMembersUpdateEvent<'a> {
128 pub id: Snowflake,
130
131 pub guild_id: Snowflake,
133
134 pub member_count: u32,
136
137 #[serde(default)]
139 pub added_members: Option<Vec<ThreadMember<'a>>>,
140
141 #[serde(default)]
143 pub removed_member_ids: Option<Vec<Snowflake>>,
144}
145
146#[cfg(test)]
147mod tests {
148 use super::*;
149
150 #[test]
151 fn test_thread_metadata() {
152 let json = r#"{
153 "archived": false,
154 "auto_archive_duration": 1440,
155 "archive_timestamp": "2021-01-01T00:00:00.000Z",
156 "locked": false
157 }"#;
158
159 let metadata: ThreadMetadata = crate::json::from_str(json).unwrap();
160 assert!(!metadata.archived);
161 assert_eq!(metadata.auto_archive_duration, 1440);
162 }
163}