From d23c86fb995f7684ce6df52c40157a5a0fbb4b68 Mon Sep 17 00:00:00 2001 From: Natsu Kagami Date: Wed, 6 Mar 2024 16:38:50 +0100 Subject: [PATCH] Don't retry the members endpoint too much --- youmubot-prelude/src/member_cache.rs | 29 ++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/youmubot-prelude/src/member_cache.rs b/youmubot-prelude/src/member_cache.rs index a05167d..926d29b 100644 --- a/youmubot-prelude/src/member_cache.rs +++ b/youmubot-prelude/src/member_cache.rs @@ -1,3 +1,4 @@ +use anyhow::bail; use chrono::{DateTime, Utc}; use serenity::model::{ guild::Member, @@ -9,6 +10,7 @@ use std::sync::Arc; use tokio::sync::Mutex; const VALID_CACHE_SECONDS: i64 = 15 * 60; // 15 minutes +const INVALID_CACHE_SECONDS: i64 = 2 * 60; // 2 minutes type Map = Mutex>; @@ -16,7 +18,7 @@ type Map = Mutex>; #[derive(Debug, Default)] pub struct MemberCache { per_user: Map<(UserId, GuildId), Expiring>>, - per_guild: Map>>, + per_guild: Map>>>, } #[derive(Debug)] @@ -90,21 +92,32 @@ impl MemberCache { // Check cache if let Entry::Occupied(oe) = &entry { if oe.get().timeout > now { - return Ok(oe.get().value.clone()); + return match &oe.get().value { + Some(v) => Ok(v.clone()), + None => bail!("guild members for {} unavailable", guild_id), + }; } } // query eprintln!("querying members of {}", guild_id); - let members: Arc<[Member]> = guild_id + let members: Option> = guild_id .members(cache_http.http(), None, None) - .await? - .into(); - Ok(entry + .await + .ok() + .map(|v| v.into()); + match &entry .or_insert(Expiring::new( members.clone(), - now + chrono::Duration::seconds(VALID_CACHE_SECONDS), + now + chrono::Duration::seconds(if members.is_some() { + VALID_CACHE_SECONDS + } else { + INVALID_CACHE_SECONDS + }), )) .value - .clone()) + { + Some(v) => Ok(v.clone()), + None => bail!("guild members for {} unavailable", guild_id), + } } }