| @@ -202,7 +202,7 @@ namespace Discord | |||||
| await Login(email, password, token).ConfigureAwait(false); | await Login(email, password, token).ConfigureAwait(false); | ||||
| await GatewaySocket.Connect(ClientAPI, CancelToken).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)); | .Concat(MessageQueue.Run(CancelToken)); | ||||
| await _taskManager.Start(tasks, cancelSource).ConfigureAwait(false); | await _taskManager.Start(tasks, cancelSource).ConfigureAwait(false); | ||||
| @@ -522,32 +522,7 @@ namespace Discord | |||||
| channel.Update(model); | 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; | break; | ||||
| @@ -571,12 +546,7 @@ namespace Discord | |||||
| if (!data.IsLarge) | if (!data.IsLarge) | ||||
| OnServerAvailable(server); | OnServerAvailable(server); | ||||
| else | else | ||||
| { | |||||
| if (State == ConnectionState.Connected) | |||||
| GatewaySocket.SendRequestMembers(new ulong[] { data.Id }, "", 0); | |||||
| else | |||||
| _largeServers.Enqueue(data.Id); | |||||
| } | |||||
| _largeServers.Enqueue(data.Id); | |||||
| } | } | ||||
| } | } | ||||
| break; | break; | ||||
| @@ -1098,6 +1068,35 @@ namespace Discord | |||||
| } | } | ||||
| #endregion | #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 | //Helpers | ||||
| private string GetTokenCachePath(string email) | private string GetTokenCachePath(string email) | ||||
| { | { | ||||