From ae47f6bee2e19cacbf3869cf2a5ce01f250802a2 Mon Sep 17 00:00:00 2001 From: Daniel Baynton Date: Thu, 4 Feb 2021 17:06:57 +0000 Subject: [PATCH] Fix global user not clearing (may cause other issues) --- src/Discord.Net.WebSocket/DiscordSocketClient.cs | 6 ++++++ .../Entities/Guilds/SocketGuild.cs | 16 +++++++--------- .../Entities/Users/SocketGlobalUser.cs | 2 +- 3 files changed, 14 insertions(+), 10 deletions(-) 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); } }