use crate::music::{music_manager, music_queue}; use serenity::all::{ChannelId, GuildId, Http}; use serenity::async_trait; use songbird::{Event, EventContext, EventHandler}; use std::sync::Arc; pub struct TrackEndNotifier { pub guild_id: GuildId, pub channel_id: ChannelId, pub http: Arc, pub cmdctx: Arc, } #[async_trait] impl EventHandler for TrackEndNotifier { async fn act(&self, ctx: &EventContext<'_>) -> Option { // TODO: Does this need to be unsafe? if let EventContext::Track(..) = ctx { println!("The track ended!"); let music_queue = crate::get_queue(self.guild_id).await; let q = &music_queue.queue; if q.is_empty() { // No more songs in queue, exit the vc let stopped = match music_manager::stop(&self.cmdctx, &self.guild_id).await { Ok(stopped) => stopped, Err(e) => { println!("Cannot stop: {:?}", e); return None; } }; if stopped { println!("Stopped playing successfully."); } else { println!("Failed to stop playing."); } return None; } let head = music_queue::get_head(&self.guild_id); if head.is_none() { println!("Cannot get head of queue"); return None; } let head = head.unwrap(); music_manager::play_song(&self.cmdctx, &self.guild_id, head).await; } None } }