Move Ding to DriverConnect

This commit is contained in:
2023-03-12 13:10:05 -04:00
parent f6020bb859
commit 7797dbf89a

View File

@@ -4,16 +4,18 @@ use serenity::{async_trait,
model::prelude::{ChannelId, Guild}, model::prelude::{ChannelId, Guild},
prelude::{Context, Mutex}}; prelude::{Context, Mutex}};
use songbird::{EventHandler, Event, EventContext, use songbird::{EventHandler, Event, EventContext,
model::payload::{Speaking, ClientDisconnect}, ffmpeg, create_player, Call, CoreEvent}; model::payload::{Speaking, ClientDisconnect}, ffmpeg, create_player, Call, CoreEvent, events::context_data::ConnectData};
struct Receiver; struct Receiver {
call : Arc<Mutex<Call>>,
}
impl Receiver { impl Receiver {
pub fn new() -> Self { pub fn new(call: Arc<Mutex<Call>>) -> Self {
// You can manage state here, such as a buffer of audio packet bytes so // You can manage state here, such as a buffer of audio packet bytes so
// you can later store them in intervals. // you can later store them in intervals.
Self { Self {
call
} }
} }
} }
@@ -85,6 +87,21 @@ impl EventHandler for Receiver {
println!("Client disconnected: user {:?}", user_id); println!("Client disconnected: user {:?}", user_id);
}, },
Ctx::DriverConnect(
ConnectData { channel_id, ..}
) => {
match channel_id {
Some(chan) => {
let ding_src =
std::env::var("DING_SOUND").expect("DING not found in DING_SOUND");
let ding = ffmpeg(ding_src).await.expect("no ding.");
let (audio, handle) = create_player(ding);
let mut call = self.call.lock().await;
call.play(audio);
},
None => {}
}
},
_ => { _ => {
// We won't be registering this struct for any more event classes. // We won't be registering this struct for any more event classes.
unimplemented!() unimplemented!()
@@ -100,39 +117,39 @@ pub async fn join(ctx: Context, guild: Guild, cid: ChannelId) -> Option<Arc<Mute
let (call, status) = manager.join(guild.id, cid).await; let (call, status) = manager.join(guild.id, cid).await;
match status { match status {
Ok(_) => { Ok(_) => {
let call_handle = call.clone();
{ {
let mut call = call.lock().await; let mut call = call.lock().await;
call.add_global_event( call.add_global_event(
CoreEvent::SpeakingUpdate.into(), CoreEvent::SpeakingUpdate.into(),
Receiver::new(), Receiver::new(call_handle.clone()),
); );
call.add_global_event( call.add_global_event(
CoreEvent::VoicePacket.into(), CoreEvent::VoicePacket.into(),
Receiver::new(), Receiver::new(call_handle.clone()),
); );
call.add_global_event( call.add_global_event(
CoreEvent::RtcpPacket.into(), CoreEvent::RtcpPacket.into(),
Receiver::new(), Receiver::new(call_handle.clone()),
); );
call.add_global_event( call.add_global_event(
CoreEvent::ClientDisconnect.into(), CoreEvent::ClientDisconnect.into(),
Receiver::new(), Receiver::new(call_handle.clone()),
); );
call.add_global_event( call.add_global_event(
CoreEvent::ClientDisconnect.into(), CoreEvent::ClientDisconnect.into(),
Receiver::new(), Receiver::new(call_handle.clone()),
); );
let ding_src = call.add_global_event(
std::env::var("DING_SOUND").expect("DING not found in DING_SOUND"); CoreEvent::DriverConnect.into(),
let ding = ffmpeg(ding_src).await.expect("no ding."); Receiver::new(call_handle.clone()),
let (audio, handle) = create_player(ding); );
call.play(audio);
} }
return Some(call); return Some(call);
} }