Avoid processing online users twice during connection

This commit is contained in:
RogueException
2016-02-17 01:25:12 -04:00
parent 6402b27458
commit f7b2eb7f6f
2 changed files with 33 additions and 26 deletions

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");

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)
{
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) if (model.MemberCount != null)
{
if (_users == null)
_users = new ConcurrentDictionary<ulong, Member>(2, (int)(model.MemberCount * 1.05));
_userCount = model.MemberCount.Value; _userCount = model.MemberCount.Value;
}
if (!model.IsLarge)
{
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);
}
}
} }
/// <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)