From 19a66bf8782e7b8879c6b8b372134e01be0090d7 Mon Sep 17 00:00:00 2001
From: Daniel Baynton <49287178+230Daniel@users.noreply.github.com>
Date: Fri, 26 Nov 2021 15:41:55 +0000
Subject: [PATCH] feature: Add method to clear guild user cache (#1767)
* Add method to clear a SocketGuild's user cache
* Add optional predicate
* Compress overload to be consistant
* Fix global user not clearing (may cause other issues)
* Remove debug code and add param documentation
* Standardise doc string
* Remove old hack-fix
* Rename new method for consistency
* Add missing line to reset downloaderPromise
* Undo accidental whitespace changes
* Rider better actually keep the tab this time
Co-authored-by: Quin Lynch <49576606+quinchs@users.noreply.github.com>
---
src/Discord.Net.WebSocket/ClientState.cs | 4 +--
.../Entities/Guilds/SocketGuild.cs | 31 ++++++++++++-------
2 files changed, 21 insertions(+), 14 deletions(-)
diff --git a/src/Discord.Net.WebSocket/ClientState.cs b/src/Discord.Net.WebSocket/ClientState.cs
index 7129feb48..c40ae3f92 100644
--- a/src/Discord.Net.WebSocket/ClientState.cs
+++ b/src/Discord.Net.WebSocket/ClientState.cs
@@ -115,7 +115,7 @@ namespace Discord.WebSocket
if (_guilds.TryRemove(id, out SocketGuild guild))
{
guild.PurgeChannelCache(this);
- guild.PurgeGuildUserCache();
+ guild.PurgeUserCache();
return guild;
}
return null;
@@ -140,7 +140,7 @@ namespace Discord.WebSocket
internal void PurgeUsers()
{
foreach (var guild in _guilds.Values)
- guild.PurgeGuildUserCache();
+ guild.PurgeUserCache();
}
internal SocketApplicationCommand GetCommand(ulong id)
diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs
index 03c655a34..697d5fe82 100644
--- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs
+++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs
@@ -1144,22 +1144,29 @@ namespace Discord.WebSocket
}
return null;
}
- internal void PurgeGuildUserCache()
+
+ ///
+ /// Purges this guild's user cache.
+ ///
+ public void PurgeUserCache() => PurgeUserCache(_ => true);
+ ///
+ /// Purges this guild's user cache.
+ ///
+ /// The predicate used to select which users to clear.
+ public void PurgeUserCache(Func predicate)
{
- var members = Users;
- var self = CurrentUser;
- _members.Clear();
- if (self != null)
- _members.TryAdd(self.Id, self);
+ var membersToPurge = Users.Where(x => predicate.Invoke(x) && x?.Id != Discord.CurrentUser.Id);
+ var membersToKeep = Users.Where(x => !predicate.Invoke(x) || x?.Id == Discord.CurrentUser.Id);
+
+ foreach (var member in membersToPurge)
+ if(_members.TryRemove(member.Id, out _))
+ member.GlobalUser.RemoveRef(Discord);
+
+ foreach (var member in membersToKeep)
+ _members.TryAdd(member.Id, member);
_downloaderPromise = new TaskCompletionSource();
DownloadedMemberCount = _members.Count;
-
- foreach (var member in members)
- {
- if (member.Id != self?.Id)
- member.GlobalUser.RemoveRef(Discord);
- }
}
///