@@ -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)
{
{