internal DiscordHttpRateLimitException(RateLimitHeaders rateLimitHeaders, string message, DiscordHttpErrorCode errorCode, HttpStatusCode httpCode) : base(message, errorCode, httpCode) { IsGlobal = rateLimitHeaders.IsGlobal; Limit = rateLimitHeaders.Limit; Reset = rateLimitHeaders.Reset; RetryAfter = rateLimitHeaders.RetryAfter.GetValueOrDefault(); // Should always be set, but just in case. }
internal DiscordHttpRateLimitException(RateLimitHeaders rateLimitHeaders, string message, DiscordHttpErrorCode errorCode, HttpStatusCode httpCode) : base(message, errorCode, httpCode) { IsGlobal = rateLimitHeaders.IsGlobal; Limit = rateLimitHeaders.Limit; ResetHighPrecision = rateLimitHeaders.Reset; RetryAfter = rateLimitHeaders.RetryAfter.GetValueOrDefault(); // Should always be set, but just in case. #pragma warning disable CS0618 // Type or member is obsolete Reset = (ulong)rateLimitHeaders.Reset; #pragma warning restore CS0618 // Type or member is obsolete }
static string CreateExceptionMessage(string message, DiscordHttpErrorCode errorCode, HttpStatusCode httpCode) { StringBuilder sb = new StringBuilder(); if (errorCode == DiscordHttpErrorCode.None) { sb.Append($"{httpCode}({(int)httpCode}): "); } else { sb.Append($"{errorCode}({(int)errorCode}): "); } sb.Append(message); return(sb.ToString()); }
internal DiscordHttpApiException(string message, DiscordHttpErrorCode errorCode, HttpStatusCode httpCode) : base(CreateExceptionMessage(message, errorCode, httpCode)) { ErrorCode = errorCode; HttpStatusCode = httpCode; }
/// <exception cref="DiscordHttpApiException"></exception> async Task <DiscordApiData> ParseResponse(HttpResponseMessage response, RateLimitHeaders rateLimitHeaders) { // Read response payload as string string json; if (response.StatusCode == HttpStatusCode.NoContent) { json = null; } else { json = await response.Content.ReadAsStringAsync().ConfigureAwait(false); } // Attempt to parse the payload as JSON. DiscordApiData data; if (DiscordApiData.TryParseJson(json, out data)) { if (response.IsSuccessStatusCode) { // If successful, no more action is required. return(data); } else { string message = null; DiscordHttpErrorCode errorCode = DiscordHttpErrorCode.None; // Get the Discord-specific error code if it exists. if ((int)response.StatusCode == 429) { errorCode = DiscordHttpErrorCode.TooManyRequests; } else if (data.ContainsKey("code")) { long?code = data.GetInt64("code"); if (code.HasValue) { errorCode = (DiscordHttpErrorCode)code; } } // Get the message. if (data.ContainsKey("content")) { IList <DiscordApiData> content = data.GetArray("content"); StringBuilder sb = new StringBuilder(); for (int i = 0; i < content.Count; i++) { sb.Append(content[i]); if (i < content.Count - 1) { sb.Append(", "); } } message = sb.ToString(); } else if (data.ContainsKey("message")) { message = data.GetString("message"); } else if (response.StatusCode == HttpStatusCode.BadRequest && data.Type == DiscordApiDataType.Container) { StringBuilder sb = new StringBuilder(); foreach (KeyValuePair <string, DiscordApiData> pair in data.Entries) { sb.Append($"{pair.Key}: "); if (pair.Value.Type != DiscordApiDataType.Array) { // Shouldn't happen, but if it does then this error is not one we can parse. // Set sb to null so that message ends up null and let the application get // the raw JSON payload so they at least know what happened until we can // implement the correct parser. sb = null; break; } bool addComma = false; foreach (DiscordApiData errorData in pair.Value.Values) { if (addComma) { sb.Append(", "); } sb.Append(errorData.ToString()); addComma = true; } sb.AppendLine(); } message = sb?.ToString(); } // Throw the appropriate exception if (message != null) // If null, let the "unknown error" exception be thrown { if ((int)response.StatusCode == 429 && rateLimitHeaders != null) { throw new DiscordHttpRateLimitException(rateLimitHeaders, message, errorCode, response.StatusCode); } else { throw new DiscordHttpApiException(message, errorCode, response.StatusCode); } } } } throw new DiscordHttpApiException($"Unknown error. Response: {json}", DiscordHttpErrorCode.None, response.StatusCode); }