use crate::{initialize_field, new, override_field};
use serde::Serialize;
#[derive(Default, Serialize, Clone)]
pub struct DiscordMessage {
pub content: String,
pub username: Option<String>,
pub avatar_url: Option<String>,
pub tts: Option<bool>,
pub embeds: Option<Vec<DiscordEmbed>>,
pub allowed_mentions: Option<DiscordAllowedMentions>,
pub components: Option<Vec<DiscordMessageComponent>>,
}
impl DiscordMessage {
new!();
initialize_field!(content, String);
override_field!(username, String);
override_field!(avatar_url, String);
override_field!(tts, bool);
override_field!(embeds, Vec<DiscordEmbed>);
override_field!(allowed_mentions, DiscordAllowedMentions);
override_field!(components, Vec<DiscordMessageComponent>);
}
#[derive(Default, Serialize, Clone)]
pub struct DiscordEmbed {
pub title: Option<String>,
pub r#type: DiscordEmbedType,
pub description: Option<String>,
pub url: Option<String>,
pub color: Option<i64>,
pub footer: Option<DiscordFooterEmbed>,
pub image: Option<DiscordImageEmbed>,
pub thumbnail: Option<DiscordImageEmbed>,
pub video: Option<DiscordImageEmbed>,
pub provider: Option<DiscordProviderEmbed>,
pub fields: Option<Vec<DiscordFieldEmbed>>,
pub author: Option<DiscordAuthorEmbed>,
}
impl DiscordEmbed {
new!();
override_field!(title, String);
override_field!(description, String);
override_field!(url, String);
override_field!(footer, DiscordFooterEmbed);
override_field!(image, DiscordImageEmbed);
override_field!(thumbnail, DiscordImageEmbed);
override_field!(video, DiscordImageEmbed);
override_field!(provider, DiscordProviderEmbed);
override_field!(fields, Vec<DiscordFieldEmbed>);
override_field!(author, DiscordAuthorEmbed);
initialize_field!(r#type, DiscordEmbedType);
pub fn color(mut self, color: &str) -> Self {
let parsed_color: i64 = i64::from_str_radix(color, 16).expect("Unable to parse color code");
self.color = Some(parsed_color);
self
}
}
#[derive(Default, Serialize, Clone)]
pub enum DiscordEmbedType {
#[default]
Rich,
Image,
Video,
GIFV,
Article,
Link,
}
#[derive(Default, Serialize, Clone)]
pub struct DiscordFooterEmbed {
pub text: String,
pub icon_url: Option<String>,
pub proxy_icon_url: Option<String>,
}
impl DiscordFooterEmbed {
new!();
initialize_field!(text, String);
override_field!(icon_url, String);
override_field!(proxy_icon_url, String);
}
#[derive(Default, Serialize, Clone)]
pub struct DiscordFieldEmbed {
pub name: String,
pub value: String,
pub inline: Option<bool>,
}
impl DiscordFieldEmbed {
new!();
initialize_field!(name, String);
initialize_field!(value, String);
override_field!(inline, bool);
}
#[derive(Default, Serialize, Clone)]
pub struct DiscordImageEmbed {
pub url: String,
pub proxy_url: Option<String>,
pub height: Option<i64>,
pub width: Option<i64>,
}
impl DiscordImageEmbed {
new!();
initialize_field!(url, String);
override_field!(proxy_url, String);
override_field!(height, i64);
override_field!(width, i64);
}
#[derive(Default, Serialize, Clone)]
pub struct DiscordProviderEmbed {
pub name: Option<String>,
pub url: Option<String>,
}
impl DiscordProviderEmbed {
new!();
override_field!(name, String);
override_field!(url, String);
}
#[derive(Default, Serialize, Clone)]
pub struct DiscordAuthorEmbed {
pub name: String,
pub url: Option<String>,
pub icon_url: Option<String>,
pub proxy_icon_url: Option<String>,
}
impl DiscordAuthorEmbed {
new!();
initialize_field!(name, String);
override_field!(url, String);
override_field!(icon_url, String);
override_field!(proxy_icon_url, String);
}
#[derive(Default, Serialize, Clone)]
pub struct DiscordAllowedMentions {
pub parse: Option<Vec<DiscordAllowedMentionTypes>>,
pub roles: Option<Vec<String>>,
pub users: Option<Vec<String>>,
pub replied_user: bool,
}
impl DiscordAllowedMentions {
new!();
override_field!(parse, Vec<DiscordAllowedMentionTypes>);
override_field!(roles, Vec<String>);
override_field!(users, Vec<String>);
initialize_field!(replied_user, bool);
}
#[derive(Serialize, Clone)]
pub enum DiscordAllowedMentionTypes {
Roles,
Users,
Everyone,
}
#[derive(Default, Serialize, Clone)]
pub struct DiscordMessageComponent {
pub r#type: u8,
pub label: Option<String>,
pub style: Option<String>,
pub custom_id: Option<String>,
pub components: Option<Vec<DiscordMessageComponent>>,
}
impl DiscordMessageComponent {
new!();
override_field!(label, String);
override_field!(style, String);
override_field!(custom_id, String);
override_field!(components, Vec<DiscordMessageComponent>);
pub fn r#type(mut self, r#type: DiscordMessageComponentTypes) -> Self {
self.r#type = r#type as u8;
self
}
}
#[derive(Default, Serialize)]
pub enum DiscordMessageComponentTypes {
ActionRow = 1,
#[default]
Button = 2,
StringSelect = 3,
TextInput = 4,
UserSelect = 5,
RoleSelect = 6,
MentionableSelect = 7,
ChannelSelect = 8,
}