use serde::{Deserialize, Serialize};
use serde_repr::{Deserialize_repr, Serialize_repr};
use super::id::{AttachmentId, ChannelId, MessageId, WebhookId};
use super::user::User;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize_repr, Deserialize_repr)]
#[repr(u8)]
pub enum MessageType {
Default = 0,
RecipientAdd = 1,
RecipientRemove = 2,
Call = 3,
ChannelNameChange = 4,
ChannelIconChange = 5,
ChannelPinnedMessage = 6,
UserJoin = 7,
Reply = 19,
}
bitflags::bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct MessageFlags: u32 {
const SUPPRESS_EMBEDS = 1 << 2;
const SUPPRESS_NOTIFICATIONS = 1 << 12;
const VOICE_MESSAGE = 1 << 13;
const COMPACT_ATTACHMENTS = 1 << 17;
}
}
impl Serialize for MessageFlags {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_u32(self.bits())
}
}
impl<'de> Deserialize<'de> for MessageFlags {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let bits = u32::deserialize(deserializer)?;
Ok(Self::from_bits_truncate(bits))
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Message {
pub id: MessageId,
pub channel_id: ChannelId,
pub content: String,
pub author: User,
pub timestamp: String,
pub edited_timestamp: Option<String>,
#[serde(rename = "type")]
pub kind: MessageType,
pub pinned: bool,
pub mention_everyone: bool,
pub mentions: Option<Vec<User>>,
pub attachments: Option<Vec<Attachment>>,
pub embeds: Option<Vec<Embed>>,
pub reactions: Option<Vec<Reaction>>,
pub nonce: Option<String>,
pub webhook_id: Option<WebhookId>,
pub tts: Option<bool>,
pub flags: MessageFlags,
pub message_reference: Option<MessageReference>,
pub referenced_message: Option<Box<Message>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageReference {
#[serde(skip_serializing_if = "Option::is_none")]
pub message_id: Option<MessageId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub channel_id: Option<ChannelId>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Attachment {
pub id: AttachmentId,
pub filename: String,
pub size: i32,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub proxy_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub height: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub width: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Embed {
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub kind: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timestamp: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub color: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub footer: Option<EmbedFooter>,
#[serde(skip_serializing_if = "Option::is_none")]
pub image: Option<EmbedMedia>,
#[serde(skip_serializing_if = "Option::is_none")]
pub thumbnail: Option<EmbedMedia>,
#[serde(skip_serializing_if = "Option::is_none")]
pub video: Option<EmbedMedia>,
#[serde(skip_serializing_if = "Option::is_none")]
pub author: Option<EmbedAuthor>,
#[serde(skip_serializing_if = "Option::is_none")]
pub fields: Option<Vec<EmbedField>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EmbedFooter {
pub text: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub icon_url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EmbedMedia {
pub url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub proxy_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub height: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub width: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EmbedAuthor {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub icon_url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EmbedField {
pub name: String,
pub value: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub inline: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Reaction {
pub count: i32,
pub me: bool,
pub emoji: ReactionEmoji,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReactionEmoji {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}