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},
prelude::{Context, Mutex}};
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 {
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 later store them in intervals.
Self {
call
}
}
}
@@ -85,6 +87,21 @@ impl EventHandler for Receiver {
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.
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;
match status {
Ok(_) => {
let call_handle = call.clone();
{
let mut call = call.lock().await;
call.add_global_event(
CoreEvent::SpeakingUpdate.into(),
Receiver::new(),
Receiver::new(call_handle.clone()),
);
call.add_global_event(
CoreEvent::VoicePacket.into(),
Receiver::new(),
Receiver::new(call_handle.clone()),
);
call.add_global_event(
CoreEvent::RtcpPacket.into(),
Receiver::new(),
Receiver::new(call_handle.clone()),
);
call.add_global_event(
CoreEvent::ClientDisconnect.into(),
Receiver::new(),
Receiver::new(call_handle.clone()),
);
call.add_global_event(
CoreEvent::ClientDisconnect.into(),
Receiver::new(),
Receiver::new(call_handle.clone()),
);
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);
call.play(audio);
call.add_global_event(
CoreEvent::DriverConnect.into(),
Receiver::new(call_handle.clone()),
);
}
return Some(call);
}