Caching improvments

This commit is contained in:
RogueException
2015-09-15 19:30:18 -03:00
parent f4a6e8a673
commit dbf7dce1fe
4 changed files with 44 additions and 26 deletions

View File

@@ -14,7 +14,7 @@ namespace Discord.Collections
protected override void OnCreated(Channel item) protected override void OnCreated(Channel item)
{ {
if (item.ServerId != null) if (!item.IsPrivate)
item.Server.AddChannel(item.Id); item.Server.AddChannel(item.Id);
if (item.RecipientId != null) if (item.RecipientId != null)
{ {
@@ -27,7 +27,7 @@ namespace Discord.Collections
} }
protected override void OnRemoved(Channel item) protected override void OnRemoved(Channel item)
{ {
if (item.ServerId != null) if (!item.IsPrivate)
item.Server.RemoveChannel(item.Id); item.Server.RemoveChannel(item.Id);
if (item.RecipientId != null) if (item.RecipientId != null)
{ {

View File

@@ -320,8 +320,9 @@ namespace Discord
text = text.Substring(0, DiscordAPIClient.MaxMessageSize); text = text.Substring(0, DiscordAPIClient.MaxMessageSize);
var model = await _api.EditMessage(channelId, messageId, text, mentions).ConfigureAwait(false); var model = await _api.EditMessage(channelId, messageId, text, mentions).ConfigureAwait(false);
var msg = _messages.GetOrAdd(messageId, channelId, model.Author.Id); var msg = _messages[messageId];
msg.Update(model); if (msg != null)
msg.Update(model);
} }
/// <summary> Deletes the provided message. </summary> /// <summary> Deletes the provided message. </summary>
@@ -384,10 +385,10 @@ namespace Discord
} }
/// <summary> Downloads last count messages from the server, starting at beforeMessageId if it's provided. </summary> /// <summary> Downloads last count messages from the server, starting at beforeMessageId if it's provided. </summary>
public Task<Message[]> DownloadMessages(Channel channel, int count, string beforeMessageId = null) public Task<Message[]> DownloadMessages(Channel channel, int count, string beforeMessageId = null, bool cache = true)
=> DownloadMessages(channel.Id, count); => DownloadMessages(channel.Id, count, beforeMessageId, cache);
/// <summary> Downloads last count messages from the server, starting at beforeMessageId if it's provided. </summary> /// <summary> Downloads last count messages from the server, starting at beforeMessageId if it's provided. </summary>
public async Task<Message[]> DownloadMessages(string channelId, int count, string beforeMessageId = null) public async Task<Message[]> DownloadMessages(string channelId, int count, string beforeMessageId = null, bool cache = true)
{ {
CheckReady(); CheckReady();
if (channelId == null) throw new NullReferenceException(nameof(channelId)); if (channelId == null) throw new NullReferenceException(nameof(channelId));
@@ -402,11 +403,16 @@ namespace Discord
var msgs = await _api.GetMessages(channel.Id, count).ConfigureAwait(false); var msgs = await _api.GetMessages(channel.Id, count).ConfigureAwait(false);
return msgs.Select(x => return msgs.Select(x =>
{ {
var msg = _messages.GetOrAdd(x.Id, x.ChannelId, x.Author.Id); Message msg;
msg.Update(x); 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) if (_config.TrackActivity)
{ {
var user = msg.User; var user = _users[x.Author.Id];
if (user != null) if (user != null)
user.UpdateActivity(x.Timestamp); user.UpdateActivity(x.Timestamp);
} }

View File

@@ -225,9 +225,12 @@ namespace Discord
case "GUILD_UPDATE": case "GUILD_UPDATE":
{ {
var model = e.Payload.ToObject<Events.GuildUpdate>(_serializer); var model = e.Payload.ToObject<Events.GuildUpdate>(_serializer);
var server = _servers.GetOrAdd(model.Id); var server = _servers[model.Id];
server.Update(model); if (server != null)
RaiseEvent(nameof(ServerUpdated), () => RaiseServerUpdated(server)); {
server.Update(model);
RaiseEvent(nameof(ServerUpdated), () => RaiseServerUpdated(server));
}
} }
break; break;
case "GUILD_DELETE": case "GUILD_DELETE":
@@ -251,9 +254,12 @@ namespace Discord
case "CHANNEL_UPDATE": case "CHANNEL_UPDATE":
{ {
var data = e.Payload.ToObject<Events.ChannelUpdate>(_serializer); var data = e.Payload.ToObject<Events.ChannelUpdate>(_serializer);
var channel = _channels.GetOrAdd(data.Id, data.GuildId, data.Recipient?.Id); var channel = _channels[data.Id];
channel.Update(data); if (channel != null)
RaiseEvent(nameof(ChannelUpdated), () => RaiseChannelUpdated(channel)); {
channel.Update(data);
RaiseEvent(nameof(ChannelUpdated), () => RaiseChannelUpdated(channel));
}
} }
break; break;
case "CHANNEL_DELETE": case "CHANNEL_DELETE":
@@ -269,7 +275,7 @@ namespace Discord
case "GUILD_MEMBER_ADD": case "GUILD_MEMBER_ADD":
{ {
var data = e.Payload.ToObject<Events.GuildMemberAdd>(_serializer); var data = e.Payload.ToObject<Events.GuildMemberAdd>(_serializer);
var member = _members.GetOrAdd(data.UserId, data.GuildId); var member = _members.GetOrAdd(data.User.Id, data.GuildId);
member.Update(data); member.Update(data);
RaiseEvent(nameof(MemberAdded), () => RaiseMemberAdded(member)); RaiseEvent(nameof(MemberAdded), () => RaiseMemberAdded(member));
} }
@@ -277,9 +283,12 @@ namespace Discord
case "GUILD_MEMBER_UPDATE": case "GUILD_MEMBER_UPDATE":
{ {
var data = e.Payload.ToObject<Events.GuildMemberUpdate>(_serializer); var data = e.Payload.ToObject<Events.GuildMemberUpdate>(_serializer);
var member = _members.GetOrAdd(data.UserId, data.GuildId); var member = _members[data.User.Id, data.GuildId];
member.Update(data); if (member != null)
RaiseEvent(nameof(MemberUpdated), () => RaiseMemberUpdated(member)); {
member.Update(data);
RaiseEvent(nameof(MemberUpdated), () => RaiseMemberUpdated(member));
}
} }
break; break;
case "GUILD_MEMBER_REMOVE": case "GUILD_MEMBER_REMOVE":
@@ -303,8 +312,9 @@ namespace Discord
case "GUILD_ROLE_UPDATE": case "GUILD_ROLE_UPDATE":
{ {
var data = e.Payload.ToObject<Events.GuildRoleUpdate>(_serializer); var data = e.Payload.ToObject<Events.GuildRoleUpdate>(_serializer);
var role = _roles.GetOrAdd(data.Data.Id, data.GuildId); var role = _roles[data.Data.Id];
role.Update(data.Data); if (role != null)
role.Update(data.Data);
RaiseEvent(nameof(RoleUpdated), () => RaiseRoleUpdated(role)); RaiseEvent(nameof(RoleUpdated), () => RaiseRoleUpdated(role));
} }
break; break;

View File

@@ -136,13 +136,15 @@ namespace Discord
} }
foreach (var subModel in model.VoiceStates) foreach (var subModel in model.VoiceStates)
{ {
var member = members.GetOrAdd(subModel.UserId, Id); var member = members[subModel.UserId, Id];
member.Update(subModel); if (member != null)
member.Update(subModel);
} }
foreach (var subModel in model.Presences) foreach (var subModel in model.Presences)
{ {
var member = members.GetOrAdd(subModel.User.Id, Id); var member = members[subModel.User.Id, Id];
member.Update(subModel); if (member != null)
member.Update(subModel);
} }
} }