diff --git a/src/Discord.Net.Rest/BaseDiscordClient.cs b/src/Discord.Net.Rest/BaseDiscordClient.cs index 683723e8..d3853953 100644 --- a/src/Discord.Net.Rest/BaseDiscordClient.cs +++ b/src/Discord.Net.Rest/BaseDiscordClient.cs @@ -20,6 +20,13 @@ namespace Discord.Rest public event Func LoggedOut { add { _loggedOutEvent.Add(value); } remove { _loggedOutEvent.Remove(value); } } private readonly AsyncEvent> _loggedOutEvent = new AsyncEvent>(); + internal readonly AsyncEvent> _sentRequest = new(); + /// + /// Fired when a REST request is sent to the API. First parameter is the HTTP method, + /// second is the endpoint, and third is the time taken to complete the request. + /// + public event Func SentRequest { add { _sentRequest.Add(value); } remove { _sentRequest.Remove(value); } } + internal readonly Logger _restLogger; private readonly SemaphoreSlim _stateLock; private bool _isFirstLogin, _isDisposed; @@ -61,6 +68,7 @@ namespace Discord.Rest await _restLogger.WarningAsync($"Rate limit triggered: {endpoint} Remaining: {info.Value.RetryAfter}s {(id.IsHashBucket ? $"(Bucket: {id.BucketHash})" : "")}").ConfigureAwait(false); }; ApiClient.SentRequest += async (method, endpoint, millis) => await _restLogger.VerboseAsync($"{method} {endpoint}: {millis} ms").ConfigureAwait(false); + ApiClient.SentRequest += (method, endpoint, millis) => _sentRequest.InvokeAsync(method, endpoint, millis); } public async Task LoginAsync(TokenType tokenType, string token, bool validateToken = true) diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.cs index 155d1fb1..1c415cdd 100644 --- a/src/Discord.Net.WebSocket/DiscordShardedClient.cs +++ b/src/Discord.Net.WebSocket/DiscordShardedClient.cs @@ -431,6 +431,8 @@ namespace Discord.WebSocket return Task.Delay(0); }; + client.SentRequest += (method, endpoint, millis) => _sentRequest.InvokeAsync(method, endpoint, millis); + client.Connected += () => _shardConnectedEvent.InvokeAsync(client); client.Disconnected += (exception) => _shardDisconnectedEvent.InvokeAsync(exception, client); client.Ready += () => _shardReadyEvent.InvokeAsync(client);