Browse Source

Caching improvments

tags/docs-0.9
RogueException 9 years ago
parent
commit
dbf7dce1fe
4 changed files with 44 additions and 26 deletions
  1. +2
    -2
      src/Discord.Net/Collections/Channels.cs
  2. +14
    -8
      src/Discord.Net/DiscordClient.API.cs
  3. +22
    -12
      src/Discord.Net/DiscordClient.cs
  4. +6
    -4
      src/Discord.Net/Models/Server.cs

+ 2
- 2
src/Discord.Net/Collections/Channels.cs 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)
{ {


+ 14
- 8
src/Discord.Net/DiscordClient.API.cs 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);
msg.Update(model);
var msg = _messages[messageId];
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)
=> DownloadMessages(channel.Id, count);
public Task<Message[]> DownloadMessages(Channel channel, int count, string beforeMessageId = null, bool cache = true)
=> 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);
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) 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);
} }


+ 22
- 12
src/Discord.Net/DiscordClient.cs 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);
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; 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);
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; 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);
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; 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);
role.Update(data.Data);
var role = _roles[data.Data.Id];
if (role != null)
role.Update(data.Data);
RaiseEvent(nameof(RoleUpdated), () => RaiseRoleUpdated(role)); RaiseEvent(nameof(RoleUpdated), () => RaiseRoleUpdated(role));
} }
break; break;


+ 6
- 4
src/Discord.Net/Models/Server.cs 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);
member.Update(subModel);
var member = members[subModel.UserId, Id];
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);
member.Update(subModel);
var member = members[subModel.User.Id, Id];
if (member != null)
member.Update(subModel);
} }
} }




Loading…
Cancel
Save