Fix handling of forced vc disconnect

Signed-off-by: trivernis <trivernis@protonmail.com>
pull/27/head
trivernis 3 years ago
parent bc3cdb0cfb
commit 726bee497a
Signed by: Trivernis
GPG Key ID: DFFFCC2C7A02DB45

@ -1,6 +1,6 @@
use serenity::async_trait; use serenity::async_trait;
use serenity::client::Context; use serenity::client::Context;
use serenity::model::channel::Reaction; use serenity::model::channel::{GuildChannel, Reaction};
use serenity::model::event::ResumedEvent; use serenity::model::event::ResumedEvent;
use serenity::model::gateway::{Activity, Ready}; use serenity::model::gateway::{Activity, Ready};
use serenity::model::guild::Member; use serenity::model::guild::Member;
@ -9,6 +9,7 @@ use serenity::model::voice::VoiceState;
use serenity::prelude::*; use serenity::prelude::*;
use crate::commands::music::get_music_player_for_guild; use crate::commands::music::get_music_player_for_guild;
use crate::utils::context_data::MusicPlayers;
use crate::utils::delete_messages_from_database; use crate::utils::delete_messages_from_database;
use bot_serenityutils::menu::{ use bot_serenityutils::menu::{
handle_message_delete, handle_message_delete_bulk, handle_reaction_add, handle_reaction_remove, handle_message_delete, handle_message_delete_bulk, handle_reaction_add, handle_reaction_remove,
@ -109,12 +110,12 @@ impl EventHandler for Handler {
return; return;
}; };
if let Some(old_id) = old_state.and_then(|c| c.channel_id) { if let Some(old_id) = old_state.clone().and_then(|c| c.channel_id) {
member_count = get_own_channel_member_count(&ctx, &old_id).await; member_count = get_own_channel_member_count(&ctx, old_id).await;
} }
if member_count.is_none() { if member_count.is_none() {
if let Some(new_id) = new_state.channel_id { if let Some(new_id) = new_state.channel_id {
member_count = get_own_channel_member_count(&ctx, &new_id).await; member_count = get_own_channel_member_count(&ctx, new_id).await;
} }
} }
@ -126,14 +127,28 @@ impl EventHandler for Handler {
player.set_leave_flag(count == 0); player.set_leave_flag(count == 0);
} }
} }
if let (Some(state), None) = (old_state, new_state.channel_id) {
let current_user = ctx.cache.current_user().await;
if state.user_id == current_user.id {
let mut data = ctx.data.write().await;
let players = data.get_mut::<MusicPlayers>().unwrap();
if let Some(player) = players.remove(&guild_id.0) {
let mut player = player.lock().await;
let _ = player.delete_now_playing().await;
let _ = player.stop().await;
}
}
}
} }
} }
/// Returns the number of members in the channel if it's the bots voice channel /// Returns the number of members in the channel if it's the bots voice channel
async fn get_own_channel_member_count(ctx: &Context, channel_id: &ChannelId) -> Option<usize> { async fn get_own_channel_member_count(ctx: &Context, channel_id: ChannelId) -> Option<usize> {
let channel = ctx.http.get_channel(channel_id.0).await.ok()?; let guild_channel = get_guild_channel(ctx, channel_id).await?;
let guild_channel = channel.guild()?;
let current_user = ctx.http.get_current_user().await.ok()?; let current_user = ctx.cache.current_user().await;
let members = guild_channel.members(&ctx).await.ok()?; let members = guild_channel.members(&ctx).await.ok()?;
let own_channel = members let own_channel = members
@ -148,3 +163,12 @@ async fn get_own_channel_member_count(ctx: &Context, channel_id: &ChannelId) ->
Some(members.len()) Some(members.len())
} }
/// Returns the guild channel for a guild ID
async fn get_guild_channel(ctx: &Context, channel_id: ChannelId) -> Option<GuildChannel> {
if let Some(channel) = ctx.cache.channel(channel_id).await {
return channel.guild();
}
let channel = ctx.http.get_channel(channel_id.0).await.ok()?;
channel.guild()
}

@ -1,6 +1,6 @@
use crate::utils::context_data::MusicPlayers; use crate::utils::context_data::MusicPlayers;
use lavalink_rs::gateway::LavalinkEventHandler; use lavalink_rs::gateway::LavalinkEventHandler;
use lavalink_rs::model::{TrackFinish, TrackStart}; use lavalink_rs::model::{PlayerUpdate, Stats, TrackFinish, TrackStart};
use lavalink_rs::LavalinkClient; use lavalink_rs::LavalinkClient;
use serenity::async_trait; use serenity::async_trait;
use serenity::prelude::TypeMapKey; use serenity::prelude::TypeMapKey;
@ -17,6 +17,7 @@ impl LavalinkEventHandler for LavalinkHandler {
async fn track_start(&self, _client: LavalinkClient, event: TrackStart) { async fn track_start(&self, _client: LavalinkClient, event: TrackStart) {
log::info!("Track started!\nGuild: {}", event.guild_id); log::info!("Track started!\nGuild: {}", event.guild_id);
} }
async fn track_finish(&self, _: LavalinkClient, event: TrackFinish) { async fn track_finish(&self, _: LavalinkClient, event: TrackFinish) {
log::info!("Track finished!\nGuild: {}", event.guild_id); log::info!("Track finished!\nGuild: {}", event.guild_id);
let player = { let player = {
@ -35,6 +36,14 @@ impl LavalinkEventHandler for LavalinkHandler {
} }
} }
} }
async fn player_update(&self, _: LavalinkClient, event: PlayerUpdate) {
log::debug!("Received player update event: {:?}", event);
}
async fn stats(&self, _: LavalinkClient, event: Stats) {
log::debug!("Received stats event: {:?}", event);
}
} }
pub struct Lavalink; pub struct Lavalink;

Loading…
Cancel
Save