* Add request info to RateLimitedException * Remove Promise from interface. * Add Request to HttpException.tags/2.0
| @@ -1,4 +1,4 @@ | |||||
| using System; | |||||
| using System; | |||||
| using System.Net; | using System.Net; | ||||
| namespace Discord.Net | namespace Discord.Net | ||||
| @@ -8,11 +8,13 @@ namespace Discord.Net | |||||
| public HttpStatusCode HttpCode { get; } | public HttpStatusCode HttpCode { get; } | ||||
| public int? DiscordCode { get; } | public int? DiscordCode { get; } | ||||
| public string Reason { get; } | public string Reason { get; } | ||||
| public IRequest Request { get; } | |||||
| public HttpException(HttpStatusCode httpCode, int? discordCode = null, string reason = null) | |||||
| public HttpException(HttpStatusCode httpCode, IRequest request, int? discordCode = null, string reason = null) | |||||
| : base(CreateMessage(httpCode, discordCode, reason)) | : base(CreateMessage(httpCode, discordCode, reason)) | ||||
| { | { | ||||
| HttpCode = httpCode; | HttpCode = httpCode; | ||||
| Request = request; | |||||
| DiscordCode = discordCode; | DiscordCode = discordCode; | ||||
| Reason = reason; | Reason = reason; | ||||
| } | } | ||||
| @@ -0,0 +1,10 @@ | |||||
| using System; | |||||
| namespace Discord.Net | |||||
| { | |||||
| public interface IRequest | |||||
| { | |||||
| DateTimeOffset? TimeoutAt { get; } | |||||
| RequestOptions Options { get; } | |||||
| } | |||||
| } | |||||
| @@ -1,12 +1,15 @@ | |||||
| using System; | |||||
| using System; | |||||
| namespace Discord.Net | namespace Discord.Net | ||||
| { | { | ||||
| public class RateLimitedException : TimeoutException | public class RateLimitedException : TimeoutException | ||||
| { | { | ||||
| public RateLimitedException() | |||||
| public IRequest Request { get; } | |||||
| public RateLimitedException(IRequest request) | |||||
| : base("You are being rate limited.") | : base("You are being rate limited.") | ||||
| { | { | ||||
| Request = request; | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -1,4 +1,4 @@ | |||||
| using Newtonsoft.Json; | |||||
| using Newtonsoft.Json; | |||||
| using Newtonsoft.Json.Linq; | using Newtonsoft.Json.Linq; | ||||
| using System; | using System; | ||||
| #if DEBUG_LIMITS | #if DEBUG_LIMITS | ||||
| @@ -86,7 +86,7 @@ namespace Discord.Net.Queue | |||||
| Debug.WriteLine($"[{id}] (!) 502"); | Debug.WriteLine($"[{id}] (!) 502"); | ||||
| #endif | #endif | ||||
| if ((request.Options.RetryMode & RetryMode.Retry502) == 0) | if ((request.Options.RetryMode & RetryMode.Retry502) == 0) | ||||
| throw new HttpException(HttpStatusCode.BadGateway, null); | |||||
| throw new HttpException(HttpStatusCode.BadGateway, request, null); | |||||
| continue; //Retry | continue; //Retry | ||||
| default: | default: | ||||
| @@ -106,7 +106,7 @@ namespace Discord.Net.Queue | |||||
| } | } | ||||
| catch { } | catch { } | ||||
| } | } | ||||
| throw new HttpException(response.StatusCode, code, reason); | |||||
| throw new HttpException(response.StatusCode, request, code, reason); | |||||
| } | } | ||||
| } | } | ||||
| else | else | ||||
| @@ -163,7 +163,7 @@ namespace Discord.Net.Queue | |||||
| if (!isRateLimited) | if (!isRateLimited) | ||||
| throw new TimeoutException(); | throw new TimeoutException(); | ||||
| else | else | ||||
| throw new RateLimitedException(); | |||||
| throw new RateLimitedException(request); | |||||
| } | } | ||||
| lock (_lock) | lock (_lock) | ||||
| @@ -182,12 +182,12 @@ namespace Discord.Net.Queue | |||||
| } | } | ||||
| if ((request.Options.RetryMode & RetryMode.RetryRatelimit) == 0) | if ((request.Options.RetryMode & RetryMode.RetryRatelimit) == 0) | ||||
| throw new RateLimitedException(); | |||||
| throw new RateLimitedException(request); | |||||
| if (resetAt.HasValue) | if (resetAt.HasValue) | ||||
| { | { | ||||
| if (resetAt > timeoutAt) | if (resetAt > timeoutAt) | ||||
| throw new RateLimitedException(); | |||||
| throw new RateLimitedException(request); | |||||
| int millis = (int)Math.Ceiling((resetAt.Value - DateTimeOffset.UtcNow).TotalMilliseconds); | int millis = (int)Math.Ceiling((resetAt.Value - DateTimeOffset.UtcNow).TotalMilliseconds); | ||||
| #if DEBUG_LIMITS | #if DEBUG_LIMITS | ||||
| Debug.WriteLine($"[{id}] Sleeping {millis} ms (Pre-emptive)"); | Debug.WriteLine($"[{id}] Sleeping {millis} ms (Pre-emptive)"); | ||||
| @@ -198,7 +198,7 @@ namespace Discord.Net.Queue | |||||
| else | else | ||||
| { | { | ||||
| if ((timeoutAt.Value - DateTimeOffset.UtcNow).TotalMilliseconds < 500.0) | if ((timeoutAt.Value - DateTimeOffset.UtcNow).TotalMilliseconds < 500.0) | ||||
| throw new RateLimitedException(); | |||||
| throw new RateLimitedException(request); | |||||
| #if DEBUG_LIMITS | #if DEBUG_LIMITS | ||||
| Debug.WriteLine($"[{id}] Sleeping 500* ms (Pre-emptive)"); | Debug.WriteLine($"[{id}] Sleeping 500* ms (Pre-emptive)"); | ||||
| #endif | #endif | ||||
| @@ -1,11 +1,11 @@ | |||||
| using Discord.Net.Rest; | |||||
| using Discord.Net.Rest; | |||||
| using System; | using System; | ||||
| using System.IO; | using System.IO; | ||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
| namespace Discord.Net.Queue | namespace Discord.Net.Queue | ||||
| { | { | ||||
| public class RestRequest | |||||
| public class RestRequest : IRequest | |||||
| { | { | ||||
| public IRestClient Client { get; } | public IRestClient Client { get; } | ||||
| public string Method { get; } | public string Method { get; } | ||||
| @@ -1,4 +1,4 @@ | |||||
| using Discord.Net.WebSockets; | |||||
| using Discord.Net.WebSockets; | |||||
| using System; | using System; | ||||
| using System.IO; | using System.IO; | ||||
| using System.Threading; | using System.Threading; | ||||
| @@ -6,7 +6,7 @@ using System.Threading.Tasks; | |||||
| namespace Discord.Net.Queue | namespace Discord.Net.Queue | ||||
| { | { | ||||
| public class WebSocketRequest | |||||
| public class WebSocketRequest : IRequest | |||||
| { | { | ||||
| public IWebSocketClient Client { get; } | public IWebSocketClient Client { get; } | ||||
| public string BucketId { get; } | public string BucketId { get; } | ||||