/// <summary>
        /// Executes a webhook with a file attachment.
        /// <para>Note: Returns null unless <paramref name="waitAndReturnMessage"/> is set to true.</para>
        /// </summary>
        /// <param name="webhookId">The ID of the webhook to execute.</param>
        /// <param name="token">The webhook's token.</param>
        /// <param name="waitAndReturnMessage">Whether to wait for the message to be created
        /// and have it returned from this method.</param>
        /// <exception cref="ArgumentException">Thrown if the token is empty or only contains whitespace characters.</exception>
        /// <exception cref="ArgumentNullException">Thrown if the token is null,
        /// or <paramref name="fileData"/> is null,
        /// or the file name is null, empty, or only contains whitespace characters.</exception>
        /// <exception cref="DiscordHttpApiException"></exception>
        public Task <DiscordMessage> ExecuteWebhook(Snowflake webhookId, string token, Stream fileData, string fileName,
                                                    ExecuteWebhookOptions options = null, bool waitAndReturnMessage = false)
        {
            if (fileData == null)
            {
                throw new ArgumentNullException(nameof(fileData));
            }

            return(ExecuteWebhook(webhookId, token, new StreamContent(fileData), fileName, options, waitAndReturnMessage));
        }
        /// <exception cref="ArgumentException"></exception>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="DiscordHttpApiException"></exception>
        async Task <DiscordMessage> ExecuteWebhook(Snowflake webhookId, string token, HttpContent fileContent, string fileName,
                                                   ExecuteWebhookOptions options, bool waitAndReturnMessage)
        {
            if (token == null)
            {
                throw new ArgumentNullException(nameof(token));
            }
            if (string.IsNullOrWhiteSpace(token))
            {
                throw new ArgumentException("Token cannot be empty or only contain whitespace characters.", nameof(token));
            }
            if (string.IsNullOrEmpty(fileName))
            {
                // Technically already handled when adding the field to the multipart form data.
                throw new ArgumentNullException(nameof(fileName));
            }

            DiscordApiData returnData = await rest.Send(() =>
            {
                HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post,
                                                                    $"{RestClient.BASE_URL}/webhooks/{webhookId}/{token}");

                MultipartFormDataContent data = new MultipartFormDataContent();
                data.Add(fileContent, "file", fileName);

                if (options != null)
                {
                    DiscordApiData payloadJson = options.Build();
                    data.Add(new StringContent(payloadJson.SerializeToJson()), "payload_json");
                }

                request.Content = data;

                return(request);
            }, $"webhooks/{webhookId}/token").ConfigureAwait(false);

            return(waitAndReturnMessage ? new DiscordMessage(this, returnData) : null);
        }
 /// <summary>
 /// Executes a webhook with a file attachment.
 /// <para>Note: Returns null unless <paramref name="waitAndReturnMessage"/> is set to true.</para>
 /// </summary>
 /// <param name="webhookId">The ID of the webhook to execute.</param>
 /// <param name="token">The webhook's token.</param>
 /// <param name="waitAndReturnMessage">Whether to wait for the message to be created
 /// and have it returned from this method.</param>
 /// <exception cref="ArgumentException">Thrown if the token is empty or only contains whitespace characters.</exception>
 /// <exception cref="ArgumentNullException">Thrown if the token is null
 /// or the file name is null, empty, or only contains whitespace characters.</exception>
 /// <exception cref="DiscordHttpApiException"></exception>
 public Task <DiscordMessage> ExecuteWebhook(Snowflake webhookId, string token, ArraySegment <byte> fileData, string fileName,
                                             ExecuteWebhookOptions options = null, bool waitAndReturnMessage = false)
 {
     return(ExecuteWebhook(webhookId, token, new ByteArrayContent(fileData.Array, fileData.Offset, fileData.Count), fileName,
                           options, waitAndReturnMessage));
 }
        /// <summary>
        /// Executes a webhook.
        /// <para>Note: Returns null unless <paramref name="waitAndReturnMessage"/> is set to true.</para>
        /// </summary>
        /// <param name="webhookId">The ID of the webhook to execute.</param>
        /// <param name="token">The webhook's token.</param>
        /// <param name="waitAndReturnMessage">Whether to wait for the message to be created
        /// and have it returned from this method.</param>
        /// <exception cref="ArgumentException">Thrown if the token is empty or only contains whitespace characters.</exception>
        /// <exception cref="ArgumentNullException">Thrown if the token or <paramref name="options"/> is null.</exception>
        /// <exception cref="DiscordHttpApiException"></exception>
        public async Task <DiscordMessage> ExecuteWebhook(Snowflake webhookId, string token, ExecuteWebhookOptions options,
                                                          bool waitAndReturnMessage = false)
        {
            if (token == null)
            {
                throw new ArgumentNullException(nameof(token));
            }
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }
            if (string.IsNullOrWhiteSpace(token))
            {
                throw new ArgumentException("Token cannot be empty or only contain whitespace characters.", nameof(token));
            }

            DiscordApiData requestData = options.Build();

            DiscordApiData returnData = await rest.Post($"webhooks/{webhookId}/{token}?wait={waitAndReturnMessage}", requestData,
                                                        $"webhooks/{webhookId}/token").ConfigureAwait(false);

            return(waitAndReturnMessage ? new DiscordMessage(this, returnData) : null);
        }