use serenity::builder::{CreateMessage, EditMessage};
use serenity::model::channel::{AttachmentType, ReactionType};
use super::embed::EmbedBuilder;
#[derive(Clone, Debug, Default)]
pub struct MessageBuilder<'a> {
pub content: Option<String>,
pub embed: Option<EmbedBuilder>,
pub files: Vec<AttachmentType<'a>>,
pub reactions: Vec<ReactionType>,
pub tts: bool,
}
impl<'a> MessageBuilder<'a> {
pub fn new() -> Self {
Self::default()
}
pub fn set_content<S: ToString>(&mut self, content: S) -> &mut Self {
self.content = Some(content.to_string());
self
}
pub fn set_embed(&mut self, embed: EmbedBuilder) -> &mut Self {
self.embed = Some(embed);
self
}
pub fn set_embed_with<F>(&mut self, f: F) -> &mut Self
where
F: FnOnce(&mut EmbedBuilder) -> &mut EmbedBuilder,
{
let mut embed = EmbedBuilder::default();
f(&mut embed);
self.set_embed(embed)
}
pub fn add_file<F>(&mut self, file: F) -> &mut Self
where
F: Into<AttachmentType<'a>>,
{
self.files.push(file.into());
self
}
pub fn add_files<T, It>(&mut self, files: It) -> &mut Self
where
T: Into<AttachmentType<'a>>,
It: IntoIterator<Item = T>,
{
self.files.extend(files.into_iter().map(|f| f.into()).collect::<Vec<_>>());
self
}
pub fn set_files<T, It>(&mut self, files: It) -> &mut Self
where
T: Into<AttachmentType<'a>>,
It: IntoIterator<Item = T>,
{
self.files = files.into_iter().map(|f| f.into()).collect();
self
}
pub fn add_reaction<R>(&mut self, reaction: R) -> &mut Self
where
R: Into<ReactionType>,
{
self.reactions.push(reaction.into());
self
}
pub fn add_reactions<R, It>(&mut self, reactions: It) -> &mut Self
where
R: Into<ReactionType>,
It: IntoIterator<Item = R>,
{
self.reactions.extend(reactions.into_iter().map(|r| r.into()).collect::<Vec<_>>());
self
}
pub fn set_reactions<R, It>(&mut self, reactions: It) -> &mut Self
where
R: Into<ReactionType>,
It: IntoIterator<Item = R>,
{
self.reactions = reactions.into_iter().map(|r| r.into()).collect();
self
}
pub fn set_tts(&mut self, tts: bool) -> &mut Self {
self.tts = tts;
self
}
pub fn to_create_message(&self) -> CreateMessage {
self.into()
}
pub fn to_edit_message(&self) -> EditMessage {
self.into()
}
}
impl<'a> From<MessageBuilder<'a>> for CreateMessage<'a> {
fn from(message_builder: MessageBuilder<'a>) -> Self {
let mut message = CreateMessage::default();
if let Some(content) = message_builder.content {
message.content(content);
}
if let Some(embed) = message_builder.embed {
message.embed(|e| {
e.0 = embed.to_create_embed().0;
e
});
}
message.files(message_builder.files);
message.reactions(message_builder.reactions);
message.tts(message_builder.tts);
message
}
}
impl<'a> From<&MessageBuilder<'a>> for CreateMessage<'a> {
fn from(message_builder: &MessageBuilder<'a>) -> Self {
let mut message = CreateMessage::default();
if let Some(content) = &message_builder.content {
message.content(content);
}
if let Some(embed) = &message_builder.embed {
message.embed(|e| {
e.0 = embed.to_create_embed().0;
e
});
}
message.files(message_builder.files.clone());
message.reactions(message_builder.reactions.clone());
message.tts(message_builder.tts);
message
}
}
impl<'a> From<MessageBuilder<'a>> for EditMessage<'_> {
fn from(message_builder: MessageBuilder<'a>) -> Self {
let mut message = EditMessage::default();
if let Some(content) = message_builder.content {
message.content(content);
}
if let Some(embed) = message_builder.embed {
message.embed(|e| {
e.0 = embed.to_create_embed().0;
e
});
}
message
}
}
impl<'a> From<&MessageBuilder<'a>> for EditMessage<'_> {
fn from(message_builder: &MessageBuilder<'a>) -> Self {
let mut message = EditMessage::default();
if let Some(content) = &message_builder.content {
message.content(content);
}
if let Some(embed) = &message_builder.embed {
message.embed(|e| {
e.0 = embed.to_create_embed().0;
e
});
}
message
}
}