From 3c25e6add2a60c94159c8dedeb4fcbfe85da782f Mon Sep 17 00:00:00 2001 From: RogueException Date: Sun, 13 Dec 2015 12:17:24 -0400 Subject: [PATCH] Added rate limit warning to log. --- src/Discord.Net/DiscordAPIClient.cs | 4 +-- src/Discord.Net/Net/Rest/RestClient.cs | 10 +++---- src/Discord.Net/Net/Rest/SharpRestEngine.cs | 33 +++++++++++++++++---- 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/src/Discord.Net/DiscordAPIClient.cs b/src/Discord.Net/DiscordAPIClient.cs index d728267ba..df90374ec 100644 --- a/src/Discord.Net/DiscordAPIClient.cs +++ b/src/Discord.Net/DiscordAPIClient.cs @@ -21,10 +21,10 @@ namespace Discord internal RestClient RestClient => _rest; private readonly RestClient _rest; - public DiscordAPIClient(DiscordConfig config = null) + public DiscordAPIClient(DiscordConfig config = null, Logger logger = null) { _config = config ?? new DiscordConfig(); - _rest = new RestClient(_config); + _rest = new RestClient(_config, logger); } private string _token; diff --git a/src/Discord.Net/Net/Rest/RestClient.cs b/src/Discord.Net/Net/Rest/RestClient.cs index 4c41ebe62..5b91f0804 100644 --- a/src/Discord.Net/Net/Rest/RestClient.cs +++ b/src/Discord.Net/Net/Rest/RestClient.cs @@ -14,17 +14,17 @@ namespace Discord.Net.Rest private readonly IRestEngine _engine; private CancellationToken _cancelToken; - public RestClient(DiscordConfig config) + public RestClient(DiscordConfig config, Logger logger) { _config = config; #if !DOTNET5_4 - _engine = new RestSharpEngine(config); + _engine = new RestSharpEngine(config, logger); #else - //_engine = new BuiltInRestEngine(config); + //_engine = new BuiltInRestEngine(config, logger); #endif - } + } - public void SetToken(string token) => _engine.SetToken(token); + public void SetToken(string token) => _engine.SetToken(token); //DELETE internal Task Delete(string path, object data) where ResponseT : class diff --git a/src/Discord.Net/Net/Rest/SharpRestEngine.cs b/src/Discord.Net/Net/Rest/SharpRestEngine.cs index fd8e5ae85..1a92527dc 100644 --- a/src/Discord.Net/Net/Rest/SharpRestEngine.cs +++ b/src/Discord.Net/Net/Rest/SharpRestEngine.cs @@ -11,13 +11,19 @@ namespace Discord.Net.Rest { internal sealed class RestSharpEngine : IRestEngine { - private readonly DiscordConfig _config; + private readonly DiscordConfig _config; private readonly RestSharp.RestClient _client; + private readonly Logger _logger; - public RestSharpEngine(DiscordConfig config) + private readonly object _rateLimitLock; + private DateTime _rateLimitTime; + + public RestSharpEngine(DiscordConfig config, Logger logger) { _config = config; - _client = new RestSharp.RestClient(Endpoints.BaseApi) + _logger = logger; + _rateLimitLock = new object(); + _client = new RestSharp.RestClient(Endpoints.BaseApi) { PreAuthenticate = false, ReadWriteTimeout = _config.RestTimeout, @@ -58,8 +64,8 @@ namespace Discord.Net.Rest return Send(request, cancelToken); } private async Task Send(RestRequest request, CancellationToken cancelToken) - { - int retryCount = 0; + { + int retryCount = 0; while (true) { var response = await _client.ExecuteTaskAsync(request, cancelToken).ConfigureAwait(false); @@ -78,7 +84,22 @@ namespace Discord.Net.Rest int milliseconds; if (retryAfter != null && int.TryParse((string)retryAfter.Value, out milliseconds)) { - await Task.Delay(milliseconds).ConfigureAwait(false); + if (_logger != null) + { + var now = DateTime.UtcNow; + if (now >= _rateLimitTime) + { + lock (_rateLimitLock) + { + if (now >= _rateLimitTime) + { + _rateLimitTime = now.AddMilliseconds(milliseconds); + _logger.Warning($"Rate limit hit, waiting {Math.Round(milliseconds / 1000.0f, 2)} seconds"); + } + } + } + } + await Task.Delay(milliseconds, cancelToken).ConfigureAwait(false); continue; } throw new HttpException(response.StatusCode);