CreateMessageExt

This commit is contained in:
oupson 2021-06-20 16:30:12 +02:00
parent 35ef3832de
commit b21fcc65f3
2 changed files with 96 additions and 53 deletions

View File

@ -19,7 +19,7 @@ mod utils;
mod youtube; mod youtube;
use crate::utils::{message::embed_response, permissions::has_permission}; use crate::utils::{message::embed_response, permissions::has_permission};
use utils::embed_song; use utils::CreateMessageExt;
use self::utils::{can_use_voice_command, is_mute}; use self::utils::{can_use_voice_command, is_mute};
@ -38,10 +38,7 @@ impl songbird::EventHandler for TrackStartNotifier {
let metadata = np.metadata(); let metadata = np.metadata();
if let Err(why) = self if let Err(why) = self
.chan_id .chan_id
.send_message(&self.http, |m| { .send_message(&self.http, |m| m.embed_song("Now playing", metadata, None))
embed_song(m, "Now playing", metadata, None);
m
})
.await .await
{ {
error!("Error sending message: {:?}", why); error!("Error sending message: {:?}", why);
@ -67,6 +64,7 @@ struct Music;
#[command] #[command]
#[description("Join the channel you are connected")] #[description("Join the channel you are connected")]
#[aliases("j")]
async fn join(ctx: &Context, msg: &Message) -> CommandResult { async fn join(ctx: &Context, msg: &Message) -> CommandResult {
let guild = match msg.guild(&ctx.cache).await { let guild = match msg.guild(&ctx.cache).await {
Some(guild) => guild, Some(guild) => guild,
@ -154,6 +152,7 @@ async fn join(ctx: &Context, msg: &Message) -> CommandResult {
&format!("Joined channel {}", connect_to.mention()), &format!("Joined channel {}", connect_to.mention()),
Some(&member), Some(&member),
) )
.add_music_buttons()
}) })
.await?; .await?;
} else { } else {
@ -441,8 +440,7 @@ async fn play(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult {
let author = msg.member(&ctx).await?; let author = msg.member(&ctx).await?;
msg.channel_id msg.channel_id
.send_message(&ctx.http, |m| { .send_message(&ctx.http, |m| {
embed_song( m.embed_song(
m,
if handler.queue().len() == 1 { if handler.queue().len() == 1 {
"Now playing" "Now playing"
} else { } else {
@ -715,7 +713,7 @@ async fn remove(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult {
handler.queue().skip()?; handler.queue().skip()?;
msg.channel_id msg.channel_id
.send_message(&ctx.http, |m| { .send_message(&ctx.http, |m| {
embed_song(m, "Removed", track.metadata(), Some(&member)) m.embed_song("Removed", track.metadata(), Some(&member))
}) })
.await?; .await?;
} }
@ -732,7 +730,7 @@ async fn remove(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult {
Some(q) => { Some(q) => {
msg.channel_id msg.channel_id
.send_message(&ctx.http, |m| { .send_message(&ctx.http, |m| {
embed_song(m, "Removed", q.metadata(), Some(&member)) m.embed_song("Removed", q.metadata(), Some(&member))
}) })
.await?; .await?;
} }

View File

@ -3,9 +3,10 @@ use serenity::{
client::Context, client::Context,
framework::standard::CommandResult, framework::standard::CommandResult,
model::{ model::{
channel::Message, channel::{Message, ReactionType},
guild::{Member, PartialMember}, guild::{Member, PartialMember},
id::GuildId, id::GuildId,
interactions::ButtonStyle,
Permissions, Permissions,
}, },
}; };
@ -18,49 +19,6 @@ use crate::{
use super::error::UseVoiceError; use super::error::UseVoiceError;
pub(crate) fn embed_song<'a, 'b>(
msg: &'a mut CreateMessage<'b>,
title: &str,
metadata: &Metadata,
author: Option<&Member>,
) -> &'a mut CreateMessage<'b> {
msg.embed(|e| {
e.title(title);
if let Some(title) = &metadata.title {
e.field("Title", title, true);
}
if let Some(url) = &metadata.source_url {
e.url(url);
}
if let Some(duration) = &metadata.duration {
let seconds = duration.as_secs();
let hours = seconds / (60 * 60);
let min = (seconds - (hours * 60 * 60)) / 60;
let seconds = seconds - (hours * 3600) - (min * 60);
e.field(
"Duration",
if hours > 0 {
format!("{}:{:02}:{:02}", hours, min, seconds)
} else {
format!("{}:{:02}", min, seconds)
},
false,
);
}
if let Some(img) = &metadata.thumbnail {
e.image(img);
}
embed_author(e, author).colour((247, 76, 0))
})
}
pub(crate) async fn is_mute( pub(crate) async fn is_mute(
ctx: &Context, ctx: &Context,
member: &PartialMember, member: &PartialMember,
@ -121,3 +79,90 @@ pub(crate) async fn can_use_voice_command(
Err(UseVoiceError::Unknown) Err(UseVoiceError::Unknown)
} }
} }
pub(crate) trait CreateMessageExt {
fn embed_song(
&mut self,
title: &str,
metadata: &Metadata,
author: Option<&Member>,
) -> &mut Self;
fn add_music_buttons(&mut self) -> &mut Self;
}
impl<'a> CreateMessageExt for CreateMessage<'a> {
fn embed_song<'b>(
&'b mut self,
title: &str,
metadata: &Metadata,
author: Option<&Member>,
) -> &'b mut CreateMessage<'a> {
self.embed(|e| {
e.title(title);
if let Some(title) = &metadata.title {
e.field("Title", title, true);
}
if let Some(url) = &metadata.source_url {
e.url(url);
}
if let Some(duration) = &metadata.duration {
let seconds = duration.as_secs();
let hours = seconds / (60 * 60);
let min = (seconds - (hours * 60 * 60)) / 60;
let seconds = seconds - (hours * 3600) - (min * 60);
e.field(
"Duration",
if hours > 0 {
format!("{}:{:02}:{:02}", hours, min, seconds)
} else {
format!("{}:{:02}", min, seconds)
},
false,
);
}
if let Some(img) = &metadata.thumbnail {
e.image(img);
}
embed_author(e, author).colour((247, 76, 0))
})
}
fn add_music_buttons<'b>(&'b mut self) -> &'b mut Self {
self.components(|comp| {
comp.create_action_row(|row| {
row.create_button(|but| {
but.style(ButtonStyle::Primary)
.emoji(ReactionType::Unicode("⏮️".to_string()))
.custom_id("music_previous_button")
})
.create_button(|but| {
but.style(ButtonStyle::Primary)
.emoji(ReactionType::Unicode("⏹️".to_string()))
.custom_id("music_stop_button")
})
.create_button(|but| {
but.style(ButtonStyle::Primary)
.emoji(ReactionType::Unicode("⏯️".to_string()))
.custom_id("music_play_pause_button")
})
.create_button(|but| {
but.style(ButtonStyle::Primary)
.emoji(ReactionType::Unicode("⏏️".to_string()))
.custom_id("music_leave_button")
})
.create_button(|but| {
but.style(ButtonStyle::Primary)
.emoji(ReactionType::Unicode("".to_string()))
.custom_id("music_next_button")
})
})
})
}
}