spectacles_model/message/
mod.rs1use chrono::{DateTime, FixedOffset};
3use serde_repr::{Deserialize_repr, Serialize_repr};
4
5use crate::guild::GuildMember;
6use crate::snowflake::Snowflake;
7use crate::User;
8
9pub use self::embed::*;
10pub use self::emoji::*;
11pub use self::webhook::*;
12
13mod embed;
14mod webhook;
15mod emoji;
16
17pub trait MessageResponse {
19 fn as_message(self) -> CreateMessageOptions;
20}
21
22impl MessageResponse for &str {
23 fn as_message(self) -> CreateMessageOptions {
24 CreateMessageOptions::default().content(self)
25 }
26}
27
28impl MessageResponse for &String {
29 fn as_message(self) -> CreateMessageOptions {
30 CreateMessageOptions::default().content(self.clone())
31 }
32}
33
34impl MessageResponse for CreateMessageOptions {
35 fn as_message(self) -> CreateMessageOptions {
36 self
37 }
38}
39
40impl MessageResponse for String {
41 fn as_message(self) -> CreateMessageOptions {
42 CreateMessageOptions::default().content(self)
43 }
44}
45
46impl MessageResponse for Embed {
47 fn as_message(self) -> CreateMessageOptions {
48 CreateMessageOptions::default().embed(self)
49 }
50}
51impl MessageResponse for EditMessage {
52 fn as_message(self) -> CreateMessageOptions {
53 let mut m = CreateMessageOptions::default();
54 m = m.content(self.content.unwrap_or_default());
55
56 if let Some(e) = self.embed {
57 m.embed(e)
58 } else {
59 m
60 }
61 }
62}
63
64#[derive(Deserialize, Serialize, Clone, Debug)]
66pub struct Message {
67 pub id: Snowflake,
69 pub channel_id: Snowflake,
71 #[serde(default)]
73 pub guild_id: Option<Snowflake>,
74 pub author: User,
76 pub content: String,
78 #[serde(default)]
80 pub member: Option<GuildMember>,
81 pub timestamp: DateTime<FixedOffset>,
83 pub edited_timestamp: Option<DateTime<FixedOffset>>,
85 pub tts: bool,
87 pub mention_everyone: bool,
89 pub mention_roles: Vec<Snowflake>,
91 pub attachments: Vec<MessageAttachment>,
93 pub embeds: Vec<Embed>,
95 #[serde(default)]
97 pub reactions: Vec<MessageReaction>,
98 #[serde(default)]
100 pub nonce: Option<Snowflake>,
101 pub pinned: bool,
103 #[serde(default)]
105 pub webhook_id: Option<Snowflake>,
106 #[serde(rename = "type")]
108 pub kind: MessageType,
109 #[serde(default)]
111 pub activity: Option<MessageActivity>,
112 #[serde(default)]
114 pub application: Option<MessageApplication>,
115}
116
117#[derive(Serialize, Debug, Default)]
119pub struct CreateMessageOptions {
120 #[serde(skip_serializing_if = "Option::is_none")]
122 content: Option<String>,
123 #[serde(skip_serializing_if = "Option::is_none")]
125 embed: Option<Embed>,
126 tts: Option<bool>,
128 #[serde(skip_serializing)]
129 pub file: Option<(String, Vec<u8>)>
130}
131
132impl CreateMessageOptions {
133 pub fn new() -> Self {
135 CreateMessageOptions {
136 content: None,
137 embed: None,
138 tts: None,
139 file: None
140 }
141 }
142
143 pub fn content(mut self, content: impl ToString) -> Self {
145 self.content = Some(content.to_string());
146
147 self
148 }
149
150 pub fn embed(mut self, embed: Embed) -> Self {
152 self.embed = Some(embed);
153
154 self
155 }
156
157 pub fn file(mut self, name: &str, file: Vec<u8>) -> Self {
159 self.file = Some((name.to_string(), file));
160 self
161 }
162
163 pub fn tts(mut self, opt: bool) -> Self {
165 self.tts = Some(opt);
166
167 self
168 }
169}
170
171#[derive(Serialize, Clone, Debug, Default)]
173pub struct EditMessage {
174 #[serde(skip_serializing_if = "Option::is_none")]
175 content: Option<String>,
176 #[serde(skip_serializing_if = "Option::is_none")]
177 embed: Option<Embed>
178}
179
180impl EditMessage {
181 pub fn new() -> EditMessage {
182 EditMessage {
183 content: None,
184 embed: None
185 }
186 }
187
188 pub fn with_content(mut self, content: impl Into<String>) -> Self {
190 self.content = Some(content.into());
191
192 self
193 }
194
195
196 pub fn with_embed(mut self, embed: Embed) -> Self {
198 self.embed = Some(embed);
199
200 self
201 }
202}
203
204#[derive(Serialize, Clone, Debug)]
206pub struct ChannelMessagesQuery {
207 #[serde(skip_serializing_if = "Option::is_none")]
208 around: Option<Snowflake>,
209 #[serde(skip_serializing_if = "Option::is_none")]
210 before: Option<Snowflake>,
211 #[serde(skip_serializing_if = "Option::is_none")]
212 after: Option<Snowflake>,
213 limit: i32
214}
215
216impl ChannelMessagesQuery {
217 pub fn new() -> ChannelMessagesQuery {
218 ChannelMessagesQuery {
219 around: None,
220 before: None,
221 after: None,
222 limit: 50
223 }
224 }
225
226
227 pub fn around(mut self, id: u64) -> Self {
229 if self.after.is_some() || self.before.is_some() {
230 return self;
231 };
232 self.around = Some(id.into());
233 self
234 }
235
236 pub fn before(mut self, id: u64) -> Self {
238 if self.around.is_some() || self.after.is_some() {
239 return self;
240 };
241 self.before = Some(id.into());
242 self
243 }
244
245 pub fn after(mut self, id: u64) -> Self {
247 if self.around.is_some() || self.before.is_some() {
248 return self;
249 };
250 self.after = Some(id.into());
251 self
252 }
253}
254
255
256#[derive(Deserialize, Serialize, Clone, Debug)]
258pub struct MessageAttachment {
259 pub id: Snowflake,
261 pub filename: String,
263 pub size: i32,
265 pub url: String,
267 pub proxy_url: String,
269 pub height: Option<i32>,
271 pub width: Option<i32>
273
274}
275#[derive(Deserialize, Serialize, Clone, Debug, Default)]
277pub struct MessageActivity {
278 #[serde(rename = "type")]
280 pub kind: MessageActivityType,
281 #[serde(default)]
283 pub party_id: String
284}
285
286#[derive(Deserialize, Serialize, Clone, Debug, Default)]
288pub struct MessageApplication {
289 pub id: Snowflake,
291 pub cover_image: String,
293 pub description: String,
295 pub icon: String,
297 pub name: String
299}
300
301#[derive(Deserialize_repr, Debug, Clone, Serialize_repr)]
303#[repr(u8)]
304pub enum MessageType {
305 Default,
306 RecipientAdd,
307 RecipientRemove,
308 Call,
309 ChannelNameChange,
310 ChannelIconChange,
311 ChannelPinnedMessage,
312 GuildMemberJoin
313}
314
315impl Default for MessageType {
316 fn default() -> Self {
317 MessageType::Default
318 }
319}
320
321#[derive(Deserialize, Serialize, Debug, Clone)]
323
324pub enum MessageActivityType {
325 Join = 1,
326 Spectate,
327 Listen = 3,
328 JoinRequest = 5
329}
330
331impl Default for MessageActivityType {
332 fn default() -> Self {
333 MessageActivityType::Join
334 }
335}