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);