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;
|
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)
|
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 (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)
|
||||||
|
|||||||
Reference in New Issue
Block a user