diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs
index b43db5d98..2c46dc539 100644
--- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs
+++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs
@@ -46,6 +46,12 @@ namespace Discord.WebSocket
private bool _guildSubscriptions;
private GatewayIntents? _gatewayIntents;
+ // temporary for debugging
+ public string GetDebugOutput()
+ {
+ return $"Guilds: {State.Guilds.Count}, Channels: {State.Channels.Count}, DM Channels: {State.DMChannels.Count}, Private Channels: {State.PrivateChannels.Count}, Group Channels: {State.GroupChannels.Count}, Global Users: {State.Users.Count}, Guild Users: {Guilds.Sum(x => x.Users.Count)}";
+ }
+
///
/// Provides access to a REST-only client with a shared state from this client.
///
diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs
index 4c76031c4..4cfe7b59d 100644
--- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs
+++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs
@@ -914,17 +914,15 @@ namespace Discord.WebSocket
internal void PurgeGuildUserCache() => PurgeGuildUserCache(x => true);
internal void PurgeGuildUserCache(Func predicate)
{
- var members = Users.Where(predicate);
- var self = CurrentUser;
+ 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 members)
- {
- if (member.Id != self?.Id)
- {
- _members.TryRemove(member.Id, out _);
+ 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);
DownloadedMemberCount = _members.Count;
}
diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs
index 48de7552a..45ec799d3 100644
--- a/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs
+++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs
@@ -44,7 +44,7 @@ namespace Discord.WebSocket
{
lock (_lockObj)
{
- if (--_references <= 0)
+ if (--_references <= 1)
discord.RemoveUser(Id);
}
}