diff --git a/src/commands/music/equalize.rs b/src/commands/music/equalize.rs new file mode 100644 index 0000000..c338984 --- /dev/null +++ b/src/commands/music/equalize.rs @@ -0,0 +1,62 @@ +use serenity::framework::standard::macros::command; +use serenity::framework::standard::{Args, CommandError, CommandResult}; +use serenity::model::channel::Message; +use serenity::prelude::*; + +use crate::commands::common::handle_autodelete; +use crate::commands::music::{get_music_player_for_guild, DJ_CHECK}; +use crate::messages::music::no_voicechannel::create_no_voicechannel_message; +use bot_serenityutils::core::{MEDIUM_TIMEOUT, SHORT_TIMEOUT}; +use bot_serenityutils::ephemeral_message::EphemeralMessage; + +#[command] +#[only_in(guilds)] +#[description("Loads an equalizer preset")] +#[usage("")] +#[num_args(1)] +#[example("bass")] +#[bucket("general")] +#[checks(DJ)] +async fn equalize(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult { + let guild = msg.guild(&ctx.cache).await.unwrap(); + log::debug!("Changing equalizer for {}", guild.id); + let preset = args.single::().unwrap(); + + let player = if let Some(player) = get_music_player_for_guild(ctx, guild.id).await { + player + } else { + return create_no_voicechannel_message(&ctx.http, msg.channel_id) + .await + .map_err(CommandError::from); + }; + + let bands = match preset.to_lowercase().as_str() { + "metal" => lavalink_rs::EQ_METAL, + "boost" => lavalink_rs::EQ_BOOST, + "base" => lavalink_rs::EQ_BASE, + "piano" => lavalink_rs::EQ_PIANO, + _ => { + EphemeralMessage::create(&ctx.http, msg.channel_id, MEDIUM_TIMEOUT, |m| { + m.content(format!( + "Unknown preset '{}'. Available are 'metal', 'boost', 'base' and 'piano'", + preset + )) + }) + .await?; + handle_autodelete(ctx, msg).await?; + return Ok(()); + } + }; + { + let mut player = player.lock().await; + player.equalize_all(bands).await?; + } + EphemeralMessage::create(&ctx.http, msg.channel_id, SHORT_TIMEOUT, |m| { + m.content(format!("🎛️ Changed equalizer to '{}'", preset)) + }) + .await?; + + handle_autodelete(ctx, msg).await?; + + Ok(()) +} diff --git a/src/commands/music/equalizer.rs b/src/commands/music/equalizer.rs index 9b34f1a..3f68c36 100644 --- a/src/commands/music/equalizer.rs +++ b/src/commands/music/equalizer.rs @@ -16,7 +16,7 @@ use crate::messages::music::no_voicechannel::create_no_voicechannel_message; #[checks(DJ)] async fn equalizer(ctx: &Context, msg: &Message) -> CommandResult { let guild = msg.guild(&ctx.cache).await.unwrap(); - log::debug!("Pausing playback for guild {}", guild.id); + log::debug!("Displaying equalizer for guild {}", guild.id); let player = if let Some(player) = get_music_player_for_guild(ctx, guild.id).await { player diff --git a/src/commands/music/mod.rs b/src/commands/music/mod.rs index 7bc7a9e..63bb3ea 100644 --- a/src/commands/music/mod.rs +++ b/src/commands/music/mod.rs @@ -25,6 +25,7 @@ use youtube_metadata::get_video_information; mod clear_queue; mod current; +mod equalize; mod equalizer; mod join; mod leave; @@ -42,6 +43,7 @@ mod skip; use clear_queue::CLEAR_QUEUE_COMMAND; use current::CURRENT_COMMAND; +use equalize::EQUALIZE_COMMAND; use equalizer::EQUALIZER_COMMAND; use join::JOIN_COMMAND; use leave::LEAVE_COMMAND; @@ -74,7 +76,8 @@ use skip::SKIP_COMMAND; lyrics, move_song, remove_song, - equalizer + equalizer, + equalize )] pub struct Music; diff --git a/src/providers/music/player.rs b/src/providers/music/player.rs index 46ff887..ae7db45 100644 --- a/src/providers/music/player.rs +++ b/src/providers/music/player.rs @@ -255,6 +255,16 @@ impl MusicPlayer { Ok(()) } + + /// Equalizes all bands at the same time + pub async fn equalize_all(&mut self, bands: [f64; 15]) -> BotResult<()> { + self.equalizer = bands; + self.client + .equalize_all(self.guild_id, self.equalizer) + .await?; + + Ok(()) + } } /// Stats a tokio coroutine to check for player disconnect conditions