Ejemplo n.º 1
0
 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.
 }
Ejemplo n.º 2
0
        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
        }
Ejemplo n.º 3
0
        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());
        }
Ejemplo n.º 4
0
 internal DiscordHttpApiException(string message, DiscordHttpErrorCode errorCode, HttpStatusCode httpCode)
     : base(CreateExceptionMessage(message, errorCode, httpCode))
 {
     ErrorCode      = errorCode;
     HttpStatusCode = httpCode;
 }
Ejemplo n.º 5
0
        /// <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);
        }