feature: Add cache purging methods (#1478)

This commit is contained in:
Joe4evr
2020-05-07 15:16:57 +02:00
committed by GitHub
parent b6c981227d
commit c68cc85895
4 changed files with 59 additions and 2 deletions

View File

@@ -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)

View File

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

View File

@@ -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 =>

View File

@@ -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()