| @@ -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; } | |||||
| } | |||||
| } | |||||
| @@ -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); | ||||
| } | } | ||||
| @@ -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 | ||||
| @@ -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 { } | |||||
| } | |||||
| } | } | ||||
| } | } | ||||