mirror of
https://github.com/Tyrrrz/DiscordChatExporter.git
synced 2026-02-15 00:03:38 -07:00
Re-add rate limit margins
This commit is contained in:
parent
2c4f812d4f
commit
b138908eb3
|
|
@ -69,7 +69,17 @@ public class DiscordClient
|
||||||
.Pipe(s => TimeSpan.FromSeconds(double.Parse(s, CultureInfo.InvariantCulture)));
|
.Pipe(s => TimeSpan.FromSeconds(double.Parse(s, CultureInfo.InvariantCulture)));
|
||||||
|
|
||||||
if (remainingRequestCount <= 0 && resetAfterDelay is not null)
|
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;
|
return response;
|
||||||
}, cancellationToken);
|
}, 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 rate-limited, use retry-after header as the guide
|
||||||
if (result.Result.Headers.RetryAfter?.Delta is { } retryAfter)
|
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);
|
return TimeSpan.FromSeconds(Math.Pow(2, i) + 1);
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue