Caching improvments
This commit is contained in:
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user