Browse Source

Avoid processing online users twice during connection

pull/36/head
RogueException 9 years ago
parent
commit
f7b2eb7f6f
2 changed files with 31 additions and 24 deletions
  1. +0
    -1
      src/Discord.Net/DiscordClient.cs
  2. +31
    -23
      src/Discord.Net/Models/Server.cs

+ 0
- 1
src/Discord.Net/DiscordClient.cs View File

@@ -701,7 +701,6 @@ namespace Discord
{ {
var user = server.AddUser(memberData.User.Id, true, false); var user = server.AddUser(memberData.User.Id, true, false);
user.Update(memberData); user.Update(memberData);
//OnUserAdded(user);
} }
Logger.Verbose($"GUILD_MEMBERS_CHUNK: {data.Members.Length} users"); Logger.Verbose($"GUILD_MEMBERS_CHUNK: {data.Members.Length} users");




+ 31
- 23
src/Discord.Net/Models/Server.cs View File

@@ -173,25 +173,30 @@ namespace Discord
AddChannel(subModel.Id, false).Update(subModel); AddChannel(subModel.Id, false).Update(subModel);
DefaultChannel = _channels[Id]; DefaultChannel = _channels[Id];
} }
if (model.Members != null)
{
_users = new ConcurrentDictionary<ulong, Member>(2, (int)(model.Members.Length * 1.05));
foreach (var subModel in model.Members)
AddUser(subModel.User.Id, true, true).Update(subModel);
}

if (model.VoiceStates != null)
if (model.MemberCount != null)
{ {
foreach (var subModel in model.VoiceStates)
GetUser(subModel.UserId)?.Update(subModel);
if (_users == null)
_users = new ConcurrentDictionary<ulong, Member>(2, (int)(model.MemberCount * 1.05));
_userCount = model.MemberCount.Value;
} }
if (model.Presences != null)
if (!model.IsLarge)
{ {
foreach (var subModel in model.Presences)
GetUser(subModel.User.Id)?.Update(subModel);
if (model.Members != null)
{
foreach (var subModel in model.Members)
AddUser(subModel.User.Id, true, false).Update(subModel);
}
if (model.VoiceStates != null)
{
foreach (var subModel in model.VoiceStates)
GetUser(subModel.UserId)?.Update(subModel);
}
if (model.Presences != null)
{
foreach (var subModel in model.Presences)
GetUser(subModel.User.Id)?.Update(subModel);
}
} }
if (model.MemberCount != null)
_userCount = model.MemberCount.Value;
} }
/// <summary> Edits this server, changing only non-null attributes. </summary> /// <summary> Edits this server, changing only non-null attributes. </summary>
@@ -450,17 +455,20 @@ namespace Discord
#region Users #region Users
internal User AddUser(ulong id, bool cachePerms, bool incrementCount) internal User AddUser(ulong id, bool cachePerms, bool incrementCount)
{ {
if (incrementCount)
if (incrementCount)
_userCount++; _userCount++;
Member member = new Member(new User(Client, id, this), ServerPermissions.None);
if (id == Client.CurrentUser.Id)
{
member.User.CurrentGame = Client.CurrentGame;
member.User.Status = Client.Status;
}


if (_users.TryGetOrAdd(id, member, out member))
Member member;
if (!_users.TryGetValue(id, out member)) //Users can only be added from websocket thread, ignore threadsafety
{ {
member = new Member(new User(Client, id, this), ServerPermissions.None);
if (id == Client.CurrentUser.Id)
{
member.User.CurrentGame = Client.CurrentGame;
member.User.Status = Client.Status;
}

_users[id] = member;
if (cachePerms && Client.Config.UsePermissionsCache) if (cachePerms && Client.Config.UsePermissionsCache)
{ {
foreach (var channel in _channels) foreach (var channel in _channels)


Loading…
Cancel
Save