Nah that didn't work, here's some auto-disconnect bugfixes

main
DaXcess 2023-09-26 14:56:31 +02:00
parent d93758e250
commit 4a90cb8718
No known key found for this signature in database
GPG Key ID: CF78CC72F0FD5EAD
4 changed files with 38 additions and 18 deletions

16
Cargo.lock generated
View File

@ -531,9 +531,9 @@ dependencies = [
[[package]] [[package]]
name = "fastrand" name = "fastrand"
version = "2.0.0" version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
[[package]] [[package]]
name = "fixedbitset" name = "fixedbitset"
@ -2400,9 +2400,9 @@ dependencies = [
[[package]] [[package]]
name = "time" name = "time"
version = "0.3.28" version = "0.3.29"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17f6bb557fd245c28e6411aa56b6403c689ad95061f50e4be16c274e70a17e48" checksum = "426f806f4089c493dcac0d24c29c01e2c38baf8e30f1b716ee37e83d200b18fe"
dependencies = [ dependencies = [
"deranged", "deranged",
"itoa", "itoa",
@ -2413,15 +2413,15 @@ dependencies = [
[[package]] [[package]]
name = "time-core" name = "time-core"
version = "0.1.1" version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
[[package]] [[package]]
name = "time-macros" name = "time-macros"
version = "0.2.14" version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a942f44339478ef67935ab2bbaec2fb0322496cf3cbe84b261e06ac3814c572" checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20"
dependencies = [ dependencies = [
"time-core", "time-core",
] ]

View File

@ -318,13 +318,13 @@ impl PlayerTask {
match pbi.as_mut() { match pbi.as_mut() {
Some(pbi) => { Some(pbi) => {
pbi.update_track(spotify_id, current); pbi.update_track(spotify_id, current);
pbi.update_pos_dur(position_ms, duration_ms, true); pbi.update_pos_dur(position_ms, duration_ms, playing);
} }
None => { None => {
*pbi = Some(PlaybackInfo::new( *pbi = Some(PlaybackInfo::new(
duration_ms, duration_ms,
position_ms, position_ms,
true, playing,
current, current,
spotify_id, spotify_id,
)); ));

View File

@ -56,11 +56,9 @@ impl InnerSessionManager {
session: SpoticordSession, session: SpoticordSession,
guild_id: GuildId, guild_id: GuildId,
owner_id: UserId, owner_id: UserId,
) -> Result<(), SessionCreateError> { ) {
self.sessions.insert(guild_id, session); self.sessions.insert(guild_id, session);
self.owner_map.insert(owner_id, guild_id); self.owner_map.insert(owner_id, guild_id);
Ok(())
} }
/// Remove a session /// Remove a session
@ -147,7 +145,9 @@ impl SessionManager {
.write() .write()
.await .await
.create_session(session, guild_id, owner_id) .create_session(session, guild_id, owner_id)
.await .await;
Ok(())
} }
/// Remove a session /// Remove a session

View File

@ -24,7 +24,7 @@ use songbird::{
create_player, create_player,
input::{Codec, Container, Input, Reader}, input::{Codec, Container, Input, Reader},
tracks::TrackHandle, tracks::TrackHandle,
Call, Event, EventContext, EventHandler, Songbird, Call, Event, EventContext, EventHandler,
}; };
use std::{ use std::{
ops::{Deref, DerefMut}, ops::{Deref, DerefMut},
@ -36,6 +36,12 @@ use tokio::sync::{Mutex, RwLockReadGuard, RwLockWriteGuard};
#[derive(Clone)] #[derive(Clone)]
pub struct SpoticordSession(Arc<RwLock<InnerSpoticordSession>>); pub struct SpoticordSession(Arc<RwLock<InnerSpoticordSession>>);
impl Drop for SpoticordSession {
fn drop(&mut self) {
log::trace!("drop SpoticordSession");
}
}
struct InnerSpoticordSession { struct InnerSpoticordSession {
owner: Option<UserId>, owner: Option<UserId>,
guild_id: GuildId, guild_id: GuildId,
@ -46,7 +52,6 @@ struct InnerSpoticordSession {
session_manager: SessionManager, session_manager: SessionManager,
songbird: Arc<Songbird>,
call: Arc<Mutex<Call>>, call: Arc<Mutex<Call>>,
track: Option<TrackHandle>, track: Option<TrackHandle>,
player: Option<Player>, player: Option<Player>,
@ -90,7 +95,6 @@ impl SpoticordSession {
text_channel_id, text_channel_id,
http: ctx.http.clone(), http: ctx.http.clone(),
session_manager: session_manager.clone(), session_manager: session_manager.clone(),
songbird: songbird.clone(),
call: call.clone(), call: call.clone(),
track: None, track: None,
player: None, player: None,
@ -342,6 +346,8 @@ impl SpoticordSession {
timer.tick().await; timer.tick().await;
timer.tick().await; timer.tick().await;
trace!("Ring ring, time to check :)");
// Make sure this task has not been aborted, if it has this will automatically stop execution. // Make sure this task has not been aborted, if it has this will automatically stop execution.
tokio::task::yield_now().await; tokio::task::yield_now().await;
@ -351,6 +357,8 @@ impl SpoticordSession {
.map(|pbi| pbi.is_playing) .map(|pbi| pbi.is_playing)
.unwrap_or(false); .unwrap_or(false);
trace!("is_playing = {is_playing}");
if !is_playing { if !is_playing {
info!("Player is not playing, disconnecting"); info!("Player is not playing, disconnecting");
session session
@ -511,9 +519,13 @@ impl InnerSpoticordSession {
} }
}; };
if let Err(why) = self.songbird.remove(self.guild_id).await { let mut call = self.call.lock().await;
if let Err(why) = call.leave().await {
error!("Failed to leave voice channel: {:?}", why); error!("Failed to leave voice channel: {:?}", why);
} }
call.remove_all_global_events();
} }
} }
@ -523,10 +535,12 @@ impl EventHandler for SpoticordSession {
match ctx { match ctx {
EventContext::DriverDisconnect(_) => { EventContext::DriverDisconnect(_) => {
debug!("Driver disconnected, leaving voice channel"); debug!("Driver disconnected, leaving voice channel");
trace!("Arc strong count: {}", Arc::strong_count(&self.0));
self.disconnect().await; self.disconnect().await;
} }
EventContext::ClientDisconnect(who) => { EventContext::ClientDisconnect(who) => {
trace!("Client disconnected, {}", who.user_id.to_string()); trace!("Client disconnected, {}", who.user_id.to_string());
trace!("Arc strong count: {}", Arc::strong_count(&self.0));
if let Some(session) = self if let Some(session) = self
.session_manager() .session_manager()
@ -547,3 +561,9 @@ impl EventHandler for SpoticordSession {
return None; return None;
} }
} }
impl Drop for InnerSpoticordSession {
fn drop(&mut self) {
log::trace!("drop InnerSpoticordSession");
}
}