fix: bug fixes
This commit is contained in:
parent
ed89386ed9
commit
05fae26549
4 changed files with 76 additions and 30 deletions
|
@ -3,17 +3,22 @@ use crate::util::embed::Embed;
|
||||||
use serenity::all::{CommandInteraction, Context};
|
use serenity::all::{CommandInteraction, Context};
|
||||||
use serenity::builder::{CreateCommand, CreateEmbed};
|
use serenity::builder::{CreateCommand, CreateEmbed};
|
||||||
|
|
||||||
pub async unsafe fn run(ctx: &Context, command: &CommandInteraction) -> CreateEmbed {
|
pub async fn run(ctx: &Context, command: &CommandInteraction) -> CreateEmbed {
|
||||||
let username = command.user.name.as_str();
|
let username = command.user.name.as_str();
|
||||||
|
|
||||||
let guild_id = match &command.guild_id {
|
let guild_id = match &command.guild_id {
|
||||||
Some(guild_id) => guild_id,
|
Some(guild_id) => guild_id,
|
||||||
None => {
|
None => {
|
||||||
return Embed::create_error_respose(username, "guild_id not found", "Could not find guild id.");
|
return Embed::create_error_respose(
|
||||||
|
username,
|
||||||
|
"guild_id not found",
|
||||||
|
"Could not find guild id.",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
music_manager::attempt_to_skip_current_song(ctx, guild_id, &command.user.id, &command.user.name).await
|
music_manager::attempt_to_skip_current_song(ctx, guild_id, &command.user.id, &command.user.name)
|
||||||
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn register() -> CreateCommand {
|
pub fn register() -> CreateCommand {
|
||||||
|
|
|
@ -40,11 +40,14 @@ impl EventHandler for TrackEndNotifier {
|
||||||
let mut head = match music_queue::get_head(&self.guild_id).await {
|
let mut head = match music_queue::get_head(&self.guild_id).await {
|
||||||
Some(head) => head,
|
Some(head) => head,
|
||||||
None => {
|
None => {
|
||||||
println!("Cannot get head of queue: {:?}", e);
|
println!("Cannot get head of queue");
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
println!("Now playing: {}", head.aux_metadata().await.unwrap().title.unwrap());
|
println!(
|
||||||
|
"Now playing: {}",
|
||||||
|
head.aux_metadata().await.unwrap().title.unwrap()
|
||||||
|
);
|
||||||
music_manager::play_song(&self.cmdctx, &self.guild_id, &head).await;
|
music_manager::play_song(&self.cmdctx, &self.guild_id, &head).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,6 @@ use songbird::input::YoutubeDl;
|
||||||
use songbird::{Event, TrackEvent};
|
use songbird::{Event, TrackEvent};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
|
||||||
/// Either queues the song, or start playing it instantly, depending on if there is already a song playing
|
/// Either queues the song, or start playing it instantly, depending on if there is already a song playing
|
||||||
pub async fn attempt_to_queue_song(
|
pub async fn attempt_to_queue_song(
|
||||||
ctx: &Context,
|
ctx: &Context,
|
||||||
|
@ -19,7 +18,11 @@ pub async fn attempt_to_queue_song(
|
||||||
query: &str,
|
query: &str,
|
||||||
) -> CreateEmbed {
|
) -> CreateEmbed {
|
||||||
if !user_util::is_user_connected_to_vc(ctx, guild_id, user_id).await {
|
if !user_util::is_user_connected_to_vc(ctx, guild_id, user_id).await {
|
||||||
return Embed::create_error_respose(username, "You are not connected to a VC", "Connect to my vc to start controlling the music.")
|
return Embed::create_error_respose(
|
||||||
|
username,
|
||||||
|
"You are not connected to a VC",
|
||||||
|
"Connect to my vc to start controlling the music.",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let connect_to = match get_vc_id(ctx, guild_id, user_id).await {
|
let connect_to = match get_vc_id(ctx, guild_id, user_id).await {
|
||||||
|
@ -50,7 +53,11 @@ pub async fn attempt_to_queue_song(
|
||||||
|
|
||||||
// Check if user is in the same VC as the bot
|
// Check if user is in the same VC as the bot
|
||||||
if self_channel != connect_to {
|
if self_channel != connect_to {
|
||||||
return Embed::create_error_respose(username, "You are not in my VC", "You have to be in my VC in order to controll the music.")
|
return Embed::create_error_respose(
|
||||||
|
username,
|
||||||
|
"You are not in my VC",
|
||||||
|
"You have to be in my VC in order to controll the music.",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,7 +92,11 @@ pub async fn attempt_to_queue_song(
|
||||||
let handler_lock = match manager.get(*guild_id) {
|
let handler_lock = match manager.get(*guild_id) {
|
||||||
Some(handler) => handler,
|
Some(handler) => handler,
|
||||||
None => {
|
None => {
|
||||||
return Embed::create_error_respose(username, "Error", "Cannot get handler of this guild.");
|
return Embed::create_error_respose(
|
||||||
|
username,
|
||||||
|
"Error",
|
||||||
|
"Cannot get handler of this guild.",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -124,14 +135,23 @@ pub async fn play_song(ctx: &Context, guild_id: &GuildId, target: &YoutubeDl) {
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut handler = handler_lock.lock().await;
|
let mut handler = handler_lock.lock().await;
|
||||||
let _ = handler.stop(); // Stop playing the current song
|
handler.stop(); // Stop playing the current song
|
||||||
let _ = handler.play_input(target.clone().into()); // TODO: Add event handlers
|
let _ = handler.play_input(target.clone().into()); // TODO: Add event handlers
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Attempt to skip the song, which is currently playing. Do nothing if there is no next song
|
/// Attempt to skip the song, which is currently playing. Do nothing if there is no next song
|
||||||
pub async fn attempt_to_skip_current_song(ctx: &Context, guild_id: &GuildId, user_id: &UserId, username: &str) -> CreateEmbed {
|
pub async fn attempt_to_skip_current_song(
|
||||||
|
ctx: &Context,
|
||||||
|
guild_id: &GuildId,
|
||||||
|
user_id: &UserId,
|
||||||
|
username: &str,
|
||||||
|
) -> CreateEmbed {
|
||||||
if !user_util::is_user_connected_to_vc(ctx, guild_id, user_id).await {
|
if !user_util::is_user_connected_to_vc(ctx, guild_id, user_id).await {
|
||||||
return Embed::create_error_respose(username, "You are not connected to a VC", "Connect to my vc to start controlling the music.")
|
return Embed::create_error_respose(
|
||||||
|
username,
|
||||||
|
"You are not connected to a VC",
|
||||||
|
"Connect to my vc to start controlling the music.",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let connect_to = match get_vc_id(ctx, guild_id, user_id).await {
|
let connect_to = match get_vc_id(ctx, guild_id, user_id).await {
|
||||||
|
@ -162,13 +182,21 @@ pub async fn attempt_to_skip_current_song(ctx: &Context, guild_id: &GuildId, use
|
||||||
|
|
||||||
// Check if user is in the same VC as the bot
|
// Check if user is in the same VC as the bot
|
||||||
if self_channel != connect_to {
|
if self_channel != connect_to {
|
||||||
return Embed::create_error_respose(username, "You are not in my VC", "You have to be in my VC in order to controll the music.")
|
return Embed::create_error_respose(
|
||||||
|
username,
|
||||||
|
"You are not in my VC",
|
||||||
|
"You have to be in my VC in order to controll the music.",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let head = music_queue::get_head(guild_id).await; // TODO match
|
let head = music_queue::get_head(guild_id).await; // TODO match
|
||||||
if head.is_none() {
|
if head.is_none() {
|
||||||
return Embed::create_error_respose(username, "Cannot find a song to play", "The queue is empty.");
|
return Embed::create_error_respose(
|
||||||
|
username,
|
||||||
|
"Cannot find a song to play",
|
||||||
|
"The queue is empty.",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
let head = head.unwrap();
|
let head = head.unwrap();
|
||||||
play_song(ctx, guild_id, &head).await;
|
play_song(ctx, guild_id, &head).await;
|
||||||
|
@ -176,7 +204,6 @@ pub async fn attempt_to_skip_current_song(ctx: &Context, guild_id: &GuildId, use
|
||||||
Embed::create_yt_playing(head, username, "Song skipped; Now playing").await
|
Embed::create_yt_playing(head, username, "Song skipped; Now playing").await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Try to clear the queue and stop playing. Also leave the vc
|
/// Try to clear the queue and stop playing. Also leave the vc
|
||||||
pub async fn attempt_to_stop(
|
pub async fn attempt_to_stop(
|
||||||
ctx: &Context,
|
ctx: &Context,
|
||||||
|
@ -186,7 +213,11 @@ pub async fn attempt_to_stop(
|
||||||
) -> CreateEmbed {
|
) -> CreateEmbed {
|
||||||
if !user_util::is_self_connected_to_vc(ctx, guild_id).await {
|
if !user_util::is_self_connected_to_vc(ctx, guild_id).await {
|
||||||
// Bot is not connectd to vc; no need to dc
|
// Bot is not connectd to vc; no need to dc
|
||||||
return Embed::create_error_respose(username, "Bot is not connected", "And therefore there is no need to do anything.");
|
return Embed::create_error_respose(
|
||||||
|
username,
|
||||||
|
"Bot is not connected",
|
||||||
|
"And therefore there is no need to do anything.",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
let self_channel = user_util::get_self_vc_id(ctx, guild_id)
|
let self_channel = user_util::get_self_vc_id(ctx, guild_id)
|
||||||
.await
|
.await
|
||||||
|
@ -197,19 +228,31 @@ pub async fn attempt_to_stop(
|
||||||
|
|
||||||
// Check if user is in the same VC as the bot
|
// Check if user is in the same VC as the bot
|
||||||
if self_channel != connect_to {
|
if self_channel != connect_to {
|
||||||
return Embed::create_error_respose(username, "You are not in my VC.", "Connect to my VC to controll the music.");
|
return Embed::create_error_respose(
|
||||||
|
username,
|
||||||
|
"You are not in my VC.",
|
||||||
|
"Connect to my VC to controll the music.",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let stopped = match leave(ctx, guild_id).await {
|
let stopped = match leave(ctx, guild_id).await {
|
||||||
Ok(stopped) => stopped,
|
Ok(stopped) => stopped,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
println!("Error while stopping: {:?}", e);
|
println!("Error while stopping: {:?}", e);
|
||||||
return Embed::create_error_respose(username, "There was an error", "Tell moonleay to check the logs.");
|
return Embed::create_error_respose(
|
||||||
|
username,
|
||||||
|
"There was an error",
|
||||||
|
"Tell moonleay to check the logs.",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if !stopped {
|
if !stopped {
|
||||||
Embed::create_error_respose(username, "Can't stop, what ain't running", "I am not connected.\nI cant stop doing something, when I'm not doing it.")
|
Embed::create_error_respose(
|
||||||
|
username,
|
||||||
|
"Can't stop, what ain't running",
|
||||||
|
"I am not connected.\nI cant stop doing something, when I'm not doing it.",
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
music_queue::delete_queue(guild_id).await; // Clear queue
|
music_queue::delete_queue(guild_id).await; // Clear queue
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use serenity::all::GuildId;
|
use serenity::all::GuildId;
|
||||||
use songbird::input::YoutubeDl;
|
use songbird::input::YoutubeDl;
|
||||||
use tokio::sync::{Mutex, MutexGuard};
|
use tokio::sync::Mutex;
|
||||||
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
@ -32,7 +32,7 @@ where
|
||||||
let queue = get_music_queue(guild_id).await;
|
let queue = get_music_queue(guild_id).await;
|
||||||
let mut queue = queue.lock().await;
|
let mut queue = queue.lock().await;
|
||||||
|
|
||||||
f(&mut *queue)
|
f(&mut queue)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -70,16 +70,11 @@ pub async fn get_head(guild_id: &GuildId) -> Option<YoutubeDl> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn set_now_playing(guild_id: &GuildId, now_playing: Option<YoutubeDl>) {
|
pub async fn set_now_playing(guild_id: &GuildId, now_playing: Option<YoutubeDl>) {
|
||||||
let queue = get_music_queue(guild_id).await;
|
with_music_queue(guild_id, |queue| queue.now_playing = now_playing).await;
|
||||||
let mut queue = queue.lock().await;
|
|
||||||
|
|
||||||
queue.now_playing = now_playing;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn get_now_playing(guild_id: &GuildId) -> Option<YoutubeDl> {
|
pub async fn get_now_playing(guild_id: &GuildId) -> Option<YoutubeDl> {
|
||||||
let queue = get_queue(guild_id).await;
|
with_music_queue(guild_id, |queue| queue.now_playing.to_owned()).await
|
||||||
|
|
||||||
queue.now_playing.to_owned()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn is_empty(guild_id: &GuildId) -> bool {
|
pub async fn is_empty(guild_id: &GuildId) -> bool {
|
||||||
|
|
Loading…
Reference in a new issue