From b1caec5f59c7bb0a3dba042491d7a1f5afdc4f67 Mon Sep 17 00:00:00 2001 From: RogueException Date: Sun, 2 Apr 2017 15:08:28 -0300 Subject: [PATCH] Add better support for invisible users --- .../DiscordSocketClient.cs | 18 +++++++++--------- .../Entities/Channels/SocketGroupChannel.cs | 2 +- .../Entities/Guilds/SocketGuild.cs | 14 ++++++++++++++ .../Entities/Users/SocketGuildUser.cs | 14 +++++++++++--- 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index f56da83b9..e4f88ef45 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -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 { diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs index e6c875e5a..ff7048848 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs @@ -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)) diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index 9f106ff1c..8193a971f 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -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 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; diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs index 58d2a0b8d..63dc64dbf 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs @@ -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)