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