feature: Add cache purging methods (#1478)
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
@@ -15,7 +15,7 @@ namespace Discord
|
||||
//public static IReadOnlyCollection<TValue> ToReadOnlyCollection<TKey, TValue>(this IReadOnlyDictionary<TKey, TValue> source)
|
||||
// => new CollectionWrapper<TValue>(source.Select(x => x.Value), () => source.Count);
|
||||
public static IReadOnlyCollection<TValue> ToReadOnlyCollection<TKey, TValue>(this IDictionary<TKey, TValue> source)
|
||||
=> new CollectionWrapper<TValue>(source.Select(x => x.Value), () => source.Count);
|
||||
=> new CollectionWrapper<TValue>(source.Values, () => source.Count);
|
||||
public static IReadOnlyCollection<TValue> ToReadOnlyCollection<TValue, TSource>(this IEnumerable<TValue> query, IReadOnlyCollection<TSource> source)
|
||||
=> new CollectionWrapper<TValue>(query, () => source.Count);
|
||||
public static IReadOnlyCollection<TValue> ToReadOnlyCollection<TValue>(this IEnumerable<TValue> query, Func<int> countFunc)
|
||||
|
||||
@@ -82,6 +82,20 @@ namespace Discord.WebSocket
|
||||
}
|
||||
return null;
|
||||
}
|
||||
internal void PurgeAllChannels()
|
||||
{
|
||||
foreach (var guild in _guilds.Values)
|
||||
guild.PurgeChannelCache(this);
|
||||
|
||||
PurgeDMChannels();
|
||||
}
|
||||
internal void PurgeDMChannels()
|
||||
{
|
||||
foreach (var channel in _dmChannels.Values)
|
||||
_channels.TryRemove(channel.Id, out _);
|
||||
|
||||
_dmChannels.Clear();
|
||||
}
|
||||
|
||||
internal SocketGuild GetGuild(ulong id)
|
||||
{
|
||||
@@ -96,7 +110,11 @@ namespace Discord.WebSocket
|
||||
internal SocketGuild RemoveGuild(ulong id)
|
||||
{
|
||||
if (_guilds.TryRemove(id, out SocketGuild guild))
|
||||
{
|
||||
guild.PurgeChannelCache(this);
|
||||
guild.PurgeGuildUserCache();
|
||||
return guild;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -116,5 +134,10 @@ namespace Discord.WebSocket
|
||||
return user;
|
||||
return null;
|
||||
}
|
||||
internal void PurgeUsers()
|
||||
{
|
||||
foreach (var guild in _guilds.Values)
|
||||
guild.PurgeGuildUserCache();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -306,6 +306,14 @@ namespace Discord.WebSocket
|
||||
/// <inheritdoc />
|
||||
public override SocketChannel GetChannel(ulong id)
|
||||
=> State.GetChannel(id);
|
||||
/// <summary>
|
||||
/// Clears all cached channels from the client.
|
||||
/// </summary>
|
||||
public void PurgeChannelCache() => State.PurgeAllChannels();
|
||||
/// <summary>
|
||||
/// Clears cached DM channels from the client.
|
||||
/// </summary>
|
||||
public void PurgeDMChannelCache() => State.PurgeDMChannels();
|
||||
|
||||
/// <inheritdoc />
|
||||
public override SocketUser GetUser(ulong id)
|
||||
@@ -313,6 +321,10 @@ namespace Discord.WebSocket
|
||||
/// <inheritdoc />
|
||||
public override SocketUser GetUser(string username, string discriminator)
|
||||
=> State.Users.FirstOrDefault(x => x.Discriminator == discriminator && x.Username == username);
|
||||
/// <summary>
|
||||
/// Clears cached users from the client.
|
||||
/// </summary>
|
||||
public void PurgeUserCache() => State.PurgeUsers();
|
||||
internal SocketGlobalUser GetOrCreateUser(ClientState state, Discord.API.User model)
|
||||
{
|
||||
return state.GetOrAddUser(model.Id, x =>
|
||||
|
||||
@@ -623,6 +623,13 @@ namespace Discord.WebSocket
|
||||
return state.RemoveChannel(id) as SocketGuildChannel;
|
||||
return null;
|
||||
}
|
||||
internal void PurgeChannelCache(ClientState state)
|
||||
{
|
||||
foreach (var channelId in _channels)
|
||||
state.RemoveChannel(channelId);
|
||||
|
||||
_channels.Clear();
|
||||
}
|
||||
|
||||
//Voice Regions
|
||||
/// <summary>
|
||||
@@ -797,6 +804,21 @@ namespace Discord.WebSocket
|
||||
}
|
||||
return null;
|
||||
}
|
||||
internal void PurgeGuildUserCache()
|
||||
{
|
||||
var members = Users;
|
||||
var self = CurrentUser;
|
||||
_members.Clear();
|
||||
_members.TryAdd(self.Id, self);
|
||||
|
||||
DownloadedMemberCount = _members.Count;
|
||||
|
||||
foreach (var member in members)
|
||||
{
|
||||
if (member.Id != self.Id)
|
||||
member.GlobalUser.RemoveRef(Discord);
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task DownloadUsersAsync()
|
||||
|
||||
Reference in New Issue
Block a user