From dbf7dce1fe97694d7f93e324b8ef8b37abb9b8bc Mon Sep 17 00:00:00 2001 From: RogueException Date: Tue, 15 Sep 2015 19:30:18 -0300 Subject: [PATCH] Caching improvments --- src/Discord.Net/Collections/Channels.cs | 4 +-- src/Discord.Net/DiscordClient.API.cs | 22 ++++++++++------ src/Discord.Net/DiscordClient.cs | 34 ++++++++++++++++--------- src/Discord.Net/Models/Server.cs | 10 +++++--- 4 files changed, 44 insertions(+), 26 deletions(-) diff --git a/src/Discord.Net/Collections/Channels.cs b/src/Discord.Net/Collections/Channels.cs index c8f9c32a1..5f0a681db 100644 --- a/src/Discord.Net/Collections/Channels.cs +++ b/src/Discord.Net/Collections/Channels.cs @@ -14,7 +14,7 @@ namespace Discord.Collections protected override void OnCreated(Channel item) { - if (item.ServerId != null) + if (!item.IsPrivate) item.Server.AddChannel(item.Id); if (item.RecipientId != null) { @@ -27,7 +27,7 @@ namespace Discord.Collections } protected override void OnRemoved(Channel item) { - if (item.ServerId != null) + if (!item.IsPrivate) item.Server.RemoveChannel(item.Id); if (item.RecipientId != null) { diff --git a/src/Discord.Net/DiscordClient.API.cs b/src/Discord.Net/DiscordClient.API.cs index 6b4b2feb6..923e64f35 100644 --- a/src/Discord.Net/DiscordClient.API.cs +++ b/src/Discord.Net/DiscordClient.API.cs @@ -320,8 +320,9 @@ namespace Discord text = text.Substring(0, DiscordAPIClient.MaxMessageSize); var model = await _api.EditMessage(channelId, messageId, text, mentions).ConfigureAwait(false); - var msg = _messages.GetOrAdd(messageId, channelId, model.Author.Id); - msg.Update(model); + var msg = _messages[messageId]; + if (msg != null) + msg.Update(model); } /// Deletes the provided message. @@ -384,10 +385,10 @@ namespace Discord } /// Downloads last count messages from the server, starting at beforeMessageId if it's provided. - public Task DownloadMessages(Channel channel, int count, string beforeMessageId = null) - => DownloadMessages(channel.Id, count); + public Task DownloadMessages(Channel channel, int count, string beforeMessageId = null, bool cache = true) + => DownloadMessages(channel.Id, count, beforeMessageId, cache); /// Downloads last count messages from the server, starting at beforeMessageId if it's provided. - public async Task DownloadMessages(string channelId, int count, string beforeMessageId = null) + public async Task DownloadMessages(string channelId, int count, string beforeMessageId = null, bool cache = true) { CheckReady(); if (channelId == null) throw new NullReferenceException(nameof(channelId)); @@ -402,11 +403,16 @@ namespace Discord var msgs = await _api.GetMessages(channel.Id, count).ConfigureAwait(false); return msgs.Select(x => { - var msg = _messages.GetOrAdd(x.Id, x.ChannelId, x.Author.Id); - msg.Update(x); + Message msg; + if (cache) + msg = _messages.GetOrAdd(x.Id, x.ChannelId, x.Author.Id); + else + msg = _messages[x.Id] ?? new Message(this, x.Id, x.ChannelId, x.Author.Id); + if (msg != null) + msg.Update(x); if (_config.TrackActivity) { - var user = msg.User; + var user = _users[x.Author.Id]; if (user != null) user.UpdateActivity(x.Timestamp); } diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index f91ac46f3..e7311d598 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -225,9 +225,12 @@ namespace Discord case "GUILD_UPDATE": { var model = e.Payload.ToObject(_serializer); - var server = _servers.GetOrAdd(model.Id); - server.Update(model); - RaiseEvent(nameof(ServerUpdated), () => RaiseServerUpdated(server)); + var server = _servers[model.Id]; + if (server != null) + { + server.Update(model); + RaiseEvent(nameof(ServerUpdated), () => RaiseServerUpdated(server)); + } } break; case "GUILD_DELETE": @@ -251,9 +254,12 @@ namespace Discord case "CHANNEL_UPDATE": { var data = e.Payload.ToObject(_serializer); - var channel = _channels.GetOrAdd(data.Id, data.GuildId, data.Recipient?.Id); - channel.Update(data); - RaiseEvent(nameof(ChannelUpdated), () => RaiseChannelUpdated(channel)); + var channel = _channels[data.Id]; + if (channel != null) + { + channel.Update(data); + RaiseEvent(nameof(ChannelUpdated), () => RaiseChannelUpdated(channel)); + } } break; case "CHANNEL_DELETE": @@ -269,7 +275,7 @@ namespace Discord case "GUILD_MEMBER_ADD": { var data = e.Payload.ToObject(_serializer); - var member = _members.GetOrAdd(data.UserId, data.GuildId); + var member = _members.GetOrAdd(data.User.Id, data.GuildId); member.Update(data); RaiseEvent(nameof(MemberAdded), () => RaiseMemberAdded(member)); } @@ -277,9 +283,12 @@ namespace Discord case "GUILD_MEMBER_UPDATE": { var data = e.Payload.ToObject(_serializer); - var member = _members.GetOrAdd(data.UserId, data.GuildId); - member.Update(data); - RaiseEvent(nameof(MemberUpdated), () => RaiseMemberUpdated(member)); + var member = _members[data.User.Id, data.GuildId]; + if (member != null) + { + member.Update(data); + RaiseEvent(nameof(MemberUpdated), () => RaiseMemberUpdated(member)); + } } break; case "GUILD_MEMBER_REMOVE": @@ -303,8 +312,9 @@ namespace Discord case "GUILD_ROLE_UPDATE": { var data = e.Payload.ToObject(_serializer); - var role = _roles.GetOrAdd(data.Data.Id, data.GuildId); - role.Update(data.Data); + var role = _roles[data.Data.Id]; + if (role != null) + role.Update(data.Data); RaiseEvent(nameof(RoleUpdated), () => RaiseRoleUpdated(role)); } break; diff --git a/src/Discord.Net/Models/Server.cs b/src/Discord.Net/Models/Server.cs index 360c9999c..3b0dc966f 100644 --- a/src/Discord.Net/Models/Server.cs +++ b/src/Discord.Net/Models/Server.cs @@ -136,13 +136,15 @@ namespace Discord } foreach (var subModel in model.VoiceStates) { - var member = members.GetOrAdd(subModel.UserId, Id); - member.Update(subModel); + var member = members[subModel.UserId, Id]; + if (member != null) + member.Update(subModel); } foreach (var subModel in model.Presences) { - var member = members.GetOrAdd(subModel.User.Id, Id); - member.Update(subModel); + var member = members[subModel.User.Id, Id]; + if (member != null) + member.Update(subModel); } }