Skip to content

Commit

Permalink
feature: Add method to clear guild user cache (discord-net#1767)
Browse files Browse the repository at this point in the history
* 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>
  • Loading branch information
230Daniel and quinchs authored Nov 26, 2021
1 parent b9274d1 commit 19a66bf
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 14 deletions.
4 changes: 2 additions & 2 deletions src/Discord.Net.WebSocket/ClientState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ internal SocketGuild RemoveGuild(ulong id)
if (_guilds.TryRemove(id, out SocketGuild guild))
{
guild.PurgeChannelCache(this);
guild.PurgeGuildUserCache();
guild.PurgeUserCache();
return guild;
}
return null;
Expand All @@ -140,7 +140,7 @@ internal SocketGlobalUser RemoveUser(ulong id)
internal void PurgeUsers()
{
foreach (var guild in _guilds.Values)
guild.PurgeGuildUserCache();
guild.PurgeUserCache();
}

internal SocketApplicationCommand GetCommand(ulong id)
Expand Down
31 changes: 19 additions & 12 deletions src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1144,22 +1144,29 @@ internal SocketGuildUser RemoveUser(ulong id)
}
return null;
}
internal void PurgeGuildUserCache()

/// <summary>
/// Purges this guild's user cache.
/// </summary>
public void PurgeUserCache() => PurgeUserCache(_ => true);
/// <summary>
/// Purges this guild's user cache.
/// </summary>
/// <param name="predicate">The predicate used to select which users to clear.</param>
public void PurgeUserCache(Func<SocketGuildUser, bool> 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<bool>();
DownloadedMemberCount = _members.Count;

foreach (var member in members)
{
if (member.Id != self?.Id)
member.GlobalUser.RemoveRef(Discord);
}
}

/// <summary>
Expand Down

0 comments on commit 19a66bf

Please sign in to comment.