maybe fix bot leaving too early, and playing multiple sounds at once

patrick/test-ci v0.1.1-alpha
Patrick Cleavelin 2023-02-13 21:00:18 -06:00
parent cd4de895eb
commit 0e6bc2d3dd
4 changed files with 27 additions and 21 deletions

2
Cargo.lock generated
View File

@ -639,7 +639,7 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
[[package]] [[package]]
name = "memejoin-rs" name = "memejoin-rs"
version = "0.1.0-alpha" version = "0.1.1-alpha"
dependencies = [ dependencies = [
"serde", "serde",
"serde_json", "serde_json",

View File

@ -1,6 +1,6 @@
[package] [package]
name = "memejoin-rs" name = "memejoin-rs"
version = "0.1.0-alpha" version = "0.1.1-alpha"
edition = "2021" edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # 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 = "1.0.152"
serde_json = "1.0.93" serde_json = "1.0.93"
serenity = { version = "0.11.5", default-features = false, features = ["client", "gateway", "rustls_backend", "model", "cache", "voice"] } 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"] } tokio = { version = "1.25.0", features = ["rt-multi-thread", "macros", "signal"] }
tracing = "0.1.37" tracing = "0.1.37"
tracing-subscriber = "0.3.16" tracing-subscriber = "0.3.16"

View File

@ -35,15 +35,18 @@
packages = with pkgs; flake-utils.lib.flattenTree rec { packages = with pkgs; flake-utils.lib.flattenTree rec {
default = rustPlatform.buildRustPackage rec { default = rustPlatform.buildRustPackage rec {
name = "memejoin-rs"; name = "memejoin-rs";
version = "0.1.0-alpha"; version = "0.1.1-alpha";
src = self; src = self;
cargoSha256 = "dGc6db0A7Tp+ZnsPAPCUbmmbNq/N/1DhKOb2gRPisN0=";
nativeBuildInputs = [ local-rust cmake gcc libopus ]; nativeBuildInputs = [ local-rust cmake gcc libopus ];
cargoLock = {
lockFile = ./Cargo.lock;
};
}; };
docker = dockerTools.buildImage { docker = dockerTools.buildImage {
name = "memejoin-rs"; name = "memejoin-rs";
tag = "0.1.0.alpha"; tag = "0.1.1.alpha";
copyToRoot = buildEnv { copyToRoot = buildEnv {
name = "image-root"; name = "image-root";
paths = [ default ffmpeg libopus youtube-dl ]; paths = [ default ffmpeg libopus youtube-dl ];

View File

@ -28,18 +28,21 @@ impl songbird::EventHandler for TrackEventHandler {
&'a self, &'a self,
ctx: &'b songbird::EventContext<'c>, ctx: &'b songbird::EventContext<'c>,
) -> Option<songbird::Event> { ) -> Option<songbird::Event> {
if let songbird::EventContext::Track(track) = ctx { if let songbird::EventContext::Track(tracks) = ctx {
if let Some(context) = track.get(0) { for (track_state, _track_handle) in tracks.iter() {
if context.0.playing == songbird::tracks::PlayMode::End // If any track is still playing, don't leave the channel yet
|| context.0.playing == songbird::tracks::PlayMode::Stop // there are more sounds to be played (I think)
{ if track_state.playing == songbird::tracks::PlayMode::Play {
let manager = songbird::get(&self.ctx).await.expect("should get manager"); return None;
if let Err(err) = manager.leave(self.guild_id).await {
error!("Failed to leave voice channel: {err:?}");
}
} }
} }
} }
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 None
} }
} }
@ -89,6 +92,10 @@ impl EventHandler for Handler {
async fn voice_state_update(&self, ctx: Context, old: Option<VoiceState>, new: VoiceState) { async fn voice_state_update(&self, ctx: Context, old: Option<VoiceState>, new: VoiceState) {
if old.is_none() { if old.is_none() {
if let (Some(member), Some(channel_id)) = (new.member, new.channel_id) { if let (Some(member), Some(channel_id)) = (new.member, new.channel_id) {
if member.user.name == "MemeJoin" {
return;
}
info!( info!(
"{}#{} joined voice channel {:?} in {:?}", "{}#{} joined voice channel {:?} in {:?}",
member.user.name, member.user.name,
@ -100,10 +107,6 @@ impl EventHandler for Handler {
.unwrap_or("no_guild_name".to_string()) .unwrap_or("no_guild_name".to_string())
); );
if member.user.name == "MemeJoin" {
return;
}
let settings = { let settings = {
let data_read = ctx.data.read().await; let data_read = ctx.data.read().await;
@ -151,8 +154,8 @@ impl EventHandler for Handler {
} }
}; };
let track_handle = handler.play_source(source); let track_handler = handler.enqueue_source(source);
if let Err(err) = track_handle.add_event( if let Err(err) = track_handler.add_event(
songbird::Event::Track(songbird::TrackEvent::End), songbird::Event::Track(songbird::TrackEvent::End),
TrackEventHandler { TrackEventHandler {
ctx, ctx,