use super::{Member, Reaction, User};
use crate::serde_for_bitflags;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[cfg(feature = "utoipa")]
use utoipa::ToSchema;
use uuid::Uuid;
#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
#[serde(rename_all = "snake_case")]
pub enum EmbedType {
Rich,
Image,
Video,
Meta,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
pub struct EmbedAuthor {
pub name: String,
pub url: Option<String>,
pub icon_url: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
pub struct EmbedFooter {
pub text: String,
pub icon_url: Option<String>,
}
#[derive(Clone, Copy, Debug, Default, Deserialize, Serialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
#[serde(rename_all = "snake_case")]
pub enum MessageEmbedFieldAlignment {
Left,
Center,
Right,
#[default]
Inline,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
pub struct EmbedField {
pub name: String,
pub value: String,
#[serde(default)]
pub align: MessageEmbedFieldAlignment,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
pub struct Embed {
#[serde(rename = "type")]
pub kind: EmbedType,
pub title: Option<String>,
pub description: Option<String>,
pub url: Option<String>,
#[cfg_attr(feature = "bincode", bincode(with_serde))]
pub timestamp: Option<DateTime<Utc>>,
pub color: Option<u32>,
pub hue: Option<u8>,
pub author: Option<EmbedAuthor>,
pub footer: Option<EmbedFooter>,
pub image: Option<String>,
pub thumbnail: Option<String>,
pub fields: Option<Vec<EmbedField>>,
}
#[derive(Clone, Debug, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
pub struct Attachment {
#[cfg_attr(feature = "bincode", bincode(with_serde))]
#[cfg_attr(feature = "utoipa", schema(format = "uuid", value_type = String))]
pub id: Uuid,
pub filename: String,
pub alt: Option<String>,
pub size: u64,
}
#[derive(Clone, Copy, Debug, Default, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
#[serde(tag = "type", content = "metadata")]
#[serde(rename_all = "snake_case")]
pub enum MessageInfo {
#[default]
Default,
Join {
user_id: u64,
},
Leave {
user_id: u64,
},
Pin {
pinned_message_id: u64,
pinned_by: u64,
},
}
#[derive(Clone, Debug, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
#[serde(untagged)]
pub enum MemberOrUser {
Member(Member),
User(User),
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
pub struct MessageReference {
pub message_id: u64,
pub channel_id: u64,
pub guild_id: Option<u64>,
#[serde(default = "ret_true")]
pub mention_author: bool,
}
#[inline]
const fn ret_true() -> bool {
true
}
#[derive(Clone, Debug, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))]
pub struct Message {
pub id: u64,
pub channel_id: u64,
pub author_id: Option<u64>,
pub author: Option<MemberOrUser>,
#[serde(flatten)]
pub kind: MessageInfo,
pub content: Option<String>,
pub embeds: Vec<Embed>,
pub attachments: Vec<Attachment>,
#[cfg_attr(feature = "bincode", bincode(with_serde))]
pub flags: MessageFlags,
pub reactions: Vec<Reaction>,
pub mentions: Vec<u64>,
#[cfg_attr(feature = "bincode", bincode(with_serde))]
pub edited_at: Option<DateTime<Utc>>,
pub references: Vec<MessageReference>,
}
bitflags::bitflags! {
#[derive(Default)]
pub struct MessageFlags: u32 {
const PINNED = 1 << 0;
const SYSTEM = 1 << 1;
const CROSSPOST = 1 << 2;
const PUBLISHED = 1 << 3;
const EPHEMERAL = 1 << 4;
}
}
serde_for_bitflags!(u32: MessageFlags);