1use crate::channel::{Channel, ChannelMention};
2use crate::component::Component;
3use crate::member::GuildMember;
4use crate::poll;
5use crate::snowflake::Snowflake;
6use crate::user::User;
7use crate::TitanString;
8use serde::{Deserialize, Serialize};
9
10#[derive(Debug, Clone, Deserialize, Serialize)]
12pub struct Message<'a> {
13 pub id: Snowflake,
15 pub channel_id: Snowflake,
17 pub author: User<'a>,
19 pub content: TitanString<'a>,
21 pub timestamp: TitanString<'a>,
23 #[serde(default)]
25 pub edited_timestamp: Option<String>,
26 #[serde(default)]
28 pub tts: bool,
29 #[serde(default)]
31 pub mention_everyone: bool,
32 #[serde(default)]
34 pub mentions: smallvec::SmallVec<[User<'a>; 4]>,
35 #[serde(default)]
37 pub mention_roles: smallvec::SmallVec<[Snowflake; 4]>,
38 #[serde(default)]
40 pub mention_channels: smallvec::SmallVec<[ChannelMention; 2]>,
41 #[serde(default)]
43 pub attachments: smallvec::SmallVec<[Attachment<'a>; 4]>,
44 #[serde(default)]
46 pub embeds: smallvec::SmallVec<[Embed<'a>; 10]>,
47 #[serde(default)]
49 pub reactions: smallvec::SmallVec<[Reaction<'a>; 5]>,
50 #[serde(default)]
52 pub nonce: Option<crate::json::Value>,
53 #[serde(default)]
55 pub pinned: bool,
56 #[serde(default)]
58 pub webhook_id: Option<Snowflake>,
59 #[serde(rename = "type")]
61 pub message_type: u8,
62 #[serde(default)]
64 pub guild_id: Option<Snowflake>,
65 #[serde(default)]
67 pub member: Option<GuildMember<'a>>,
68 #[serde(default)]
70 pub flags: Option<u64>,
71 #[serde(default)]
73 pub message_reference: Option<MessageReference>,
74 #[serde(default)]
76 pub referenced_message: Option<Box<Message<'a>>>,
77 #[serde(default)]
79 pub thread: Option<Channel<'a>>,
80 #[serde(default)]
82 pub components: smallvec::SmallVec<[Component<'a>; 5]>,
83 #[serde(default)]
85 pub sticker_items: smallvec::SmallVec<[StickerItem; 3]>,
86 #[serde(default)]
88 pub poll: Option<poll::Poll<'a>>,
89}
90
91#[derive(Debug, Clone, Deserialize, Serialize)]
93pub struct Attachment<'a> {
94 pub id: Snowflake,
96 pub filename: TitanString<'a>,
98 #[serde(default)]
100 pub description: Option<TitanString<'a>>,
101 #[serde(default)]
103 pub content_type: Option<String>,
104 pub size: u64,
106 pub url: TitanString<'a>,
108 pub proxy_url: TitanString<'a>,
110 #[serde(default)]
112 pub height: Option<u32>,
113 #[serde(default)]
115 pub width: Option<u32>,
116 #[serde(default)]
118 pub ephemeral: bool,
119 #[serde(default)]
121 pub duration_secs: Option<f64>,
122 #[serde(default)]
124 pub waveform: Option<String>,
125 #[serde(default)]
127 pub flags: Option<u64>,
128}
129
130#[derive(Debug, Clone, Default, Deserialize, Serialize)]
132pub struct Embed<'a> {
133 #[serde(default)]
135 pub title: Option<TitanString<'a>>,
136 #[serde(default, rename = "type")]
138 pub embed_type: Option<TitanString<'a>>,
139 #[serde(default)]
141 pub description: Option<TitanString<'a>>,
142 #[serde(default)]
144 pub url: Option<TitanString<'a>>,
145 #[serde(default)]
147 pub timestamp: Option<TitanString<'a>>,
148 #[serde(default)]
150 pub color: Option<u32>,
151 #[serde(default)]
153 pub footer: Option<EmbedFooter<'a>>,
154 #[serde(default)]
156 pub image: Option<EmbedMedia<'a>>,
157 #[serde(default)]
159 pub thumbnail: Option<EmbedMedia<'a>>,
160 #[serde(default)]
162 pub video: Option<EmbedMedia<'a>>,
163 #[serde(default)]
165 pub provider: Option<EmbedProvider<'a>>,
166 #[serde(default)]
168 pub author: Option<EmbedAuthor<'a>>,
169 #[serde(default)]
171 pub fields: Vec<EmbedField<'a>>,
172}
173
174#[derive(Debug, Clone, Deserialize, Serialize)]
176pub struct EmbedFooter<'a> {
177 pub text: TitanString<'a>,
179 #[serde(default)]
181 pub icon_url: Option<TitanString<'a>>,
182 #[serde(default)]
184 pub proxy_icon_url: Option<TitanString<'a>>,
185}
186
187#[derive(Debug, Clone, Deserialize, Serialize)]
189pub struct EmbedMedia<'a> {
190 #[serde(default)]
192 pub url: Option<TitanString<'a>>,
193 #[serde(default)]
195 pub proxy_url: Option<TitanString<'a>>,
196 #[serde(default)]
198 pub height: Option<u32>,
199 #[serde(default)]
201 pub width: Option<u32>,
202}
203
204#[derive(Debug, Clone, Deserialize, Serialize)]
206pub struct EmbedProvider<'a> {
207 #[serde(default)]
209 pub name: Option<TitanString<'a>>,
210 #[serde(default)]
212 pub url: Option<TitanString<'a>>,
213}
214
215#[derive(Debug, Clone, Deserialize, Serialize)]
217pub struct EmbedAuthor<'a> {
218 pub name: TitanString<'a>,
220 #[serde(default)]
222 pub url: Option<TitanString<'a>>,
223 #[serde(default)]
225 pub icon_url: Option<TitanString<'a>>,
226 #[serde(default)]
228 pub proxy_icon_url: Option<TitanString<'a>>,
229}
230
231#[derive(Debug, Clone, Deserialize, Serialize)]
233pub struct EmbedField<'a> {
234 pub name: TitanString<'a>,
236 pub value: TitanString<'a>,
238 #[serde(default)]
240 pub inline: bool,
241}
242
243#[derive(Debug, Clone, Deserialize, Serialize)]
245pub struct Reaction<'a> {
246 pub count: u32,
248 #[serde(default)]
250 pub count_details: Option<ReactionCountDetails>,
251 pub me: bool,
253 #[serde(default)]
255 pub me_burst: bool,
256 pub emoji: crate::reaction::ReactionEmoji<'a>,
258 #[serde(default)]
260 pub burst_colors: Vec<String>,
261}
262
263#[derive(Debug, Clone, Deserialize, Serialize)]
265pub struct ReactionCountDetails {
266 pub burst: u32,
268 pub normal: u32,
270}
271
272#[derive(Debug, Clone, Deserialize, Serialize)]
274pub struct MessageReference {
275 #[serde(default)]
277 pub message_id: Option<Snowflake>,
278 #[serde(default)]
280 pub channel_id: Option<Snowflake>,
281 #[serde(default)]
283 pub guild_id: Option<Snowflake>,
284 #[serde(default)]
286 pub fail_if_not_exists: Option<bool>,
287}
288
289#[derive(Debug, Clone, Deserialize, Serialize)]
291pub struct StickerItem {
292 pub id: Snowflake,
294 pub name: String,
296 pub format_type: u8,
298}
299
300#[derive(Debug, Clone, Deserialize, Serialize)]
302pub struct MessageUpdateEvent<'a> {
303 pub id: Snowflake,
304 pub channel_id: Snowflake,
305 #[serde(default)]
306 pub guild_id: Option<Snowflake>,
307 #[serde(default)]
308 pub content: Option<String>,
309 #[serde(default)]
310 pub author: Option<User<'a>>,
311 #[serde(default)]
312 pub edited_timestamp: Option<String>,
313}
314
315#[derive(Debug, Clone, Deserialize, Serialize)]
317pub struct MessageDeleteEvent {
318 pub id: Snowflake,
319 pub channel_id: Snowflake,
320 #[serde(default)]
321 pub guild_id: Option<Snowflake>,
322}
323
324#[derive(Debug, Clone, Deserialize, Serialize)]
326pub struct MessageDeleteBulkEvent {
327 pub ids: Vec<Snowflake>,
328 pub channel_id: Snowflake,
329 #[serde(default)]
330 pub guild_id: Option<Snowflake>,
331}
332
333#[derive(Debug, Clone, Deserialize, Serialize)]
335pub struct TypingStartEvent<'a> {
336 pub channel_id: Snowflake,
337 #[serde(default)]
338 pub guild_id: Option<Snowflake>,
339 pub user_id: Snowflake,
340 pub timestamp: u64,
341 #[serde(default)]
342 pub member: Option<GuildMember<'a>>,
343}