diff --git a/Cargo.lock b/Cargo.lock index 57b82dd..abd6368 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -639,7 +639,7 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memejoin-rs" -version = "0.1.0-alpha" +version = "0.1.1-alpha" dependencies = [ "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index ec27894..d383237 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "memejoin-rs" -version = "0.1.0-alpha" +version = "0.1.1-alpha" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -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/flake.nix b/flake.nix index 9df14e2..a921715 100644 --- a/flake.nix +++ b/flake.nix @@ -35,15 +35,18 @@ packages = with pkgs; flake-utils.lib.flattenTree rec { default = rustPlatform.buildRustPackage rec { name = "memejoin-rs"; - version = "0.1.0-alpha"; + version = "0.1.1-alpha"; src = self; - cargoSha256 = "dGc6db0A7Tp+ZnsPAPCUbmmbNq/N/1DhKOb2gRPisN0="; nativeBuildInputs = [ local-rust cmake gcc libopus ]; + + cargoLock = { + lockFile = ./Cargo.lock; + }; }; docker = dockerTools.buildImage { name = "memejoin-rs"; - tag = "0.1.0.alpha"; + tag = "0.1.1.alpha"; copyToRoot = buildEnv { name = "image-root"; paths = [ default ffmpeg libopus youtube-dl ]; 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,