diff --git a/Cargo.toml b/Cargo.toml index ec27894..9e27391 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ edition = "2021" serde = "1.0.152" serde_json = "1.0.93" serenity = { version = "0.11.5", default-features = false, features = ["client", "gateway", "rustls_backend", "model", "cache", "voice"] } -songbird = "0.3.0" +songbird = { version = "0.3.0", features = [ "builtin-queue" ] } tokio = { version = "1.25.0", features = ["rt-multi-thread", "macros", "signal"] } tracing = "0.1.37" tracing-subscriber = "0.3.16" diff --git a/src/main.rs b/src/main.rs index 629d9ee..a693142 100644 --- a/src/main.rs +++ b/src/main.rs @@ -28,18 +28,21 @@ impl songbird::EventHandler for TrackEventHandler { &'a self, ctx: &'b songbird::EventContext<'c>, ) -> Option { - if let songbird::EventContext::Track(track) = ctx { - if let Some(context) = track.get(0) { - if context.0.playing == songbird::tracks::PlayMode::End - || context.0.playing == songbird::tracks::PlayMode::Stop - { - let manager = songbird::get(&self.ctx).await.expect("should get manager"); - if let Err(err) = manager.leave(self.guild_id).await { - error!("Failed to leave voice channel: {err:?}"); - } + if let songbird::EventContext::Track(tracks) = ctx { + for (track_state, _track_handle) in tracks.iter() { + // If any track is still playing, don't leave the channel yet + // there are more sounds to be played (I think) + if track_state.playing == songbird::tracks::PlayMode::Play { + return None; } } } + + let manager = songbird::get(&self.ctx).await.expect("should get manager"); + if let Err(err) = manager.leave(self.guild_id).await { + error!("Failed to leave voice channel: {err:?}"); + } + None } } @@ -89,6 +92,10 @@ impl EventHandler for Handler { async fn voice_state_update(&self, ctx: Context, old: Option, new: VoiceState) { if old.is_none() { if let (Some(member), Some(channel_id)) = (new.member, new.channel_id) { + if member.user.name == "MemeJoin" { + return; + } + info!( "{}#{} joined voice channel {:?} in {:?}", member.user.name, @@ -100,10 +107,6 @@ impl EventHandler for Handler { .unwrap_or("no_guild_name".to_string()) ); - if member.user.name == "MemeJoin" { - return; - } - let settings = { let data_read = ctx.data.read().await; @@ -151,8 +154,8 @@ impl EventHandler for Handler { } }; - let track_handle = handler.play_source(source); - if let Err(err) = track_handle.add_event( + let track_handler = handler.enqueue_source(source); + if let Err(err) = track_handler.add_event( songbird::Event::Track(songbird::TrackEvent::End), TrackEventHandler { ctx,