use super::{Member, User};
use crate::serde_for_bitflags;
use chrono::{DateTime, Utc};
#[cfg(feature = "client")]
use serde::Deserialize;
use serde::Serialize;
#[cfg(feature = "openapi")]
use utoipa::ToSchema;
#[derive(Clone, Copy, Debug, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
#[serde(rename_all = "snake_case")]
pub enum EmbedType {
Rich,
Image,
Video,
Meta,
}
#[derive(Clone, Debug, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct EmbedAuthor {
pub name: String,
pub url: Option<String>,
pub icon_url: Option<String>,
}
#[derive(Clone, Debug, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct EmbedFooter {
pub text: String,
pub icon_url: Option<String>,
}
#[derive(Clone, Copy, Debug, Default, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
#[serde(rename_all = "snake_case")]
pub enum MessageEmbedFieldAlignment {
Left,
Center,
Right,
#[default]
Inline,
}
#[derive(Clone, Debug, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct EmbedField {
pub name: String,
pub value: String,
#[serde(default)]
pub align: MessageEmbedFieldAlignment,
}
#[derive(Clone, Debug, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct Embed {
#[serde(rename = "type")]
pub kind: EmbedType,
pub title: Option<String>,
pub description: Option<String>,
pub url: Option<String>,
pub timestamp: Option<DateTime<Utc>>,
pub color: Option<u32>,
pub hue: Option<u8>,
pub author: EmbedAuthor,
pub footer: 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 = "openapi", derive(ToSchema))]
pub struct Attachment {
pub id: u64,
pub filename: String,
pub description: Option<String>,
pub size: u64,
pub url: String,
}
#[derive(Clone, Copy, Debug, Default, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
#[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 = "openapi", derive(ToSchema))]
#[serde(untagged)]
pub enum MemberOrUser {
Member(Member),
User(User),
}
#[derive(Clone, Debug, Serialize)]
#[cfg_attr(feature = "client", derive(Deserialize))]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct Message {
pub id: u64,
pub revision_id: Option<u64>,
pub channel_id: u64,
pub guild_id: Option<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>,
pub flags: MessageFlags,
pub stars: u32,
pub nonce: Option<String>,
}
bitflags::bitflags! {
#[derive(Default)]
pub struct MessageFlags: u32 {
const PINNED = 1 << 0;
const SYSTEM = 1 << 1;
const CROSSPOST = 1 << 2;
const PUBLISHED = 1 << 3;
}
}
serde_for_bitflags!(u32: MessageFlags);