aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Perry <np@nathanperry.dev>2024-08-17 03:19:35 -0400
committerNathan Perry <np@nathanperry.dev>2024-08-17 03:19:35 -0400
commit84cc4aa3cf1d35909939e647720069f086b2cd05 (patch)
tree21ecd0f7931c33abc3cdede3a14cec6848f0d4cb
parent6c686b8b3cd9e5769156321a8d05f737196ee375 (diff)
do playback info gc
-rw-r--r--src/bot.rs94
1 files changed, 74 insertions, 20 deletions
diff --git a/src/bot.rs b/src/bot.rs
index 38029cf..704d699 100644
--- a/src/bot.rs
+++ b/src/bot.rs
@@ -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");