From 89d7def6e731314903dcbbfc910cef6f416c3b27 Mon Sep 17 00:00:00 2001 From: Casino Boyale Date: Sun, 29 Sep 2019 11:40:07 +0100 Subject: [PATCH] Added a Ready event to DiscordShardedClient --- .../DiscordShardedClient.Events.cs | 17 ++++++++++++----- .../DiscordShardedClient.cs | 17 ++++++++++++++--- 2 files changed, 26 insertions(+), 8 deletions(-) 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);