| @@ -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); | |||||
| 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); | ||||
| } | } | ||||
| @@ -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; | ||||
| @@ -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); | |||||
| } | } | ||||
| } | } | ||||