diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.Events.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.Events.cs
index c9e679669..c7dabefc8 100644
--- a/src/Discord.Net.WebSocket/DiscordShardedClient.Events.cs
+++ b/src/Discord.Net.WebSocket/DiscordShardedClient.Events.cs
@@ -7,32 +7,39 @@ namespace Discord.WebSocket
{
//General
/// Fired when a shard is connected to the Discord gateway.
- public event Func ShardConnected
+ public event Func ShardConnected
{
add { _shardConnectedEvent.Add(value); }
remove { _shardConnectedEvent.Remove(value); }
}
private readonly AsyncEvent> _shardConnectedEvent = new AsyncEvent>();
/// Fired when a shard is disconnected from the Discord gateway.
- public event Func ShardDisconnected
+ public event Func ShardDisconnected
{
add { _shardDisconnectedEvent.Add(value); }
remove { _shardDisconnectedEvent.Remove(value); }
}
private readonly AsyncEvent> _shardDisconnectedEvent = new AsyncEvent>();
/// Fired when a guild data for a shard has finished downloading.
- public event Func ShardReady
+ public event Func ShardReady
{
add { _shardReadyEvent.Add(value); }
remove { _shardReadyEvent.Remove(value); }
}
private readonly AsyncEvent> _shardReadyEvent = new AsyncEvent>();
/// Fired when a shard receives a heartbeat from the Discord gateway.
- public event Func ShardLatencyUpdated
+ public event Func ShardLatencyUpdated
{
add { _shardLatencyUpdatedEvent.Add(value); }
remove { _shardLatencyUpdatedEvent.Remove(value); }
}
private readonly AsyncEvent> _shardLatencyUpdatedEvent = new AsyncEvent>();
+ /// Fired when all shards are ready.
+ public event Func Ready
+ {
+ add { _readyEvent.Add(value); }
+ remove { _readyEvent.Remove(value); }
+ }
+ private readonly AsyncEvent> _readyEvent = new AsyncEvent>();
}
-}
\ No newline at end of file
+}
diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.cs
index 0877abfd9..77970ba8f 100644
--- a/src/Discord.Net.WebSocket/DiscordShardedClient.cs
+++ b/src/Discord.Net.WebSocket/DiscordShardedClient.cs
@@ -18,6 +18,7 @@ namespace Discord.WebSocket
private int[] _shardIds;
private DiscordSocketClient[] _shards;
private int _totalShards;
+ private int _shardsReady;
private bool _isDisposed;
@@ -290,16 +291,26 @@ namespace Discord.WebSocket
};
if (isPrimary)
{
- client.Ready += () =>
+ client.Ready += async () =>
{
CurrentUser = client.CurrentUser;
- return Task.Delay(0);
+ if (_totalShards >= _shardsReady++) //to account for re-identifies, don't see a better way to handle this
+ {
+ await _readyEvent.InvokeAsync();
+ }
};
}
client.Connected += () => _shardConnectedEvent.InvokeAsync(client);
client.Disconnected += (exception) => _shardDisconnectedEvent.InvokeAsync(exception, client);
- client.Ready += () => _shardReadyEvent.InvokeAsync(client);
+ client.Ready += async () =>
+ {
+ await _shardReadyEvent.InvokeAsync(client);
+ if (_totalShards >= _shardsReady++) //to account for re-identifies, don't see a better way to handle this
+ {
+ await _readyEvent.InvokeAsync();
+ }
+ };
client.LatencyUpdated += (oldLatency, newLatency) => _shardLatencyUpdatedEvent.InvokeAsync(oldLatency, newLatency, client);
client.ChannelCreated += (channel) => _channelCreatedEvent.InvokeAsync(channel);