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,13 +173,19 @@ namespace Discord
AddChannel(subModel.Id, false).Update(subModel); AddChannel(subModel.Id, false).Update(subModel);
DefaultChannel = _channels[Id]; DefaultChannel = _channels[Id];
} }
if (model.MemberCount != null)
{
if (_users == null)
_users = new ConcurrentDictionary<ulong, Member>(2, (int)(model.MemberCount * 1.05));
_userCount = model.MemberCount.Value;
}
if (!model.IsLarge)
{
if (model.Members != null) if (model.Members != null)
{ {
_users = new ConcurrentDictionary<ulong, Member>(2, (int)(model.Members.Length * 1.05));
foreach (var subModel in model.Members) foreach (var subModel in model.Members)
AddUser(subModel.User.Id, true, true).Update(subModel); AddUser(subModel.User.Id, true, false).Update(subModel);
} }
if (model.VoiceStates != null) if (model.VoiceStates != null)
{ {
foreach (var subModel in model.VoiceStates) foreach (var subModel in model.VoiceStates)
@@ -190,8 +196,7 @@ namespace Discord
foreach (var subModel in model.Presences) foreach (var subModel in model.Presences)
GetUser(subModel.User.Id)?.Update(subModel); 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>
@@ -452,15 +457,18 @@ namespace Discord
{ {
if (incrementCount) if (incrementCount)
_userCount++; _userCount++;
Member member = new Member(new User(Client, id, this), ServerPermissions.None);
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) if (id == Client.CurrentUser.Id)
{ {
member.User.CurrentGame = Client.CurrentGame; member.User.CurrentGame = Client.CurrentGame;
member.User.Status = Client.Status; member.User.Status = Client.Status;
} }
if (_users.TryGetOrAdd(id, member, out member)) _users[id] = member;
{
if (cachePerms && Client.Config.UsePermissionsCache) if (cachePerms && Client.Config.UsePermissionsCache)
{ {
foreach (var channel in _channels) foreach (var channel in _channels)