Added pause, play, resume, skip, and stop
This commit is contained in:
@@ -0,0 +1,43 @@
|
|||||||
|
use log::{debug, error};
|
||||||
|
|
||||||
|
use serenity::prelude::*;
|
||||||
|
use serenity::builder::CreateApplicationCommand;
|
||||||
|
use serenity::model::application::interaction::application_command::ApplicationCommandInteraction;
|
||||||
|
|
||||||
|
use super::{get_songbird, create_response, edit_response};
|
||||||
|
|
||||||
|
pub async fn run(ctx: &Context, command: &ApplicationCommandInteraction) {
|
||||||
|
// Create the initial response
|
||||||
|
if let Err(why) = create_response(&ctx, &command, "Processing command...".to_string()).await {
|
||||||
|
error!("Failed to create response message: {}", why);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let guild_id = match command.guild_id {
|
||||||
|
Some(g) => g,
|
||||||
|
None => {
|
||||||
|
if let Err(why) = edit_response(&ctx, &command, "Unable to join voice channel".to_string()).await {
|
||||||
|
error!("Failed to edit response message: {}", why);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let manager = get_songbird(ctx).await;
|
||||||
|
if let Some(handler_lock) = manager.get(guild_id) {
|
||||||
|
let handler = handler_lock.lock().await;
|
||||||
|
if let Err(err) = handler.queue().pause() {
|
||||||
|
if let Err(why) = edit_response(&ctx, &command, format!("Failed to pause: {}", err)).await {
|
||||||
|
error!("Failed to edit response message: {}", why);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
debug!("Paused the track");
|
||||||
|
if let Err(why) = edit_response(&ctx, &command, format!("Pausing the track")).await {
|
||||||
|
error!("Failed to edit response message: {}", why);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn register(command: &mut CreateApplicationCommand) -> &mut CreateApplicationCommand {
|
||||||
|
command.name("pause").description("Pause the current track")
|
||||||
|
}
|
||||||
@@ -74,7 +74,7 @@ pub async fn run(ctx: &Context, command: &ApplicationCommandInteraction) {
|
|||||||
}
|
}
|
||||||
let mut handler = handler_lock.lock().await;
|
let mut handler = handler_lock.lock().await;
|
||||||
handler.remove_all_global_events();
|
handler.remove_all_global_events();
|
||||||
handler.add_global_event(songbird::Event::Track(songbird::TrackEvent::End), InactiveHandler { guild_id, call: manager })
|
handler.add_global_event(songbird::Event::Track(songbird::TrackEvent::End), TrackEndNotifier { guild_id, call: manager })
|
||||||
}
|
}
|
||||||
Err(why) => {
|
Err(why) => {
|
||||||
warn!("Failed to add song: {}", why);
|
warn!("Failed to add song: {}", why);
|
||||||
@@ -107,19 +107,19 @@ pub fn register(command: &mut CreateApplicationCommand) -> &mut CreateApplicatio
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
struct InactiveHandler {
|
struct TrackEndNotifier {
|
||||||
pub call: std::sync::Arc<songbird::Songbird>,
|
pub call: std::sync::Arc<songbird::Songbird>,
|
||||||
pub guild_id: serenity::model::id::GuildId
|
pub guild_id: serenity::model::id::GuildId
|
||||||
}
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl EventHandler for InactiveHandler {
|
impl EventHandler for TrackEndNotifier {
|
||||||
async fn act(&self, ctx: &songbird::events::EventContext<'_>) -> Option<songbird::events::Event> {
|
async fn act(&self, ctx: &songbird::events::EventContext<'_>) -> Option<songbird::events::Event> {
|
||||||
if let songbird::EventContext::Track(track_list) = ctx {
|
if let songbird::EventContext::Track(_track_list) = ctx {
|
||||||
if track_list.is_empty() {
|
|
||||||
if let Some(call) = self.call.get(self.guild_id) {
|
if let Some(call) = self.call.get(self.guild_id) {
|
||||||
debug!("Track list is empty; leaving voice channel");
|
|
||||||
let mut handler = call.lock().await;
|
let mut handler = call.lock().await;
|
||||||
|
if handler.queue().is_empty() {
|
||||||
|
debug!("Queue is empty, leaving voice channel");
|
||||||
handler.leave().await.unwrap();
|
handler.leave().await.unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
use log::{debug, error};
|
||||||
|
|
||||||
|
use serenity::prelude::*;
|
||||||
|
use serenity::builder::CreateApplicationCommand;
|
||||||
|
use serenity::model::application::interaction::application_command::ApplicationCommandInteraction;
|
||||||
|
|
||||||
|
use super::{get_songbird, create_response, edit_response};
|
||||||
|
|
||||||
|
pub async fn run(ctx: &Context, command: &ApplicationCommandInteraction) {
|
||||||
|
// Create the initial response
|
||||||
|
if let Err(why) = create_response(&ctx, &command, "Processing command...".to_string()).await {
|
||||||
|
error!("Failed to create response message: {}", why);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let guild_id = match command.guild_id {
|
||||||
|
Some(g) => g,
|
||||||
|
None => {
|
||||||
|
if let Err(why) = edit_response(&ctx, &command, "Unable to join voice channel".to_string()).await {
|
||||||
|
error!("Failed to edit response message: {}", why);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let manager = get_songbird(ctx).await;
|
||||||
|
if let Some(handler_lock) = manager.get(guild_id) {
|
||||||
|
let handler = handler_lock.lock().await;
|
||||||
|
if let Err(err) = handler.queue().resume() {
|
||||||
|
if let Err(why) = edit_response(&ctx, &command, format!("Failed to resume: {}", err)).await {
|
||||||
|
error!("Failed to edit response message: {}", why);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
debug!("Resumed the track");
|
||||||
|
if let Err(why) = edit_response(&ctx, &command, format!("Resuming the track")).await {
|
||||||
|
error!("Failed to edit response message: {}", why);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn register(command: &mut CreateApplicationCommand) -> &mut CreateApplicationCommand {
|
||||||
|
command.name("resume").description("Resume the current track")
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
use log::{debug, error};
|
||||||
|
|
||||||
|
use serenity::prelude::*;
|
||||||
|
use serenity::builder::CreateApplicationCommand;
|
||||||
|
use serenity::model::application::interaction::application_command::ApplicationCommandInteraction;
|
||||||
|
|
||||||
|
use super::{get_songbird, create_response, edit_response};
|
||||||
|
|
||||||
|
pub async fn run(ctx: &Context, command: &ApplicationCommandInteraction) {
|
||||||
|
// Create the initial response
|
||||||
|
if let Err(why) = create_response(&ctx, &command, "Processing command...".to_string()).await {
|
||||||
|
error!("Failed to create response message: {}", why);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let guild_id = match command.guild_id {
|
||||||
|
Some(g) => g,
|
||||||
|
None => {
|
||||||
|
if let Err(why) = edit_response(&ctx, &command, "Unable to join voice channel".to_string()).await {
|
||||||
|
error!("Failed to edit response message: {}", why);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let manager = get_songbird(ctx).await;
|
||||||
|
if let Some(handler_lock) = manager.get(guild_id) {
|
||||||
|
let handler = handler_lock.lock().await;
|
||||||
|
if let Err(err) = handler.queue().skip() {
|
||||||
|
if let Err(why) = edit_response(&ctx, &command, format!("Failed to skip: {}", err)).await {
|
||||||
|
error!("Failed to edit response message: {}", why);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
debug!("Skipped the track");
|
||||||
|
if let Err(why) = edit_response(&ctx, &command, format!("Skipping the track")).await {
|
||||||
|
error!("Failed to edit response message: {}", why);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn register(command: &mut CreateApplicationCommand) -> &mut CreateApplicationCommand {
|
||||||
|
command.name("skip").description("Skip the current track")
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
use log::{debug, error};
|
||||||
|
|
||||||
|
use serenity::prelude::*;
|
||||||
|
use serenity::builder::CreateApplicationCommand;
|
||||||
|
use serenity::model::application::interaction::application_command::ApplicationCommandInteraction;
|
||||||
|
|
||||||
|
use super::{get_songbird, create_response, edit_response};
|
||||||
|
|
||||||
|
pub async fn run(ctx: &Context, command: &ApplicationCommandInteraction) {
|
||||||
|
// Create the initial response
|
||||||
|
if let Err(why) = create_response(&ctx, &command, "Processing command...".to_string()).await {
|
||||||
|
error!("Failed to create response message: {}", why);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let guild_id = match command.guild_id {
|
||||||
|
Some(g) => g,
|
||||||
|
None => {
|
||||||
|
if let Err(why) = edit_response(&ctx, &command, "Unable to join voice channel".to_string()).await {
|
||||||
|
error!("Failed to edit response message: {}", why);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let manager = get_songbird(ctx).await;
|
||||||
|
if let Some(handler_lock) = manager.get(guild_id) {
|
||||||
|
let handler = handler_lock.lock().await;
|
||||||
|
handler.queue().stop();
|
||||||
|
debug!("Stopped the track");
|
||||||
|
if let Err(why) = edit_response(&ctx, &command, format!("Stopping the tracks")).await {
|
||||||
|
error!("Failed to edit response message: {}", why);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn register(command: &mut CreateApplicationCommand) -> &mut CreateApplicationCommand {
|
||||||
|
command.name("stop").description("Stop the current track and clear the queue")
|
||||||
|
}
|
||||||
@@ -21,6 +21,10 @@ impl EventHandler for Handler {
|
|||||||
if let Interaction::ApplicationCommand(command) = interaction {
|
if let Interaction::ApplicationCommand(command) = interaction {
|
||||||
match command.data.name.as_str() {
|
match command.data.name.as_str() {
|
||||||
"play" => commands::audio::play::run(&ctx, &command).await,
|
"play" => commands::audio::play::run(&ctx, &command).await,
|
||||||
|
"stop" => commands::audio::stop::run(&ctx, &command).await,
|
||||||
|
"pause" => commands::audio::pause::run(&ctx, &command).await,
|
||||||
|
"resume" => commands::audio::resume::run(&ctx, &command).await,
|
||||||
|
"skip" => commands::audio::skip::run(&ctx, &command).await,
|
||||||
_ => {
|
_ => {
|
||||||
let content: String = match command.data.name.as_str() {
|
let content: String = match command.data.name.as_str() {
|
||||||
"ping" => commands::ping::run(&command.data.options),
|
"ping" => commands::ping::run(&command.data.options),
|
||||||
@@ -43,6 +47,10 @@ impl EventHandler for Handler {
|
|||||||
let commands = guild.id.set_application_commands(&ctx.http, |commands| {
|
let commands = guild.id.set_application_commands(&ctx.http, |commands| {
|
||||||
commands.create_application_command(|command: &mut serenity::builder::CreateApplicationCommand| { commands::ping::register(command) })
|
commands.create_application_command(|command: &mut serenity::builder::CreateApplicationCommand| { commands::ping::register(command) })
|
||||||
.create_application_command(|command: &mut serenity::builder::CreateApplicationCommand| { commands::audio::play::register(command) })
|
.create_application_command(|command: &mut serenity::builder::CreateApplicationCommand| { commands::audio::play::register(command) })
|
||||||
|
.create_application_command(|command: &mut serenity::builder::CreateApplicationCommand| { commands::audio::stop::register(command) })
|
||||||
|
.create_application_command(|command: &mut serenity::builder::CreateApplicationCommand| { commands::audio::pause::register(command) })
|
||||||
|
.create_application_command(|command: &mut serenity::builder::CreateApplicationCommand| { commands::audio::resume::register(command) })
|
||||||
|
.create_application_command(|command: &mut serenity::builder::CreateApplicationCommand| { commands::audio::skip::register(command) })
|
||||||
}).await;
|
}).await;
|
||||||
match commands {
|
match commands {
|
||||||
Ok(c) => info!("Registered {} commands for guild {}", c.len(), guild.id.0),
|
Ok(c) => info!("Registered {} commands for guild {}", c.len(), guild.id.0),
|
||||||
|
|||||||
Reference in New Issue
Block a user