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