Browse Source

feature: Add cache purging methods (#1478)

tags/2.3.0
Joe4evr GitHub 5 years ago
parent
commit
c68cc85895
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 59 additions and 2 deletions
  1. +2
    -2
      src/Discord.Net.Core/Extensions/CollectionExtensions.cs
  2. +23
    -0
      src/Discord.Net.WebSocket/ClientState.cs
  3. +12
    -0
      src/Discord.Net.WebSocket/DiscordSocketClient.cs
  4. +22
    -0
      src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs

+ 2
- 2
src/Discord.Net.Core/Extensions/CollectionExtensions.cs 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)


+ 23
- 0
src/Discord.Net.WebSocket/ClientState.cs 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();
}
}
}

+ 12
- 0
src/Discord.Net.WebSocket/DiscordSocketClient.cs 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 =>


+ 22
- 0
src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs 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()


Loading…
Cancel
Save