diff --git a/.idea/dataSources.local.xml b/.idea/dataSources.local.xml index ac78098..874735f 100644 --- a/.idea/dataSources.local.xml +++ b/.idea/dataSources.local.xml @@ -1,6 +1,6 @@ - + master_key diff --git a/Cargo.toml b/Cargo.toml index b1f9e7c..3b3579d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,7 +30,10 @@ suggests = "mysql-server-8.0" maintainer-scripts = "debian" assets = [ ["target/release/soundfx-rs", "usr/bin/soundfx-rs", "755"], - ["conf/default.env", "etc/soundfx-rs/default.env", "600"] + ["conf/default.env", "etc/soundfx-rs/config.env", "600"] +] +conf-files = [ + "/etc/soundfx-rs/config.env", ] [package.metadata.deb.systemd-units] diff --git a/debian/postinst b/debian/postinst index d4f0aef..f979ef3 100755 --- a/debian/postinst +++ b/debian/postinst @@ -4,10 +4,6 @@ set -e id -u soundfx &>/dev/null || useradd -r -M soundfx -if [ ! -f /etc/soundfx-rs/config.env ]; then - cp /etc/soundfx-rs/default.env /etc/soundfx-rs/config.env -fi - chown soundfx /etc/soundfx-rs/config.env #DEBHELPER# diff --git a/debian/postrm b/debian/postrm index a7831f7..cf51e87 100644 --- a/debian/postrm +++ b/debian/postrm @@ -4,8 +4,4 @@ set -e id -u soundfx &>/dev/null || userdel soundfx -if [ -f /etc/soundfx-rs/config.env ]; then - rm /etc/soundfx-rs/config.env -fi - #DEBHELPER# diff --git a/src/cmds/play.rs b/src/cmds/play.rs index 5fe04de..dc627e4 100644 --- a/src/cmds/play.rs +++ b/src/cmds/play.rs @@ -1,5 +1,6 @@ use poise::serenity_prelude::{ builder::CreateActionRow, model::application::component::ButtonStyle, GuildChannel, + ReactionType, }; use crate::{ @@ -372,7 +373,33 @@ pub async fn soundboard( c.add_action_row(action_row); } - c + c.create_action_row(|r| { + r.create_button(|b| { + b.label("Stop") + .emoji(ReactionType::Unicode("⏹".to_string())) + .style(ButtonStyle::Danger) + .custom_id("#stop") + }) + .create_button(|b| { + b.label("Mode:") + .style(ButtonStyle::Secondary) + .disabled(true) + .custom_id("#mode") + }) + .create_button(|b| { + b.label("Instant") + .emoji(ReactionType::Unicode("▶".to_string())) + .style(ButtonStyle::Secondary) + .disabled(true) + .custom_id("#instant") + }) + .create_button(|b| { + b.label("Loop") + .emoji(ReactionType::Unicode("🔁".to_string())) + .style(ButtonStyle::Secondary) + .custom_id("#loop") + }) + }) }) }) .await?; diff --git a/src/event_handlers.rs b/src/event_handlers.rs index bcdf4ff..4f6fcac 100644 --- a/src/event_handlers.rs +++ b/src/event_handlers.rs @@ -6,7 +6,7 @@ use poise::serenity_prelude::{ channel::Channel, }, utils::shard_id, - Activity, Context, + ActionRowComponent, Activity, Context, CreateActionRow, CreateComponents, }; use crate::{ @@ -137,23 +137,118 @@ SELECT name, id, public, server_id, uploader_id if let Some(guild_id) = component.guild_id { if let Ok(()) = SoundPager::handle_interaction(ctx, &data, component).await { } else { - component - .create_interaction_response(ctx, |r| { - r.kind(InteractionResponseType::DeferredUpdateMessage) - }) - .await - .unwrap(); + let mode = component.data.custom_id.as_str(); + match mode { + "#stop" => { + component + .create_interaction_response(ctx, |r| { + r.kind(InteractionResponseType::DeferredUpdateMessage) + }) + .await + .unwrap(); - play_from_query( - &ctx, - &data, - guild_id.to_guild_cached(&ctx).unwrap(), - component.user.id, - None, - &component.data.custom_id, - false, - ) - .await; + let songbird = songbird::get(ctx).await.unwrap(); + let call_opt = songbird.get(guild_id); + + if let Some(call) = call_opt { + let mut lock = call.lock().await; + + lock.stop(); + } + } + + "#loop" | "#queue" | "#instant" => { + component + .create_interaction_response(ctx, |r| { + r.kind(InteractionResponseType::UpdateMessage) + .interaction_response_data(|d| { + let mut c: CreateComponents = Default::default(); + + for action_row in &component.message.components { + let mut a: CreateActionRow = Default::default(); + // These are always buttons + for component in &action_row.components { + match component { + ActionRowComponent::Button(button) => { + a.create_button(|b| { + if let Some(label) = + &button.label + { + b.label(label); + } + if let Some(emoji) = + &button.emoji + { + b.emoji(emoji.clone()); + } + if let Some(custom_id) = + &button.custom_id + { + if custom_id + .starts_with('#') + { + b.custom_id(custom_id) + .disabled( + custom_id + == "#mode" + || custom_id + == mode, + ); + } else { + b.custom_id(format!( + "{}{}", + custom_id + .split('#') + .next() + .unwrap(), + mode + )); + } + } + + b.style(button.style); + + b + }); + } + _ => {} + } + } + + c.add_action_row(a); + } + + d.set_components(c) + }) + }) + .await + .unwrap(); + } + + id_mode => { + component + .create_interaction_response(ctx, |r| { + r.kind(InteractionResponseType::DeferredUpdateMessage) + }) + .await + .unwrap(); + + let mut it = id_mode.split('#'); + let id = it.next().unwrap(); + let mode = it.next().unwrap_or("instant"); + + play_from_query( + &ctx, + &data, + guild_id.to_guild_cached(&ctx).unwrap(), + component.user.id, + None, + id.split('#').next().unwrap(), + mode == "loop", + ) + .await; + } + } } } }