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