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