1use crate::channel::{Channel, ChannelMention};
2use crate::component::Component;
3use crate::member::{Emoji, GuildMember};
4use crate::snowflake::Snowflake;
5use crate::user::User;
6use crate::TitanString;
7use serde::{Deserialize, Serialize};
8
9#[derive(Debug, Clone, Deserialize, Serialize)]
15pub struct Poll<'a> {
16 pub question: PollMedia<'a>,
18
19 pub answers: Vec<PollAnswer<'a>>,
21
22 #[serde(default)]
24 pub expiry: Option<TitanString<'a>>,
25
26 #[serde(default)]
28 pub allow_multiselect: bool,
29
30 #[serde(default)]
32 pub layout_type: Option<u8>,
33
34 #[serde(default)]
36 pub results: Option<PollResults>,
37}
38
39#[derive(Debug, Clone, Deserialize, Serialize)]
41pub struct PollMedia<'a> {
42 #[serde(default)]
44 pub text: Option<TitanString<'a>>,
45
46 #[serde(default)]
48 pub emoji: Option<Emoji<'a>>,
49}
50
51#[derive(Debug, Clone, Deserialize, Serialize)]
53pub struct PollAnswer<'a> {
54 #[serde(default)]
56 pub answer_id: Option<u32>,
57
58 pub poll_media: PollMedia<'a>,
60}
61
62#[derive(Debug, Clone, Deserialize, Serialize)]
64pub struct PollResults {
65 #[serde(default)]
67 pub is_finalized: bool,
68
69 #[serde(default)]
71 pub answer_counts: Vec<PollAnswerCount>,
72}
73
74#[derive(Debug, Clone, Deserialize, Serialize)]
76pub struct PollAnswerCount {
77 pub id: u32,
79
80 pub count: u32,
82
83 #[serde(default)]
85 pub me_voted: bool,
86}
87
88#[derive(Debug, Clone, Deserialize, Serialize)]
94pub struct Message<'a> {
95 pub id: Snowflake,
97 pub channel_id: Snowflake,
99 pub author: User<'a>,
101 pub content: TitanString<'a>,
103 pub timestamp: TitanString<'a>,
105 #[serde(default)]
107 pub edited_timestamp: Option<String>,
108 #[serde(default)]
110 pub tts: bool,
111 #[serde(default)]
113 pub mention_everyone: bool,
114 #[serde(default)]
116 pub mentions: smallvec::SmallVec<[User<'a>; 4]>,
117 #[serde(default)]
119 pub mention_roles: smallvec::SmallVec<[Snowflake; 4]>,
120 #[serde(default)]
122 pub mention_channels: smallvec::SmallVec<[ChannelMention; 2]>,
123 #[serde(default)]
125 pub attachments: smallvec::SmallVec<[Attachment<'a>; 4]>,
126 #[serde(default)]
128 pub embeds: smallvec::SmallVec<[Embed<'a>; 10]>,
129 #[serde(default)]
131 pub reactions: smallvec::SmallVec<[Reaction<'a>; 5]>,
132 #[serde(default)]
134 pub nonce: Option<crate::json::Value>,
135 #[serde(default)]
137 pub pinned: bool,
138 #[serde(default)]
140 pub webhook_id: Option<Snowflake>,
141 #[serde(rename = "type")]
143 pub message_type: u8,
144 #[serde(default)]
146 pub guild_id: Option<Snowflake>,
147 #[serde(default)]
149 pub member: Option<GuildMember<'a>>,
150 #[serde(default)]
152 pub flags: Option<u64>,
153 #[serde(default)]
155 pub message_reference: Option<MessageReference>,
156 #[serde(default)]
158 pub referenced_message: Option<Box<Message<'a>>>,
159 #[serde(default)]
161 pub thread: Option<Channel<'a>>,
162 #[serde(default)]
164 pub components: smallvec::SmallVec<[Component<'a>; 5]>,
165 #[serde(default)]
167 pub sticker_items: smallvec::SmallVec<[StickerItem; 3]>,
168 #[serde(default)]
170 pub poll: Option<Poll<'a>>,
171}
172
173#[derive(Debug, Clone, Deserialize, Serialize)]
175pub struct Attachment<'a> {
176 pub id: Snowflake,
178 pub filename: TitanString<'a>,
180 #[serde(default)]
182 pub description: Option<TitanString<'a>>,
183 #[serde(default)]
185 pub content_type: Option<String>,
186 pub size: u64,
188 pub url: TitanString<'a>,
190 pub proxy_url: TitanString<'a>,
192 #[serde(default)]
194 pub height: Option<u32>,
195 #[serde(default)]
197 pub width: Option<u32>,
198 #[serde(default)]
200 pub ephemeral: bool,
201 #[serde(default)]
203 pub duration_secs: Option<f64>,
204 #[serde(default)]
206 pub waveform: Option<String>,
207 #[serde(default)]
209 pub flags: Option<u64>,
210}
211
212#[derive(Debug, Clone, Default, Deserialize, Serialize)]
214pub struct Embed<'a> {
215 #[serde(default)]
217 pub title: Option<TitanString<'a>>,
218 #[serde(default, rename = "type")]
220 pub embed_type: Option<TitanString<'a>>,
221 #[serde(default)]
223 pub description: Option<TitanString<'a>>,
224 #[serde(default)]
226 pub url: Option<TitanString<'a>>,
227 #[serde(default)]
229 pub timestamp: Option<TitanString<'a>>,
230 #[serde(default)]
232 pub color: Option<u32>,
233 #[serde(default)]
235 pub footer: Option<EmbedFooter<'a>>,
236 #[serde(default)]
238 pub image: Option<EmbedMedia<'a>>,
239 #[serde(default)]
241 pub thumbnail: Option<EmbedMedia<'a>>,
242 #[serde(default)]
244 pub video: Option<EmbedMedia<'a>>,
245 #[serde(default)]
247 pub provider: Option<EmbedProvider<'a>>,
248 #[serde(default)]
250 pub author: Option<EmbedAuthor<'a>>,
251 #[serde(default)]
253 pub fields: Vec<EmbedField<'a>>,
254}
255
256#[derive(Debug, Clone, Deserialize, Serialize)]
258pub struct EmbedFooter<'a> {
259 pub text: TitanString<'a>,
261 #[serde(default)]
263 pub icon_url: Option<TitanString<'a>>,
264 #[serde(default)]
266 pub proxy_icon_url: Option<TitanString<'a>>,
267}
268
269#[derive(Debug, Clone, Deserialize, Serialize)]
271pub struct EmbedMedia<'a> {
272 #[serde(default)]
274 pub url: Option<TitanString<'a>>,
275 #[serde(default)]
277 pub proxy_url: Option<TitanString<'a>>,
278 #[serde(default)]
280 pub height: Option<u32>,
281 #[serde(default)]
283 pub width: Option<u32>,
284}
285
286#[derive(Debug, Clone, Deserialize, Serialize)]
288pub struct EmbedProvider<'a> {
289 #[serde(default)]
291 pub name: Option<TitanString<'a>>,
292 #[serde(default)]
294 pub url: Option<TitanString<'a>>,
295}
296
297#[derive(Debug, Clone, Deserialize, Serialize)]
299pub struct EmbedAuthor<'a> {
300 pub name: TitanString<'a>,
302 #[serde(default)]
304 pub url: Option<TitanString<'a>>,
305 #[serde(default)]
307 pub icon_url: Option<TitanString<'a>>,
308 #[serde(default)]
310 pub proxy_icon_url: Option<TitanString<'a>>,
311}
312
313#[derive(Debug, Clone, Deserialize, Serialize)]
315pub struct EmbedField<'a> {
316 pub name: TitanString<'a>,
318 pub value: TitanString<'a>,
320 #[serde(default)]
322 pub inline: bool,
323}
324
325#[derive(Debug, Clone, Deserialize, Serialize)]
327pub struct Reaction<'a> {
328 pub count: u32,
330 #[serde(default)]
332 pub count_details: Option<ReactionCountDetails>,
333 pub me: bool,
335 #[serde(default)]
337 pub me_burst: bool,
338 pub emoji: crate::reaction::ReactionEmoji<'a>,
340 #[serde(default)]
342 pub burst_colors: Vec<String>,
343}
344
345#[derive(Debug, Clone, Deserialize, Serialize)]
347pub struct ReactionCountDetails {
348 pub burst: u32,
350 pub normal: u32,
352}
353
354#[derive(Debug, Clone, Deserialize, Serialize)]
356pub struct MessageReference {
357 #[serde(default)]
359 pub message_id: Option<Snowflake>,
360 #[serde(default)]
362 pub channel_id: Option<Snowflake>,
363 #[serde(default)]
365 pub guild_id: Option<Snowflake>,
366 #[serde(default)]
368 pub fail_if_not_exists: Option<bool>,
369}
370
371#[derive(Debug, Clone, Deserialize, Serialize)]
373pub struct StickerItem {
374 pub id: Snowflake,
376 pub name: String,
378 pub format_type: u8,
380}
381
382#[derive(Debug, Clone, Deserialize, Serialize)]
384pub struct MessageUpdateEvent<'a> {
385 pub id: Snowflake,
386 pub channel_id: Snowflake,
387 #[serde(default)]
388 pub guild_id: Option<Snowflake>,
389 #[serde(default)]
390 pub content: Option<String>,
391 #[serde(default)]
392 pub author: Option<User<'a>>,
393 #[serde(default)]
394 pub edited_timestamp: Option<String>,
395}
396
397#[derive(Debug, Clone, Deserialize, Serialize)]
399pub struct MessageDeleteEvent {
400 pub id: Snowflake,
401 pub channel_id: Snowflake,
402 #[serde(default)]
403 pub guild_id: Option<Snowflake>,
404}
405
406#[derive(Debug, Clone, Deserialize, Serialize)]
408pub struct MessageDeleteBulkEvent {
409 pub ids: Vec<Snowflake>,
410 pub channel_id: Snowflake,
411 #[serde(default)]
412 pub guild_id: Option<Snowflake>,
413}
414
415#[derive(Debug, Clone, Deserialize, Serialize)]
417pub struct TypingStartEvent<'a> {
418 pub channel_id: Snowflake,
419 #[serde(default)]
420 pub guild_id: Option<Snowflake>,
421 pub user_id: Snowflake,
422 pub timestamp: u64,
423 #[serde(default)]
424 pub member: Option<GuildMember<'a>>,
425}