Fix crosspost ratelimits (#2100)

This commit is contained in:
Quin Lynch
2022-02-12 06:51:36 -04:00
committed by GitHub
parent 503d32aa7e
commit fad217e8bc
4 changed files with 46 additions and 2 deletions

View File

@@ -0,0 +1,21 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Discord.API
{
internal class Ratelimit
{
[JsonProperty("global")]
public bool Global { get; set; }
[JsonProperty("message")]
public string Message { get; set; }
[JsonProperty("retry_after")]
public double RetryAfter { get; set; }
}
}

View File

@@ -149,7 +149,7 @@ namespace Discord.Net.Rest
HttpResponseMessage response = await _client.SendAsync(request, cancelToken).ConfigureAwait(false); HttpResponseMessage response = await _client.SendAsync(request, cancelToken).ConfigureAwait(false);
var headers = response.Headers.ToDictionary(x => x.Key, x => x.Value.FirstOrDefault(), StringComparer.OrdinalIgnoreCase); var headers = response.Headers.ToDictionary(x => x.Key, x => x.Value.FirstOrDefault(), StringComparer.OrdinalIgnoreCase);
var stream = !headerOnly ? await response.Content.ReadAsStreamAsync().ConfigureAwait(false) : null; var stream = (!headerOnly || !response.IsSuccessStatusCode) ? await response.Content.ReadAsStreamAsync().ConfigureAwait(false) : null;
return new RestResponse(response.StatusCode, headers, stream); return new RestResponse(response.StatusCode, headers, stream);
} }

View File

@@ -75,6 +75,7 @@ namespace Discord.Net.Queue
switch (response.StatusCode) switch (response.StatusCode)
{ {
case (HttpStatusCode)429: case (HttpStatusCode)429:
info.ReadRatelimitPayload(response.Stream);
if (info.IsGlobal) if (info.IsGlobal)
{ {
#if DEBUG_LIMITS #if DEBUG_LIMITS

View File

@@ -1,6 +1,10 @@
using Discord.API;
using Discord.Net.Rest;
using Newtonsoft.Json;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.IO;
namespace Discord.Net namespace Discord.Net
{ {
@@ -25,7 +29,7 @@ namespace Discord.Net
public DateTimeOffset? Reset { get; } public DateTimeOffset? Reset { get; }
/// <inheritdoc/> /// <inheritdoc/>
public TimeSpan? ResetAfter { get; } public TimeSpan? ResetAfter { get; private set; }
/// <inheritdoc/> /// <inheritdoc/>
public string Bucket { get; } public string Bucket { get; }
@@ -56,5 +60,23 @@ namespace Discord.Net
Lag = headers.TryGetValue("Date", out temp) && Lag = headers.TryGetValue("Date", out temp) &&
DateTimeOffset.TryParse(temp, CultureInfo.InvariantCulture, DateTimeStyles.None, out var date) ? DateTimeOffset.UtcNow - date : (TimeSpan?)null; DateTimeOffset.TryParse(temp, CultureInfo.InvariantCulture, DateTimeStyles.None, out var date) ? DateTimeOffset.UtcNow - date : (TimeSpan?)null;
} }
internal void ReadRatelimitPayload(Stream response)
{
try
{
if (response != null && response.Length != 0)
{
using (TextReader text = new StreamReader(response))
using (JsonReader reader = new JsonTextReader(text))
{
var ratelimit = Discord.Rest.DiscordRestClient.Serializer.Deserialize<Ratelimit>(reader);
ResetAfter = TimeSpan.FromSeconds(ratelimit.RetryAfter);
}
}
}
catch { }
}
} }
} }