diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs
index f230af00d..0f6a7de34 100644
--- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs
+++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs
@@ -852,6 +852,10 @@ namespace Discord.WebSocket
/// Clears this guild's user cache.
///
public void ClearUserCache() => PurgeGuildUserCache();
+ ///
+ /// Clears this guild's user cache.
+ ///
+ public void ClearUserCache(Func predicate) => PurgeGuildUserCache(predicate);
internal SocketGuildUser AddOrUpdateUser(UserModel model)
{
if (_members.TryGetValue(model.Id, out SocketGuildUser member))
@@ -909,19 +913,23 @@ namespace Discord.WebSocket
}
internal void PurgeGuildUserCache()
{
- var members = Users;
+ PurgeGuildUserCache(x => true);
+ }
+ internal void PurgeGuildUserCache(Func predicate)
+ {
+ var members = Users.Where(predicate);
var self = CurrentUser;
- _members.Clear();
- if (self != null)
- _members.TryAdd(self.Id, self);
-
- DownloadedMemberCount = _members.Count;
foreach (var member in members)
{
if (member.Id != self?.Id)
+ {
+ _members.TryRemove(member.Id, out _);
member.GlobalUser.RemoveRef(Discord);
+ }
}
+
+ DownloadedMemberCount = _members.Count;
}
///