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