diff options
| author | Nathan Perry <np@nathanperry.dev> | 2024-08-17 03:19:35 -0400 |
|---|---|---|
| committer | Nathan Perry <np@nathanperry.dev> | 2024-08-17 03:19:35 -0400 |
| commit | 84cc4aa3cf1d35909939e647720069f086b2cd05 (patch) | |
| tree | 21ecd0f7931c33abc3cdede3a14cec6848f0d4cb | |
| parent | 6c686b8b3cd9e5769156321a8d05f737196ee375 (diff) | |
do playback info gc
| -rw-r--r-- | src/bot.rs | 94 |
1 files changed, 74 insertions, 20 deletions
@@ -1,13 +1,12 @@ -use std::{ - collections::HashSet, - fs::File, - future::Future, - path::PathBuf, - pin::Pin, - str::FromStr, - sync::Arc, +use crate::{ + commands, + config::CONFIG, + err_msg, + util, + util::OAUTH_URL, + PoiseContext, + PoiseData, }; - use chrono::Datelike; use dashmap::DashMap; use fnv::{ @@ -45,16 +44,19 @@ use songbird::{ SerenityInit, TrackEvent, }; -use tokio::sync::Mutex; - -use crate::{ - commands, - config::CONFIG, - err_msg, - util, - util::OAUTH_URL, - PoiseContext, - PoiseData, +use std::{ + collections::HashSet, + fs::File, + future::Future, + path::PathBuf, + pin::Pin, + str::FromStr, + sync::Arc, + time::Duration, +}; +use tokio::{ + sync::Mutex, + time::MissedTickBehavior, }; pub struct HttpKey; @@ -472,16 +474,20 @@ pub async fn run() -> anyhow::Result<()> { let sb_config = songbird::Config::default(); + let playback_data = Arc::new(DashMap::new()); + let mut client = Client::builder(token, GatewayIntents::non_privileged() | GatewayIntents::MESSAGE_CONTENT) .event_handler(Handler) .register_songbird_from_config(sb_config) .type_map_insert::<HttpKey>(reqwest::Client::new()) .type_map_insert::<VolumeKey>(DashMap::new()) - .type_map_insert::<PlaybackKey>(Arc::new(DashMap::new())) + .type_map_insert::<PlaybackKey>(playback_data.clone()) .framework(framework().await) .await?; + let client_data = client.data.clone(); + let shard_manager = client.shard_manager.clone(); let run_handle = tokio::spawn(async move { @@ -489,6 +495,54 @@ pub async fn run() -> anyhow::Result<()> { client.start().await.expect("running discord client"); }); + let mut ticker = tokio::time::interval(Duration::from_secs(10)); + ticker.set_missed_tick_behavior(MissedTickBehavior::Skip); + + tokio::spawn(async move { + loop { + ticker.tick().await; + + tracing::debug!("running songbird info gc"); + + let Some(songbird) = ({ + let data = client_data.read().await; + data.get::<songbird::SongbirdKey>().map(|x| x.clone()) + }) else { + tracing::warn!("gc songbird data: no songbird in state"); + continue; + }; + + let mut active_uuids = HashSet::new(); + + for (guild_id, call) in songbird.into_iter() { + let tracks = { + let call = call.lock().await; + call.queue().current_queue() + }; + + tracing::trace!(%guild_id, queued_tracks = tracks.len()); + active_uuids.extend(tracks.into_iter().map(|track| track.uuid())); + } + + let mut n_removed = 0; + playback_data.retain(|k, _v| { + let result = active_uuids.contains(k); + + if !result { + n_removed += 1; + } + + result + }); + + tracing::debug!( + queued_tracks = active_uuids.len(), + n_gced = n_removed, + "songbird info gc done" + ); + } + }); + tokio::signal::ctrl_c().await?; tracing::warn!("got ^C, gracefully halting discord"); |
