diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index 016f7ae9d..58eeeae5f 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -202,7 +202,7 @@ namespace Discord await Login(email, password, token).ConfigureAwait(false); await GatewaySocket.Connect(ClientAPI, CancelToken).ConfigureAwait(false); - var tasks = new[] { CancelToken.Wait() } + var tasks = new[] { CancelToken.Wait(), LargeServerDownloader(CancelToken) } .Concat(MessageQueue.Run(CancelToken)); await _taskManager.Start(tasks, cancelSource).ConfigureAwait(false); @@ -522,32 +522,7 @@ namespace Discord channel.Update(model); } - //Temporary hotfix to download all large guilds before raising READY - CancellationToken cancelToken = _taskManager.CancelToken; - Task.Run(async () => - { - try - { - const short batchSize = 50; - int count = 0; - await Task.Delay(1500, cancelToken); - do - { - count = 0; - ulong[] serverIds = new ulong[batchSize]; - while (count < batchSize && _largeServers.TryDequeue(out serverIds[count++])) { } - if (count > 0) - { - cancelToken.ThrowIfCancellationRequested(); - GatewaySocket.SendRequestMembers(serverIds, "", 0); - await Task.Delay(1250, cancelToken); - } - } while (count == batchSize); - await Task.Delay(1500, cancelToken); - EndConnect(); - } - catch (OperationCanceledException) { } - }); + EndConnect(); } break; @@ -571,12 +546,7 @@ namespace Discord if (!data.IsLarge) OnServerAvailable(server); else - { - if (State == ConnectionState.Connected) - GatewaySocket.SendRequestMembers(new ulong[] { data.Id }, "", 0); - else - _largeServers.Enqueue(data.Id); - } + _largeServers.Enqueue(data.Id); } } break; @@ -1098,6 +1068,35 @@ namespace Discord } #endregion + private Task LargeServerDownloader(CancellationToken cancelToken) + { + //Temporary hotfix to download all large guilds before raising READY + return Task.Run(async () => + { + try + { + const short batchSize = 50; + ulong[] serverIds = new ulong[batchSize]; + + while (true) + { + if (!cancelToken.IsCancellationRequested && State == ConnectionState.Connected) + { + int count = 0; + + while (count < batchSize && _largeServers.TryDequeue(out serverIds[count])) + count++; + + if (count > 0 && !cancelToken.IsCancellationRequested) + GatewaySocket.SendRequestMembers(serverIds.Take(count), "", 0); + } + await Task.Delay(1250); + } + } + catch (OperationCanceledException) { } + }); + } + //Helpers private string GetTokenCachePath(string email) {