diff --git a/src/main.rs b/src/main.rs index cc53b6e..c7cc245 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,4 @@ +use core::error; use dialoguer::Select; use dialoguer::theme::ColorfulTheme; use modules::*; @@ -11,7 +12,10 @@ use serenity::async_trait; use serenity::model::channel::Message; use serenity::model::gateway::Ready; use serenity::prelude::*; +use songbird::Event; +use songbird::EventContext; use songbird::SerenityInit; +use songbird::events::EventHandler as VoiceEventHandler; use songbird::get; use songbird::input::HlsRequest; use songbird::input::Input; @@ -20,6 +24,33 @@ use std::process::Command; use std::process::Stdio; pub mod modules; +struct TrackTraceHandler { + otel_ctx: opentelemetry::Context, + guild_id: String, + track_url: String, + event_name: &'static str, +} + +#[async_trait] +impl VoiceEventHandler for TrackTraceHandler { + async fn act(&self, ctx: &EventContext<'_>) -> Option { + let tracer = global::tracer("RhythmWorks"); + let track_status = if let EventContext::Track(track_list) = ctx { + track_list.first().map(|state| format!("{:?}", state.0)) + } else { + None + }; + tracer.in_span(self.event_name, |cx| { + cx.span() + .set_attribute(KeyValue::new("Guild_ID", self.guild_id.clone())); + cx.span() + .set_attribute(KeyValue::new("Youtube_URL", self.track_url.clone())); + cx.span().add_event(self.event_name, vec![KeyValue::new("track_status", track_status.unwrap().to_string())]); + }); + + None + } +} struct Handler; fn get_user_voice_channel(ctx: &Context, msg: &Message) -> Option { let guild_id = msg.guild_id?; @@ -211,7 +242,8 @@ impl EventHandler for Handler { .to_string(); let mut call = handler_lock.lock().await; let input = Input::from(HlsRequest::new(reqwest::Client::new(), stream_url)); - let _ = call.enqueue_input(input).await; + let track_handle = call.enqueue_input(input).await; + let otel_ctx = opentelemetry::Context::current(); let position = call.queue().len(); let response = if position == 1 { cx.span().add_event( @@ -227,6 +259,33 @@ impl EventHandler for Handler { format!("🎶 Added Song to Queue: #{}", position) }; let _ = msg.channel_id.say(&ctx.http, response).await; + let _ = track_handle.add_event( + Event::Track(songbird::events::TrackEvent::Play), + TrackTraceHandler { + otel_ctx: otel_ctx.clone(), + guild_id: guild_id.to_string().clone(), + track_url: yt_url.clone(), + event_name: "Track Started Playing", + }, + ); + let _ = track_handle.add_event( + Event::Track(songbird::events::TrackEvent::End), + TrackTraceHandler { + otel_ctx: otel_ctx.clone(), + guild_id: guild_id.to_string().clone(), + track_url: yt_url.clone(), + event_name: "Track Finished", + }, + ); + let _ = track_handle.add_event( + Event::Track(songbird::events::TrackEvent::Error), + TrackTraceHandler { + otel_ctx: otel_ctx.clone(), + guild_id: guild_id.to_string().clone(), + track_url: yt_url.clone(), + event_name: "Playback had an error", + }, + ); } if msg.content == "!skip" { let guild_id = match msg.guild_id {