From f3a9098ddb71599084f0978815f600cef49cb994 Mon Sep 17 00:00:00 2001 From: "oupson1er@gmail.com" Date: Thu, 18 Mar 2021 20:56:24 +0100 Subject: [PATCH] Working on music --- src/commands/music.rs | 272 +++++++++++++++++++++++++++++++++--------- 1 file changed, 213 insertions(+), 59 deletions(-) diff --git a/src/commands/music.rs b/src/commands/music.rs index 7d9aefa..7445c2e 100644 --- a/src/commands/music.rs +++ b/src/commands/music.rs @@ -45,8 +45,14 @@ impl songbird::EventHandler for TrackStartNotifier { error!("Error sending message: {:?}", why); } } else { - if let Err(why) = self.chan_id.say(&self.http, "Queue finished").await { - error!("Error sending message: {:?}", why); + if let Err(e) = self + .chan_id + .send_message(&self.http, |m| { + embed_response(m, "Queue finished", "", None) + }) + .await + { + error!("Error sending message: {:?}", e); } } } @@ -166,7 +172,7 @@ fn embed_author<'a>(e: &'a mut CreateEmbed, author: Option<&Member>) -> &'a mut } #[group] -#[commands(join, leave, play, stop, next)] +#[commands(join, leave, play, stop, next, pause, resume)] struct Music; #[command] @@ -291,6 +297,7 @@ async fn leave(ctx: &Context, msg: &Message) -> CommandResult { }; let member = msg.member(&ctx.http).await?; + if if let Some(member) = &msg.member { is_mute(ctx, member, guild_id).await.unwrap_or(false) } else { @@ -319,55 +326,30 @@ async fn leave(ctx: &Context, msg: &Message) -> CommandResult { log::error!("Failed to leave : {}", e); msg.channel_id .send_message(&ctx.http, |m| { - embed_response( - m, - "Error", - "Failed to leave", - Some(&member), - ) + embed_response(m, "Error", "Failed to leave", Some(&member)) }) .await?; } msg.channel_id - .send_message(&ctx.http, |m| { - embed_response( - m, - "Left channel", - "", - Some(&member), - ) - }) - .await?; + .send_message(&ctx.http, |m| { + embed_response(m, "Left channel", "", Some(&member)) + }) + .await?; } else { msg.channel_id - .send_message(&ctx.http, |m| { - embed_response( - m, - "Error", - "Not in a voice channel", - Some(&member), - ) - }) - .await?; + .send_message(&ctx.http, |m| { + embed_response(m, "Error", "Not in a voice channel", Some(&member)) + }) + .await?; } Ok(()) } +// TODO FORCE CLEAN FLAG ADMIN #[command] #[description("Play a music (require an url)")] async fn play(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult { - let url = match args.single::() { - Ok(url) => url, - Err(_) => { - msg.channel_id - .say(&ctx.http, "Must provide a URL to a video or audio") - .await?; - - return Ok(()); - } - }; - let guild_id = match ctx.cache.guild_channel(msg.channel_id).await { Some(channel) => channel.guild_id, None => { @@ -379,13 +361,39 @@ async fn play(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult { } }; + let member = msg.member(&ctx.http).await?; + + let url = match args.single::() { + Ok(url) => url, + Err(_) => { + msg.channel_id + .send_message(&ctx.http, |m| { + embed_response( + m, + "Error", + "You must provide an url or a song name", + Some(&member), + ) + }) + .await?; + return Ok(()); + } + }; + if if let Some(member) = &msg.member { is_mute(ctx, member, guild_id).await.unwrap_or(false) } else { false } { msg.channel_id - .say(&ctx.http, "Error, you cant play music") + .send_message(&ctx.http, |m| { + embed_response( + m, + "Error", + "You don't have the right to play music", + Some(&member), + ) + }) .await?; return Ok(()); } @@ -405,7 +413,9 @@ async fn play(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult { error!("Err starting source: {:?}", why); msg.channel_id - .say(&ctx.http, "Error sourcing ffmpeg") + .send_message(&ctx.http, |m| { + embed_response(m, "Error", "Failed to load the song", Some(&member)) + }) .await?; return Ok(()); @@ -418,7 +428,9 @@ async fn play(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult { error!("Err starting source: {:?}", why); msg.channel_id - .say(&ctx.http, "Error sourcing ffmpeg") + .send_message(&ctx.http, |m| { + embed_response(m, "Error", "Failed to load the song", Some(&member)) + }) .await?; return Ok(()); @@ -442,7 +454,9 @@ async fn play(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult { .await?; } else { msg.channel_id - .say(&ctx.http, "Not in a voice channel to play in") + .send_message(&ctx.http, |m| { + embed_response(m, "Error", "Not in a voice channel", Some(&member)) + }) .await?; } @@ -463,13 +477,22 @@ async fn next(ctx: &Context, msg: &Message) -> CommandResult { } }; + let member = msg.member(&ctx.http).await?; + if if let Some(member) = &msg.member { is_mute(ctx, member, guild_id).await.unwrap_or(false) } else { false } { msg.channel_id - .say(&ctx.http, "Error, you cant play music") + .send_message(&ctx.http, |m| { + embed_response( + m, + "Error", + "You don't have the right to play music", + Some(&member), + ) + }) .await?; return Ok(()); } @@ -484,27 +507,29 @@ async fn next(ctx: &Context, msg: &Message) -> CommandResult { let queue = handler.queue(); - if let Some(current) = queue.current() { - let metadata = current.metadata(); - log::debug!("Metadata : {:?}", metadata); - } - let current_queue = queue.current_queue(); let next = current_queue.get(1); queue.skip()?; if let Some(current) = next { let metadata = current.metadata(); - log::debug!("{:?}", metadata); - - if let Some(title) = &metadata.title { - msg.channel_id - .say(&ctx.http, format!("Playing {}", title)) - .await?; - } + msg.channel_id + .send_message(&ctx.http, |m| { + embed_song(m, metadata, Some(&member)); + m + }) + .await?; + } else { + msg.channel_id + .send_message(&ctx.http, |m| embed_response(m, "Queue finished", "", None)) + .await?; } } else { - msg.reply(ctx, "Not in a voice channel").await?; + msg.channel_id + .send_message(&ctx.http, |m| { + embed_response(m, "Error", "Not in a voice channel", Some(&member)) + }) + .await?; } Ok(()) @@ -524,13 +549,22 @@ async fn stop(ctx: &Context, msg: &Message) -> CommandResult { } }; + let member = msg.member(&ctx.http).await?; + if if let Some(member) = &msg.member { is_mute(ctx, member, guild_id).await.unwrap_or(false) } else { false } { msg.channel_id - .say(&ctx.http, "Error, you cant play music") + .send_message(&ctx.http, |m| { + embed_response( + m, + "Error", + "You don't have the right to play music", + Some(&member), + ) + }) .await?; return Ok(()); } @@ -544,9 +578,129 @@ async fn stop(ctx: &Context, msg: &Message) -> CommandResult { let handler = handler.lock().await; handler.queue().stop(); - msg.channel_id.say(&ctx.http, "Stopping").await?; + msg.channel_id + .send_message(&ctx.http, |m| { + embed_response(m, "Stopped the queue", "", Some(&member)) + }) + .await?; } else { - msg.reply(ctx, "Not in a voice channel").await?; + msg.channel_id + .send_message(&ctx.http, |m| { + embed_response(m, "Error", "Not in a voice channel", Some(&member)) + }) + .await?; + } + + Ok(()) +} + +#[command] +#[description("Pause the music")] +async fn pause(ctx: &Context, msg: &Message) -> CommandResult { + let guild_id = match ctx.cache.guild_channel(msg.channel_id).await { + Some(channel) => channel.guild_id, + None => { + msg.channel_id + .say(&ctx.http, "Error finding channel info") + .await?; + + return Ok(()); + } + }; + + let member = msg.member(&ctx.http).await?; + + if if let Some(member) = &msg.member { + is_mute(ctx, member, guild_id).await.unwrap_or(false) + } else { + false + } { + msg.channel_id + .send_message(&ctx.http, |m| { + embed_response( + m, + "Error", + "You don't have the right to play music", + Some(&member), + ) + }) + .await?; + return Ok(()); + } + + let manager = songbird::get(ctx) + .await + .expect("Songbird Voice client placed in at initialisation.") + .clone(); + + if let Some(handler) = manager.get(guild_id) { + let handler = handler.lock().await; + handler.queue().pause()?; + + msg.channel_id + .send_message(&ctx.http, |m| { + embed_response(m, "Paused the player", "", Some(&member)) + }) + .await?; + } else { + msg.channel_id + .send_message(&ctx.http, |m| { + embed_response(m, "Error", "Not in a voice channel", Some(&member)) + }) + .await?; + } + + Ok(()) +} + +#[command] +#[description("Resume the music")] +async fn resume(ctx: &Context, msg: &Message) -> CommandResult { + let guild_id = match ctx.cache.guild_channel(msg.channel_id).await { + Some(channel) => channel.guild_id, + None => { + msg.channel_id + .say(&ctx.http, "Error finding channel info") + .await?; + + return Ok(()); + } + }; + + let member = msg.member(&ctx.http).await?; + + if if let Some(member) = &msg.member { + is_mute(ctx, member, guild_id).await.unwrap_or(false) + } else { + false + } { + msg.channel_id + .send_message(&ctx.http, |m| { + embed_response( + m, + "Error", + "You don't have the right to play music", + Some(&member), + ) + }) + .await?; + return Ok(()); + } + + let manager = songbird::get(ctx) + .await + .expect("Songbird Voice client placed in at initialisation.") + .clone(); + + if let Some(handler) = manager.get(guild_id) { + let handler = handler.lock().await; + handler.queue().resume()?; + } else { + msg.channel_id + .send_message(&ctx.http, |m| { + embed_response(m, "Error", "Not in a voice channel", Some(&member)) + }) + .await?; } Ok(())