diff --git a/src/Discord.Net.Rpc/DiscordRpcClient.Events.cs b/src/Discord.Net.Rpc/DiscordRpcClient.Events.cs index 2a9ae21bf..f58f03c52 100644 --- a/src/Discord.Net.Rpc/DiscordRpcClient.Events.cs +++ b/src/Discord.Net.Rpc/DiscordRpcClient.Events.cs @@ -6,6 +6,12 @@ namespace Discord.Rpc public partial class DiscordRpcClient { //General + public event Func Connecting + { + add { _connectingEvent.Add(value); } + remove { _connectingEvent.Remove(value); } + } + private readonly AsyncEvent> _connectingEvent = new AsyncEvent>(); public event Func Connected { add { _connectedEvent.Add(value); } diff --git a/src/Discord.Net.Rpc/DiscordRpcClient.cs b/src/Discord.Net.Rpc/DiscordRpcClient.cs index b1bba17b7..19d7e9dfc 100644 --- a/src/Discord.Net.Rpc/DiscordRpcClient.cs +++ b/src/Discord.Net.Rpc/DiscordRpcClient.cs @@ -40,6 +40,7 @@ namespace Discord.Rpc _rpcLogger = LogManager.CreateLogger("RPC"); _connection = new ConnectionManager(_stateLock, _rpcLogger, config.ConnectionTimeout, ConnectAsync, DisconnectAsync, x => ApiClient.Disconnected += x); + _connection.Connecting += () => _connectingEvent.InvokeAsync(); _connection.Connected += () => _connectedEvent.InvokeAsync(); _connection.Disconnected += (ex, recon) => _disconnectedEvent.InvokeAsync(ex); diff --git a/src/Discord.Net.WebSocket/ConnectionManager.cs b/src/Discord.Net.WebSocket/ConnectionManager.cs index 0a222e491..d7682a2af 100644 --- a/src/Discord.Net.WebSocket/ConnectionManager.cs +++ b/src/Discord.Net.WebSocket/ConnectionManager.cs @@ -8,6 +8,8 @@ namespace Discord { internal class ConnectionManager { + public event Func Connecting { add { _connectingEvent.Add(value); } remove { _connectingEvent.Remove(value); } } + private readonly AsyncEvent> _connectingEvent = new AsyncEvent>(); public event Func Connected { add { _connectedEvent.Add(value); } remove { _connectedEvent.Remove(value); } } private readonly AsyncEvent> _connectedEvent = new AsyncEvent>(); public event Func Disconnected { add { _disconnectedEvent.Add(value); } remove { _disconnectedEvent.Remove(value); } } @@ -123,6 +125,8 @@ namespace Discord try { + await _connectingEvent.InvokeAsync().ConfigureAwait(false); + var readyPromise = new TaskCompletionSource(); _readyPromise = readyPromise; diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.Events.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.Events.cs index fb155e535..cabdf98ee 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.Events.cs @@ -7,6 +7,12 @@ namespace Discord.WebSocket public partial class DiscordSocketClient { //General + public event Func Connecting + { + add { _connectingEvent.Add(value); } + remove { _connectingEvent.Remove(value); } + } + private readonly AsyncEvent> _connectingEvent = new AsyncEvent>(); public event Func Connected { add { _connectedEvent.Add(value); } diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index dcd61a52f..89502eb03 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -92,6 +92,7 @@ namespace Discord.WebSocket _gatewayLogger = LogManager.CreateLogger(ShardId == 0 && TotalShards == 1 ? "Gateway" : $"Shard #{ShardId}"); _connection = new ConnectionManager(_stateLock, _gatewayLogger, config.ConnectionTimeout, ConnectAsync, DisconnectAsync, x => ApiClient.Disconnected += x); + _connection.Connecting += () => TimedInvokeAsync(_connectingEvent, nameof(Connecting)); _connection.Connected += () => TimedInvokeAsync(_connectedEvent, nameof(Connected)); _connection.Disconnected += (ex, recon) => TimedInvokeAsync(_disconnectedEvent, nameof(Disconnected), ex);