Browse Source

Add better support for invisible users

tags/1.0-rc
RogueException 8 years ago
parent
commit
b1caec5f59
4 changed files with 35 additions and 13 deletions
  1. +9
    -9
      src/Discord.Net.WebSocket/DiscordSocketClient.cs
  2. +1
    -1
      src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs
  3. +14
    -0
      src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs
  4. +11
    -3
      src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs

+ 9
- 9
src/Discord.Net.WebSocket/DiscordSocketClient.cs View File

@@ -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
{ {


+ 1
- 1
src/Discord.Net.WebSocket/Entities/Channels/SocketGroupChannel.cs View File

@@ -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))


+ 14
- 0
src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs View File

@@ -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;


+ 11
- 3
src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs View File

@@ -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)


Loading…
Cancel
Save