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;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
@@ -15,7 +15,7 @@ namespace Discord
|
|||||||
//public static IReadOnlyCollection<TValue> ToReadOnlyCollection<TKey, TValue>(this IReadOnlyDictionary<TKey, TValue> source)
|
//public static IReadOnlyCollection<TValue> ToReadOnlyCollection<TKey, TValue>(this IReadOnlyDictionary<TKey, TValue> source)
|
||||||
// => new CollectionWrapper<TValue>(source.Select(x => x.Value), () => source.Count);
|
// => new CollectionWrapper<TValue>(source.Select(x => x.Value), () => source.Count);
|
||||||
public static IReadOnlyCollection<TValue> ToReadOnlyCollection<TKey, TValue>(this IDictionary<TKey, TValue> source)
|
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)
|
public static IReadOnlyCollection<TValue> ToReadOnlyCollection<TValue, TSource>(this IEnumerable<TValue> query, IReadOnlyCollection<TSource> source)
|
||||||
=> new CollectionWrapper<TValue>(query, () => source.Count);
|
=> new CollectionWrapper<TValue>(query, () => source.Count);
|
||||||
public static IReadOnlyCollection<TValue> ToReadOnlyCollection<TValue>(this IEnumerable<TValue> query, Func<int> countFunc)
|
public static IReadOnlyCollection<TValue> ToReadOnlyCollection<TValue>(this IEnumerable<TValue> query, Func<int> countFunc)
|
||||||
|
|||||||
@@ -82,6 +82,20 @@ namespace Discord.WebSocket
|
|||||||
}
|
}
|
||||||
return null;
|
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)
|
internal SocketGuild GetGuild(ulong id)
|
||||||
{
|
{
|
||||||
@@ -96,7 +110,11 @@ namespace Discord.WebSocket
|
|||||||
internal SocketGuild RemoveGuild(ulong id)
|
internal SocketGuild RemoveGuild(ulong id)
|
||||||
{
|
{
|
||||||
if (_guilds.TryRemove(id, out SocketGuild guild))
|
if (_guilds.TryRemove(id, out SocketGuild guild))
|
||||||
|
{
|
||||||
|
guild.PurgeChannelCache(this);
|
||||||
|
guild.PurgeGuildUserCache();
|
||||||
return guild;
|
return guild;
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,5 +134,10 @@ namespace Discord.WebSocket
|
|||||||
return user;
|
return user;
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
internal void PurgeUsers()
|
||||||
|
{
|
||||||
|
foreach (var guild in _guilds.Values)
|
||||||
|
guild.PurgeGuildUserCache();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -306,6 +306,14 @@ namespace Discord.WebSocket
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override SocketChannel GetChannel(ulong id)
|
public override SocketChannel GetChannel(ulong id)
|
||||||
=> State.GetChannel(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 />
|
/// <inheritdoc />
|
||||||
public override SocketUser GetUser(ulong id)
|
public override SocketUser GetUser(ulong id)
|
||||||
@@ -313,6 +321,10 @@ namespace Discord.WebSocket
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override SocketUser GetUser(string username, string discriminator)
|
public override SocketUser GetUser(string username, string discriminator)
|
||||||
=> State.Users.FirstOrDefault(x => x.Discriminator == discriminator && x.Username == username);
|
=> 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)
|
internal SocketGlobalUser GetOrCreateUser(ClientState state, Discord.API.User model)
|
||||||
{
|
{
|
||||||
return state.GetOrAddUser(model.Id, x =>
|
return state.GetOrAddUser(model.Id, x =>
|
||||||
|
|||||||
@@ -623,6 +623,13 @@ namespace Discord.WebSocket
|
|||||||
return state.RemoveChannel(id) as SocketGuildChannel;
|
return state.RemoveChannel(id) as SocketGuildChannel;
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
internal void PurgeChannelCache(ClientState state)
|
||||||
|
{
|
||||||
|
foreach (var channelId in _channels)
|
||||||
|
state.RemoveChannel(channelId);
|
||||||
|
|
||||||
|
_channels.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
//Voice Regions
|
//Voice Regions
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -797,6 +804,21 @@ namespace Discord.WebSocket
|
|||||||
}
|
}
|
||||||
return null;
|
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 />
|
/// <inheritdoc />
|
||||||
public async Task DownloadUsersAsync()
|
public async Task DownloadUsersAsync()
|
||||||
|
|||||||
Reference in New Issue
Block a user