@@ -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) | |||
{ | |||
@@ -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); | |||
} | |||
/// <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> | |||
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> | |||
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(); | |||
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); | |||
} | |||
@@ -225,9 +225,12 @@ namespace Discord | |||
case "GUILD_UPDATE": | |||
{ | |||
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; | |||
case "GUILD_DELETE": | |||
@@ -251,9 +254,12 @@ namespace Discord | |||
case "CHANNEL_UPDATE": | |||
{ | |||
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; | |||
case "CHANNEL_DELETE": | |||
@@ -269,7 +275,7 @@ namespace Discord | |||
case "GUILD_MEMBER_ADD": | |||
{ | |||
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); | |||
RaiseEvent(nameof(MemberAdded), () => RaiseMemberAdded(member)); | |||
} | |||
@@ -277,9 +283,12 @@ namespace Discord | |||
case "GUILD_MEMBER_UPDATE": | |||
{ | |||
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; | |||
case "GUILD_MEMBER_REMOVE": | |||
@@ -303,8 +312,9 @@ namespace Discord | |||
case "GUILD_ROLE_UPDATE": | |||
{ | |||
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)); | |||
} | |||
break; | |||
@@ -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); | |||
} | |||
} | |||