Re-add rate limit margins

pull/980/head
Tyrrrz 2 years ago
parent 2c4f812d4f
commit b138908eb3

@ -69,7 +69,17 @@ public class DiscordClient
.Pipe(s => TimeSpan.FromSeconds(double.Parse(s, CultureInfo.InvariantCulture)));
if (remainingRequestCount <= 0 && resetAfterDelay is not null)
await Task.Delay(resetAfterDelay.Value, innerCancellationToken);
{
var delay =
// Adding a small buffer to the reset time reduces the chance of getting
// rate limited again, because it allows for more requests to be released.
(resetAfterDelay.Value + TimeSpan.FromSeconds(1))
// Sometimes Discord returns an absurdly high value for the reset time, which
// is not actually enforced by the server. So we cap it at a reasonable value.
.Clamp(TimeSpan.Zero, TimeSpan.FromSeconds(60));
await Task.Delay(delay, innerCancellationToken);
}
return response;
}, cancellationToken);

@ -0,0 +1,17 @@
using System;
namespace DiscordChatExporter.Core.Utils.Extensions;
public static class TimeSpanExtensions
{
public static TimeSpan Clamp(this TimeSpan value, TimeSpan min, TimeSpan max)
{
if (value < min)
return min;
if (value > max)
return max;
return value;
}
}

@ -41,7 +41,10 @@ public static class Http
{
// If rate-limited, use retry-after header as the guide
if (result.Result.Headers.RetryAfter?.Delta is { } retryAfter)
return retryAfter;
{
// Add some buffer just in case
return retryAfter + TimeSpan.FromSeconds(1);
}
return TimeSpan.FromSeconds(Math.Pow(2, i) + 1);
},

Loading…
Cancel
Save