@@ -900,7 +900,7 @@ namespace Discord.WebSocket | |||||
var channel = State.GetChannel(data.ChannelId) as SocketGroupChannel; | var channel = State.GetChannel(data.ChannelId) as SocketGroupChannel; | ||||
if (channel != null) | if (channel != null) | ||||
{ | { | ||||
var user = channel.AddUser(data.User); | |||||
var user = channel.GetOrAddUser(data.User); | |||||
await TimedInvokeAsync(_recipientAddedEvent, nameof(RecipientAdded), user).ConfigureAwait(false); | await TimedInvokeAsync(_recipientAddedEvent, nameof(RecipientAdded), user).ConfigureAwait(false); | ||||
} | } | ||||
else | else | ||||
@@ -1109,20 +1109,20 @@ namespace Discord.WebSocket | |||||
else | else | ||||
author = (channel as SocketChannel).GetUser(data.Author.Value.Id); | author = (channel as SocketChannel).GetUser(data.Author.Value.Id); | ||||
if (author != null) | |||||
{ | |||||
var msg = SocketMessage.Create(this, State, author, channel, data); | |||||
SocketChannelHelper.AddMessage(channel, this, msg); | |||||
await TimedInvokeAsync(_messageReceivedEvent, nameof(MessageReceived), msg).ConfigureAwait(false); | |||||
} | |||||
else | |||||
if (author == null) | |||||
{ | { | ||||
if (guild != null) | if (guild != null) | ||||
await UnknownGuildUserAsync(type, data.Author.Value.Id, guild.Id).ConfigureAwait(false); | |||||
author = guild.AddOrUpdateUser(data.Author.Value); //User has no guild-specific data | |||||
else if (channel is SocketGroupChannel) | |||||
author = (channel as SocketGroupChannel).GetOrAddUser(data.Author.Value); | |||||
else | else | ||||
await UnknownChannelUserAsync(type, data.Author.Value.Id, channel.Id).ConfigureAwait(false); | await UnknownChannelUserAsync(type, data.Author.Value.Id, channel.Id).ConfigureAwait(false); | ||||
return; | return; | ||||
} | } | ||||
var msg = SocketMessage.Create(this, State, author, channel, data); | |||||
SocketChannelHelper.AddMessage(channel, this, msg); | |||||
await TimedInvokeAsync(_messageReceivedEvent, nameof(MessageReceived), msg).ConfigureAwait(false); | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
@@ -125,7 +125,7 @@ namespace Discord.WebSocket | |||||
return user; | return user; | ||||
return null; | return null; | ||||
} | } | ||||
internal SocketGroupUser AddUser(UserModel model) | |||||
internal SocketGroupUser GetOrAddUser(UserModel model) | |||||
{ | { | ||||
SocketGroupUser user; | SocketGroupUser user; | ||||
if (_users.TryGetValue(model.Id, out user)) | if (_users.TryGetValue(model.Id, out user)) | ||||
@@ -16,6 +16,7 @@ using MemberModel = Discord.API.GuildMember; | |||||
using Model = Discord.API.Guild; | using Model = Discord.API.Guild; | ||||
using PresenceModel = Discord.API.Presence; | using PresenceModel = Discord.API.Presence; | ||||
using RoleModel = Discord.API.Role; | using RoleModel = Discord.API.Role; | ||||
using UserModel = Discord.API.User; | |||||
using VoiceStateModel = Discord.API.VoiceState; | using VoiceStateModel = Discord.API.VoiceState; | ||||
namespace Discord.WebSocket | namespace Discord.WebSocket | ||||
@@ -375,6 +376,19 @@ namespace Discord.WebSocket | |||||
public Task<int> PruneUsersAsync(int days = 30, bool simulate = false, RequestOptions options = null) | public Task<int> PruneUsersAsync(int days = 30, bool simulate = false, RequestOptions options = null) | ||||
=> GuildHelper.PruneUsersAsync(this, Discord, days, simulate, options); | => GuildHelper.PruneUsersAsync(this, Discord, days, simulate, options); | ||||
internal SocketGuildUser AddOrUpdateUser(UserModel model) | |||||
{ | |||||
SocketGuildUser member; | |||||
if (_members.TryGetValue(model.Id, out member)) | |||||
member.GlobalUser?.Update(Discord.State, model); | |||||
else | |||||
{ | |||||
member = SocketGuildUser.Create(this, Discord.State, model); | |||||
_members[member.Id] = member; | |||||
DownloadedMemberCount++; | |||||
} | |||||
return member; | |||||
} | |||||
internal SocketGuildUser AddOrUpdateUser(MemberModel model) | internal SocketGuildUser AddOrUpdateUser(MemberModel model) | ||||
{ | { | ||||
SocketGuildUser member; | SocketGuildUser member; | ||||
@@ -6,7 +6,8 @@ using System.Collections.Immutable; | |||||
using System.Diagnostics; | using System.Diagnostics; | ||||
using System.Linq; | using System.Linq; | ||||
using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
using Model = Discord.API.GuildMember; | |||||
using UserModel = Discord.API.User; | |||||
using MemberModel = Discord.API.GuildMember; | |||||
using PresenceModel = Discord.API.Presence; | using PresenceModel = Discord.API.Presence; | ||||
namespace Discord.WebSocket | namespace Discord.WebSocket | ||||
@@ -69,7 +70,14 @@ namespace Discord.WebSocket | |||||
Guild = guild; | Guild = guild; | ||||
GlobalUser = globalUser; | GlobalUser = globalUser; | ||||
} | } | ||||
internal static SocketGuildUser Create(SocketGuild guild, ClientState state, Model model) | |||||
internal static SocketGuildUser Create(SocketGuild guild, ClientState state, UserModel model) | |||||
{ | |||||
var entity = new SocketGuildUser(guild, guild.Discord.GetOrCreateUser(state, model)); | |||||
entity.Update(state, model); | |||||
entity.UpdateRoles(new ulong[0]); | |||||
return entity; | |||||
} | |||||
internal static SocketGuildUser Create(SocketGuild guild, ClientState state, MemberModel model) | |||||
{ | { | ||||
var entity = new SocketGuildUser(guild, guild.Discord.GetOrCreateUser(state, model.User)); | var entity = new SocketGuildUser(guild, guild.Discord.GetOrCreateUser(state, model.User)); | ||||
entity.Update(state, model); | entity.Update(state, model); | ||||
@@ -81,7 +89,7 @@ namespace Discord.WebSocket | |||||
entity.Update(state, model, false); | entity.Update(state, model, false); | ||||
return entity; | return entity; | ||||
} | } | ||||
internal void Update(ClientState state, Model model) | |||||
internal void Update(ClientState state, MemberModel model) | |||||
{ | { | ||||
base.Update(state, model.User); | base.Update(state, model.User); | ||||
if (model.JoinedAt.IsSpecified) | if (model.JoinedAt.IsSpecified) | ||||