Add better support for invisible users
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user