diff --git a/src/Discord.Net/WebSocket/DiscordSocketClient.cs b/src/Discord.Net/WebSocket/DiscordSocketClient.cs index 59ca8f5a9..68e58d38b 100644 --- a/src/Discord.Net/WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net/WebSocket/DiscordSocketClient.cs @@ -362,9 +362,9 @@ namespace Discord.WebSocket if (guild != null) { foreach (var channel in guild.Channels) - guild.RemoveChannel(channel.Id); + DataStore.RemoveChannel(id); foreach (var user in guild.Members) - guild.RemoveUser(user.Id); + user.User.RemoveRef(this); } return guild; } @@ -451,6 +451,7 @@ namespace Discord.WebSocket var cachedGuilds = guilds.ToArray(); if (cachedGuilds.Length == 0) return; + //Wait for unsynced guilds to sync first. var unsyncedGuilds = guilds.Select(x => x.SyncPromise).Where(x => !x.IsCompleted).ToArray(); if (unsyncedGuilds.Length > 0) await Task.WhenAll(unsyncedGuilds); @@ -767,8 +768,6 @@ namespace Discord.WebSocket var guild = RemoveGuild(data.Id); if (guild != null) { - foreach (var member in guild.Members) - member.User.RemoveRef(this); await _guildUnavailableEvent.InvokeAsync(guild).ConfigureAwait(false); await _leftGuildEvent.InvokeAsync(guild).ConfigureAwait(false); } @@ -887,7 +886,8 @@ namespace Discord.WebSocket var guild = DataStore.GetGuild(data.GuildId); if (guild != null) { - var user = guild.AddUser(data, DataStore); + var user = guild.AddOrUpdateUser(data, DataStore); + guild.MemberCount++; if (!guild.IsSynced) { @@ -954,6 +954,7 @@ namespace Discord.WebSocket if (guild != null) { var user = guild.RemoveUser(data.User.Id); + guild.MemberCount--; if (!guild.IsSynced) { @@ -994,7 +995,7 @@ namespace Discord.WebSocket if (guild != null) { foreach (var memberModel in data.Members) - guild.AddUser(memberModel, DataStore); + guild.AddOrUpdateUser(memberModel, DataStore); if (guild.DownloadedMemberCount >= guild.MemberCount) //Finished downloading for there { diff --git a/src/Discord.Net/WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net/WebSocket/Entities/Guilds/SocketGuild.cs index 6a4d03d60..ea0eb07a9 100644 --- a/src/Discord.Net/WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net/WebSocket/Entities/Guilds/SocketGuild.cs @@ -32,7 +32,7 @@ namespace Discord.WebSocket internal bool _available; public bool Available => _available && Discord.ConnectionState == ConnectionState.Connected; - public int MemberCount { get; private set; } + public int MemberCount { get; set; } public int DownloadedMemberCount { get; private set; } public AudioClient AudioClient { get; private set; } @@ -91,12 +91,12 @@ namespace Discord.WebSocket AddChannel(model.Channels[i], dataStore, channels); } _channels = channels; - + var members = new ConcurrentDictionary(1, (int)(model.Presences.Length * 1.05)); { DownloadedMemberCount = 0; for (int i = 0; i < model.Members.Length; i++) - AddUser(model.Members[i], dataStore, members); + AddOrUpdateUser(model.Members[i], dataStore, members); if (Discord.ApiClient.AuthTokenType != TokenType.User) { var _ = _syncPromise.TrySetResultAsync(true); @@ -125,7 +125,7 @@ namespace Discord.WebSocket { DownloadedMemberCount = 0; for (int i = 0; i < model.Members.Length; i++) - AddUser(model.Members[i], dataStore, members); + AddOrUpdateUser(model.Members[i], dataStore, members); var _ = _syncPromise.TrySetResultAsync(true); if (!model.Large) _ = _downloaderPromise.TrySetResultAsync(true); @@ -183,9 +183,8 @@ namespace Discord.WebSocket => Task.FromResult(CurrentUser); public override Task> GetUsersAsync() => Task.FromResult>(Members); - public SocketGuildUser AddUser(MemberModel model, DataStore dataStore, ConcurrentDictionary members = null) + public SocketGuildUser AddOrUpdateUser(MemberModel model, DataStore dataStore, ConcurrentDictionary members = null) { - MemberCount++; members = members ?? _members; SocketGuildUser member; @@ -225,13 +224,13 @@ namespace Discord.WebSocket } public SocketGuildUser RemoveUser(ulong id) { - MemberCount--; SocketGuildUser member; if (_members.TryRemove(id, out member)) { DownloadedMemberCount--; return member; } + member.User.RemoveRef(Discord); return null; } public override async Task DownloadUsersAsync()