| @@ -1329,21 +1329,8 @@ namespace Discord.WebSocket | |||||
| return; | return; | ||||
| } | } | ||||
| if (channel == null) | |||||
| { | |||||
| if (!data.GuildId.IsSpecified) // assume it is a DM | |||||
| { | |||||
| channel = CreateDMChannel(data.ChannelId, data.Author.Value, State); | |||||
| } | |||||
| else | |||||
| { | |||||
| await UnknownChannelAsync(type, data.ChannelId).ConfigureAwait(false); | |||||
| return; | |||||
| } | |||||
| } | |||||
| SocketMessage before = null, after = null; | SocketMessage before = null, after = null; | ||||
| SocketMessage cachedMsg = channel.GetCachedMessage(data.Id); | |||||
| SocketMessage cachedMsg = channel?.GetCachedMessage(data.Id); | |||||
| bool isCached = cachedMsg != null; | bool isCached = cachedMsg != null; | ||||
| if (isCached) | if (isCached) | ||||
| { | { | ||||
| @@ -1365,7 +1352,7 @@ namespace Discord.WebSocket | |||||
| author = guild.GetUser(data.Author.Value.Id); | author = guild.GetUser(data.Author.Value.Id); | ||||
| } | } | ||||
| else | else | ||||
| author = (channel as SocketChannel).GetUser(data.Author.Value.Id); | |||||
| author = (channel as SocketChannel)?.GetUser(data.Author.Value.Id); | |||||
| if (author == null) | if (author == null) | ||||
| { | { | ||||
| @@ -1381,17 +1368,32 @@ namespace Discord.WebSocket | |||||
| } | } | ||||
| else if (channel is SocketGroupChannel groupChannel) | else if (channel is SocketGroupChannel groupChannel) | ||||
| author = groupChannel.GetOrAddUser(data.Author.Value); | author = groupChannel.GetOrAddUser(data.Author.Value); | ||||
| else | |||||
| { | |||||
| await UnknownChannelUserAsync(type, data.Author.Value.Id, channel.Id).ConfigureAwait(false); | |||||
| return; | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| else | else | ||||
| // Message author wasn't specified in the payload, so create a completely anonymous unknown user | // Message author wasn't specified in the payload, so create a completely anonymous unknown user | ||||
| author = new SocketUnknownUser(this, id: 0); | author = new SocketUnknownUser(this, id: 0); | ||||
| if (channel == null) | |||||
| { | |||||
| if (!data.GuildId.IsSpecified) // assume it is a DM | |||||
| { | |||||
| if (data.Author.IsSpecified) | |||||
| { | |||||
| var dmChannel = CreateDMChannel(data.ChannelId, data.Author.Value, State); | |||||
| channel = dmChannel; | |||||
| author = dmChannel.Recipient; | |||||
| } | |||||
| else | |||||
| channel = CreateDMChannel(data.ChannelId, author, State); | |||||
| } | |||||
| else | |||||
| { | |||||
| await UnknownChannelAsync(type, data.ChannelId).ConfigureAwait(false); | |||||
| return; | |||||
| } | |||||
| } | |||||
| after = SocketMessage.Create(this, State, author, channel, data); | after = SocketMessage.Create(this, State, author, channel, data); | ||||
| } | } | ||||
| var cacheableBefore = new Cacheable<IMessage, ulong>(before, data.Id, isCached, async () => await channel.GetMessageAsync(data.Id).ConfigureAwait(false)); | var cacheableBefore = new Cacheable<IMessage, ulong>(before, data.Id, isCached, async () => await channel.GetMessageAsync(data.Id).ConfigureAwait(false)); | ||||
| @@ -1989,6 +1991,10 @@ namespace Discord.WebSocket | |||||
| { | { | ||||
| return SocketDMChannel.Create(this, state, channelId, model); | return SocketDMChannel.Create(this, state, channelId, model); | ||||
| } | } | ||||
| internal SocketDMChannel CreateDMChannel(ulong channelId, SocketUser user, ClientState state) | |||||
| { | |||||
| return new SocketDMChannel(this, channelId, user); | |||||
| } | |||||
| internal ISocketPrivateChannel RemovePrivateChannel(ulong id) | internal ISocketPrivateChannel RemovePrivateChannel(ulong id) | ||||
| { | { | ||||
| var channel = State.RemoveChannel(id) as ISocketPrivateChannel; | var channel = State.RemoveChannel(id) as ISocketPrivateChannel; | ||||