Browse Source

Fix global user not clearing (may cause other issues)

pull/1767/head
Daniel Baynton 4 years ago
parent
commit
ae47f6bee2
3 changed files with 14 additions and 10 deletions
  1. +6
    -0
      src/Discord.Net.WebSocket/DiscordSocketClient.cs
  2. +7
    -9
      src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs
  3. +1
    -1
      src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs

+ 6
- 0
src/Discord.Net.WebSocket/DiscordSocketClient.cs View File

@@ -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)}";
}

/// <summary>
/// Provides access to a REST-only client with a shared state from this client.
/// </summary>


+ 7
- 9
src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs View File

@@ -914,17 +914,15 @@ namespace Discord.WebSocket
internal void PurgeGuildUserCache() => PurgeGuildUserCache(x => true);
internal void PurgeGuildUserCache(Func<SocketGuildUser, bool> 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;
}


+ 1
- 1
src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs View File

@@ -44,7 +44,7 @@ namespace Discord.WebSocket
{
lock (_lockObj)
{
if (--_references <= 0)
if (--_references <= 1)
discord.RemoveUser(Id);
}
}


Loading…
Cancel
Save