diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index f00b02eab..b43278ca8 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -701,7 +701,6 @@ namespace Discord { var user = server.AddUser(memberData.User.Id, true, false); user.Update(memberData); - //OnUserAdded(user); } Logger.Verbose($"GUILD_MEMBERS_CHUNK: {data.Members.Length} users"); diff --git a/src/Discord.Net/Models/Server.cs b/src/Discord.Net/Models/Server.cs index e4c036c60..b7a9933dc 100644 --- a/src/Discord.Net/Models/Server.cs +++ b/src/Discord.Net/Models/Server.cs @@ -173,25 +173,30 @@ namespace Discord AddChannel(subModel.Id, false).Update(subModel); DefaultChannel = _channels[Id]; } - if (model.Members != null) - { - _users = new ConcurrentDictionary(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(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; } /// Edits this server, changing only non-null attributes. @@ -450,17 +455,20 @@ namespace Discord #region Users internal User AddUser(ulong id, bool cachePerms, bool incrementCount) { - if (incrementCount) + if (incrementCount) _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) { foreach (var channel in _channels)