From 0bee437e5321c02d45b984ae678676df36ac2aa0 Mon Sep 17 00:00:00 2001 From: Johannes Heuel Date: Mon, 17 Jun 2024 17:06:59 +0200 Subject: [PATCH] save media source in metadata typemap --- src/commands/loop_queue.rs | 77 +++++++++++++++++++++----------------- src/commands/play.rs | 15 ++++---- src/commands/skip.rs | 2 +- src/main.rs | 1 - src/metadata.rs | 4 +- src/state.rs | 4 +- 6 files changed, 56 insertions(+), 47 deletions(-) diff --git a/src/commands/loop_queue.rs b/src/commands/loop_queue.rs index 50f8090..689c09b 100644 --- a/src/commands/loop_queue.rs +++ b/src/commands/loop_queue.rs @@ -1,6 +1,6 @@ -use crate::state::{State, StateRef}; +use crate::metadata::MetadataMap; +use crate::state::{Settings, State, StateRef}; use async_trait::async_trait; -use songbird::input::Compose; use songbird::{Event, EventContext, EventHandler, TrackEvent}; use std::ops::Sub; use std::time::Duration; @@ -29,12 +29,21 @@ pub(crate) async fn loop_queue( return Ok(()); }; - let looping = if let Some(mut settings) = state.guild_settings.get_mut(&guild_id) { + state + .guild_settings + .entry(guild_id) + .or_insert_with(|| Settings { loop_queue: false }); + + state.guild_settings.entry(guild_id).and_modify(|settings| { settings.loop_queue = !settings.loop_queue; - settings.loop_queue - } else { - false - }; + println!("loop_queue: {}", settings.loop_queue); + }); + + let looping = state + .guild_settings + .get(&guild_id) + .expect("Cannot get loop state") + .loop_queue; if let Some(call_lock) = state.songbird.get(guild_id) { let mut call = call_lock.lock().await; @@ -47,10 +56,11 @@ pub(crate) async fn loop_queue( ); } - let mut message = "I'm not looping anymore!".to_string(); - if looping { - message = "I'm now looping the current queue!".to_string(); - } + let message = if looping { + "I'm now looping the current queue!".to_string() + } else { + "I'm not looping anymore!".to_string() + }; let interaction_response_data = InteractionResponseDataBuilder::new() .content(message) @@ -91,29 +101,28 @@ impl EventHandler for TrackEndNotifier { return None; }; let (_, track_handle) = track_list.first()?; - if let Some(yt) = self - .state - .tracks - .get(&self.guild_id) - .unwrap() - .get(&track_handle.uuid()) - { - let mut src = yt.clone(); - if let Ok(metadata) = src.aux_metadata().await { - if let Some(call_lock) = self.state.songbird.get(self.guild_id) { - let mut call = call_lock.lock().await; - call.enqueue_with_preload( - src.into(), - metadata.duration.map(|duration| -> Duration { - if duration.as_secs() > 5 { - duration.sub(Duration::from_secs(5)) - } else { - duration - } - }), - ); - } - } + if let Some(call_lock) = self.state.songbird.get(self.guild_id) { + let mut call = call_lock.lock().await; + + // get metadata from finished track + let old_typemap_lock = track_handle.typemap().read().await; + let old_metadata = old_typemap_lock.get::().unwrap(); + + // enqueue track + let handle = call.enqueue_with_preload( + old_metadata.src.clone().into(), + old_metadata.duration.map(|duration| -> Duration { + if duration.as_secs() > 5 { + duration.sub(Duration::from_secs(5)) + } else { + duration + } + }), + ); + + // insert metadata into new track + let mut new_typemap = handle.typemap().write().await; + new_typemap.insert::(old_metadata.clone()); } None } diff --git a/src/commands/play.rs b/src/commands/play.rs index 2b986ec..d97e9a6 100644 --- a/src/commands/play.rs +++ b/src/commands/play.rs @@ -138,13 +138,13 @@ pub(crate) async fn play( tracing::debug!("track: {:?}", track); let url = track.url.clone().or(track.original_url.clone()).ok_or("")?; let mut src = YoutubeDl::new(reqwest::Client::new(), url.clone()); - let s = src.clone(); - let track: Track = src.clone().into(); - state - .tracks - .entry(guild_id) - .or_default() - .insert(track.uuid, s); + let src_copy = src.clone(); + let track: Track = src_copy.into(); + //state + // .tracks + // .entry(guild_id) + // .or_default() + // .insert(track.uuid, src); if let Ok(metadata) = src.aux_metadata().await { debug!("metadata: {:?}", metadata); @@ -167,6 +167,7 @@ pub(crate) async fn play( title: metadata.title, duration: metadata.duration, url, + src, }); } } diff --git a/src/commands/skip.rs b/src/commands/skip.rs index dac7c57..1d9ece0 100644 --- a/src/commands/skip.rs +++ b/src/commands/skip.rs @@ -27,7 +27,7 @@ pub(crate) async fn skip( } let interaction_response_data = InteractionResponseDataBuilder::new() - .content("Skipped the next track") + .content("Skipped a track") .build(); let response = InteractionResponse { diff --git a/src/main.rs b/src/main.rs index cb2aeb0..ed9b954 100644 --- a/src/main.rs +++ b/src/main.rs @@ -78,7 +78,6 @@ async fn main() -> Result<(), Box> { songbird, standby: Standby::new(), guild_settings: Default::default(), - tracks: Default::default(), }), ) }; diff --git a/src/metadata.rs b/src/metadata.rs index 522aa1a..c7f0306 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -1,10 +1,12 @@ -use songbird::typemap::TypeMapKey; +use songbird::{input::YoutubeDl, typemap::TypeMapKey}; use std::time::Duration; +#[derive(Clone)] pub(crate) struct Metadata { pub(crate) title: Option, pub(crate) duration: Option, pub(crate) url: String, + pub(crate) src: YoutubeDl, } pub(crate) struct MetadataMap; diff --git a/src/state.rs b/src/state.rs index 7c059dc..df881bc 100644 --- a/src/state.rs +++ b/src/state.rs @@ -1,11 +1,10 @@ use dashmap::DashMap; -use songbird::{input::YoutubeDl, Songbird}; +use songbird::Songbird; use std::sync::Arc; use twilight_cache_inmemory::InMemoryCache; use twilight_http::Client as HttpClient; use twilight_model::id::{marker::GuildMarker, Id}; use twilight_standby::Standby; -use uuid::Uuid; pub(crate) type State = Arc; @@ -21,5 +20,4 @@ pub(crate) struct StateRef { pub(crate) songbird: Songbird, pub(crate) standby: Standby, pub(crate) guild_settings: DashMap, Settings>, - pub(crate) tracks: DashMap, DashMap>, } -- 2.49.1