[Feature] Refactor SendMessageAsync & SendFile(s)Async methods & modify webhook message attachments (#2609)
* initial commit * resolve merge conficts * code review suggestions
This commit is contained in:
@@ -31,7 +31,8 @@ namespace Discord
|
|||||||
/// <param name="components">The message components to be included with this message. Used for interactions.</param>
|
/// <param name="components">The message components to be included with this message. Used for interactions.</param>
|
||||||
/// <param name="stickers">A collection of stickers to send with the message.</param>
|
/// <param name="stickers">A collection of stickers to send with the message.</param>
|
||||||
/// <param name="embeds">A array of <see cref="Embed"/>s to send with this response. Max 10.</param>
|
/// <param name="embeds">A array of <see cref="Embed"/>s to send with this response. Max 10.</param>
|
||||||
/// <param name="flags">A message flag to be applied to the sent message, only <see cref="MessageFlags.SuppressEmbeds"/> is permitted.</param>
|
/// <param name="flags">A message flag to be applied to the sent message, only <see cref="MessageFlags.SuppressEmbeds"/>
|
||||||
|
/// and <see cref="MessageFlags.SuppressNotification"/> is permitted.</param>
|
||||||
/// <returns>
|
/// <returns>
|
||||||
/// A task that represents an asynchronous send operation for delivering the message. The task result
|
/// A task that represents an asynchronous send operation for delivering the message. The task result
|
||||||
/// contains the sent message.
|
/// contains the sent message.
|
||||||
@@ -72,7 +73,7 @@ namespace Discord
|
|||||||
/// <param name="components">The message components to be included with this message. Used for interactions.</param>
|
/// <param name="components">The message components to be included with this message. Used for interactions.</param>
|
||||||
/// <param name="stickers">A collection of stickers to send with the file.</param>
|
/// <param name="stickers">A collection of stickers to send with the file.</param>
|
||||||
/// <param name="embeds">A array of <see cref="Embed"/>s to send with this response. Max 10.</param>
|
/// <param name="embeds">A array of <see cref="Embed"/>s to send with this response. Max 10.</param>
|
||||||
/// <param name="flags">A message flag to be applied to the sent message, only <see cref="MessageFlags.SuppressEmbeds"/> is permitted.</param>
|
/// <param name="flags">A message flag to be applied to the sent message, only <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.SuppressNotification"/> is permitted.</param>
|
||||||
/// <returns>
|
/// <returns>
|
||||||
/// A task that represents an asynchronous send operation for delivering the message. The task result
|
/// A task that represents an asynchronous send operation for delivering the message. The task result
|
||||||
/// contains the sent message.
|
/// contains the sent message.
|
||||||
@@ -110,7 +111,7 @@ namespace Discord
|
|||||||
/// <param name="components">The message components to be included with this message. Used for interactions.</param>
|
/// <param name="components">The message components to be included with this message. Used for interactions.</param>
|
||||||
/// <param name="stickers">A collection of stickers to send with the file.</param>
|
/// <param name="stickers">A collection of stickers to send with the file.</param>
|
||||||
/// <param name="embeds">A array of <see cref="Embed"/>s to send with this response. Max 10.</param>
|
/// <param name="embeds">A array of <see cref="Embed"/>s to send with this response. Max 10.</param>
|
||||||
/// <param name="flags">A message flag to be applied to the sent message, only <see cref="MessageFlags.SuppressEmbeds"/> is permitted.</param>
|
/// <param name="flags">A message flag to be applied to the sent message, only <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.SuppressNotification"/> is permitted.</param>
|
||||||
/// <returns>
|
/// <returns>
|
||||||
/// A task that represents an asynchronous send operation for delivering the message. The task result
|
/// A task that represents an asynchronous send operation for delivering the message. The task result
|
||||||
/// contains the sent message.
|
/// contains the sent message.
|
||||||
@@ -140,7 +141,7 @@ namespace Discord
|
|||||||
/// <param name="components">The message components to be included with this message. Used for interactions.</param>
|
/// <param name="components">The message components to be included with this message. Used for interactions.</param>
|
||||||
/// <param name="stickers">A collection of stickers to send with the file.</param>
|
/// <param name="stickers">A collection of stickers to send with the file.</param>
|
||||||
/// <param name="embeds">A array of <see cref="Embed"/>s to send with this response. Max 10.</param>
|
/// <param name="embeds">A array of <see cref="Embed"/>s to send with this response. Max 10.</param>
|
||||||
/// <param name="flags">A message flag to be applied to the sent message, only <see cref="MessageFlags.SuppressEmbeds"/> is permitted.</param>
|
/// <param name="flags">A message flag to be applied to the sent message, only <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.SuppressNotification"/> is permitted.</param>
|
||||||
/// <returns>
|
/// <returns>
|
||||||
/// A task that represents an asynchronous send operation for delivering the message. The task result
|
/// A task that represents an asynchronous send operation for delivering the message. The task result
|
||||||
/// contains the sent message.
|
/// contains the sent message.
|
||||||
@@ -170,7 +171,7 @@ namespace Discord
|
|||||||
/// <param name="components">The message components to be included with this message. Used for interactions.</param>
|
/// <param name="components">The message components to be included with this message. Used for interactions.</param>
|
||||||
/// <param name="stickers">A collection of stickers to send with the file.</param>
|
/// <param name="stickers">A collection of stickers to send with the file.</param>
|
||||||
/// <param name="embeds">A array of <see cref="Embed"/>s to send with this response. Max 10.</param>
|
/// <param name="embeds">A array of <see cref="Embed"/>s to send with this response. Max 10.</param>
|
||||||
/// <param name="flags">A message flag to be applied to the sent message, only <see cref="MessageFlags.SuppressEmbeds"/> is permitted.</param>
|
/// <param name="flags">A message flag to be applied to the sent message, only <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.SuppressNotification"/> is permitted.</param>
|
||||||
/// <returns>
|
/// <returns>
|
||||||
/// A task that represents an asynchronous send operation for delivering the message. The task result
|
/// A task that represents an asynchronous send operation for delivering the message. The task result
|
||||||
/// contains the sent message.
|
/// contains the sent message.
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace Discord
|
namespace Discord
|
||||||
{
|
{
|
||||||
@@ -69,6 +71,50 @@ namespace Discord
|
|||||||
|
|
||||||
private static ArgumentException CreateNotEmptyException(string name, string msg)
|
private static ArgumentException CreateNotEmptyException(string name, string msg)
|
||||||
=> new ArgumentException(message: msg ?? "Argument cannot be blank.", paramName: name);
|
=> new ArgumentException(message: msg ?? "Argument cannot be blank.", paramName: name);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Message Validation
|
||||||
|
|
||||||
|
public static void WebhookMessageAtLeastOneOf(string text = null, MessageComponent components = null, ICollection<IEmbed> embeds = null,
|
||||||
|
IEnumerable<FileAttachment> attachments = null)
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(text))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (components != null && components.Components.Count != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (attachments != null && attachments.Count() != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (embeds != null && embeds.Count != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
throw new ArgumentException($"At least one of 'Content', 'Embeds', 'Components' or 'Attachments' must be specified.");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void MessageAtLeastOneOf(string text = null, MessageComponent components = null, ICollection<IEmbed> embeds = null,
|
||||||
|
ICollection<ISticker> stickers = null, IEnumerable<FileAttachment> attachments = null)
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(text))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (components != null && components.Components.Count != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (stickers != null && stickers.Count != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (attachments != null && attachments.Count() != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (embeds != null && embeds.Count != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
throw new ArgumentException($"At least one of 'Content', 'Embeds', 'Components', 'Stickers' or 'Attachments' must be specified.");
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Numerics
|
#region Numerics
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ namespace Discord.API.Rest
|
|||||||
internal class CreateMessageParams
|
internal class CreateMessageParams
|
||||||
{
|
{
|
||||||
[JsonProperty("content")]
|
[JsonProperty("content")]
|
||||||
public string Content { get; }
|
public Optional<string> Content { get; set; }
|
||||||
|
|
||||||
[JsonProperty("nonce")]
|
[JsonProperty("nonce")]
|
||||||
public Optional<string> Nonce { get; set; }
|
public Optional<string> Nonce { get; set; }
|
||||||
@@ -31,10 +31,5 @@ namespace Discord.API.Rest
|
|||||||
|
|
||||||
[JsonProperty("flags")]
|
[JsonProperty("flags")]
|
||||||
public Optional<MessageFlags> Flags { get; set; }
|
public Optional<MessageFlags> Flags { get; set; }
|
||||||
|
|
||||||
public CreateMessageParams(string content)
|
|
||||||
{
|
|
||||||
Content = content;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -816,16 +816,16 @@ namespace Discord.API
|
|||||||
endpoint = () => $"channels/{channelId}/messages?limit={limit}";
|
endpoint = () => $"channels/{channelId}/messages?limit={limit}";
|
||||||
return await SendAsync<IReadOnlyCollection<Message>>("GET", endpoint, ids, options: options).ConfigureAwait(false);
|
return await SendAsync<IReadOnlyCollection<Message>>("GET", endpoint, ids, options: options).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
public async Task<Message> CreateMessageAsync(ulong channelId, CreateMessageParams args, RequestOptions options = null)
|
public async Task<Message> CreateMessageAsync(ulong channelId, CreateMessageParams args, RequestOptions options = null)
|
||||||
{
|
{
|
||||||
Preconditions.NotNull(args, nameof(args));
|
Preconditions.NotNull(args, nameof(args));
|
||||||
Preconditions.NotEqual(channelId, 0, nameof(channelId));
|
Preconditions.NotEqual(channelId, 0, nameof(channelId));
|
||||||
if ((!args.Embeds.IsSpecified || args.Embeds.Value == null || args.Embeds.Value.Length == 0) && (!args.Stickers.IsSpecified || args.Stickers.Value == null || args.Stickers.Value.Length == 0))
|
|
||||||
Preconditions.NotNullOrEmpty(args.Content, nameof(args.Content));
|
|
||||||
|
|
||||||
if (args.Content?.Length > DiscordConfig.MaxMessageSize)
|
if (args.Content.IsSpecified && args.Content.Value is not null)
|
||||||
throw new ArgumentException(message: $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", paramName: nameof(args.Content));
|
Preconditions.AtMost(args.Content.Value.Length, DiscordConfig.MaxMessageSize, nameof(args.Content), $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.");
|
||||||
|
|
||||||
options = RequestOptions.CreateOrClone(options);
|
options = RequestOptions.CreateOrClone(options);
|
||||||
|
|
||||||
var ids = new BucketIds(channelId: channelId);
|
var ids = new BucketIds(channelId: channelId);
|
||||||
@@ -840,13 +840,10 @@ namespace Discord.API
|
|||||||
if (AuthTokenType != TokenType.Webhook)
|
if (AuthTokenType != TokenType.Webhook)
|
||||||
throw new InvalidOperationException($"This operation may only be called with a {nameof(TokenType.Webhook)} token.");
|
throw new InvalidOperationException($"This operation may only be called with a {nameof(TokenType.Webhook)} token.");
|
||||||
|
|
||||||
Preconditions.NotNull(args, nameof(args));
|
if (args.Embeds.IsSpecified)
|
||||||
Preconditions.NotEqual(webhookId, 0, nameof(webhookId));
|
Preconditions.AtMost(args.Embeds.Value.Length, DiscordConfig.MaxEmbedsPerMessage, nameof(args.Embeds), "A max of 10 Embeds are allowed.");
|
||||||
if (!args.Embeds.IsSpecified || args.Embeds.Value == null || args.Embeds.Value.Length == 0)
|
if (args.Content.IsSpecified && args.Content.Value is not null)
|
||||||
Preconditions.NotNullOrEmpty(args.Content, nameof(args.Content));
|
Preconditions.AtMost(args.Content.Value.Length, DiscordConfig.MaxMessageSize, nameof(args.Content), $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.");
|
||||||
|
|
||||||
if (args.Content.IsSpecified && args.Content.Value?.Length > DiscordConfig.MaxMessageSize)
|
|
||||||
throw new ArgumentException(message: $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", paramName: nameof(args.Content));
|
|
||||||
|
|
||||||
options = RequestOptions.CreateOrClone(options);
|
options = RequestOptions.CreateOrClone(options);
|
||||||
|
|
||||||
@@ -866,15 +863,38 @@ namespace Discord.API
|
|||||||
Preconditions.NotEqual(messageId, 0, nameof(messageId));
|
Preconditions.NotEqual(messageId, 0, nameof(messageId));
|
||||||
|
|
||||||
if (args.Embeds.IsSpecified)
|
if (args.Embeds.IsSpecified)
|
||||||
Preconditions.AtMost(args.Embeds.Value.Length, 10, nameof(args.Embeds), "A max of 10 Embeds are allowed.");
|
Preconditions.AtMost(args.Embeds.Value.Length, DiscordConfig.MaxEmbedsPerMessage, nameof(args.Embeds), $"A max of {DiscordConfig.MaxEmbedsPerMessage} Embeds are allowed.");
|
||||||
if (args.Content.IsSpecified && args.Content.Value.Length > DiscordConfig.MaxMessageSize)
|
if (args.Content.IsSpecified && args.Content.Value is not null)
|
||||||
throw new ArgumentException(message: $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", paramName: nameof(args.Content));
|
Preconditions.AtMost(args.Content.Value.Length, DiscordConfig.MaxMessageSize, nameof(args.Content), $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.");
|
||||||
|
|
||||||
options = RequestOptions.CreateOrClone(options);
|
options = RequestOptions.CreateOrClone(options);
|
||||||
|
|
||||||
var ids = new BucketIds(webhookId: webhookId);
|
var ids = new BucketIds(webhookId: webhookId);
|
||||||
await SendJsonAsync<Message>("PATCH", () => $"webhooks/{webhookId}/{AuthToken}/messages/{messageId}?{WebhookQuery(false, threadId)}", args, ids, clientBucket: ClientBucketType.SendEdit, options: options).ConfigureAwait(false);
|
await SendJsonAsync<Message>("PATCH", () => $"webhooks/{webhookId}/{AuthToken}/messages/{messageId}?{WebhookQuery(false, threadId)}", args, ids, clientBucket: ClientBucketType.SendEdit, options: options).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
|
/// <exception cref="InvalidOperationException">This operation may only be called with a <see cref="TokenType.Webhook"/> token.</exception>
|
||||||
|
public async Task ModifyWebhookMessageAsync(ulong webhookId, ulong messageId, UploadWebhookFileParams args, RequestOptions options = null, ulong? threadId = null)
|
||||||
|
{
|
||||||
|
if (AuthTokenType != TokenType.Webhook)
|
||||||
|
throw new InvalidOperationException($"This operation may only be called with a {nameof(TokenType.Webhook)} token.");
|
||||||
|
|
||||||
|
Preconditions.NotNull(args, nameof(args));
|
||||||
|
Preconditions.NotEqual(webhookId, 0, nameof(webhookId));
|
||||||
|
Preconditions.NotEqual(messageId, 0, nameof(messageId));
|
||||||
|
|
||||||
|
if (args.Embeds.IsSpecified)
|
||||||
|
Preconditions.AtMost(args.Embeds.Value.Length, DiscordConfig.MaxEmbedsPerMessage, nameof(args.Embeds), $"A max of {DiscordConfig.MaxEmbedsPerMessage} Embeds are allowed.");
|
||||||
|
if (args.Content.IsSpecified && args.Content.Value is not null)
|
||||||
|
Preconditions.AtMost(args.Content.Value.Length, DiscordConfig.MaxMessageSize, nameof(args.Content), $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.");
|
||||||
|
|
||||||
|
options = RequestOptions.CreateOrClone(options);
|
||||||
|
|
||||||
|
var ids = new BucketIds(webhookId: webhookId);
|
||||||
|
await SendMultipartAsync<Message>("PATCH", () => $"webhooks/{webhookId}/{AuthToken}/messages/{messageId}?{WebhookQuery(false, threadId)}", args.ToDictionary(), ids, clientBucket: ClientBucketType.SendEdit, options: options).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
/// <exception cref="InvalidOperationException">This operation may only be called with a <see cref="TokenType.Webhook"/> token.</exception>
|
/// <exception cref="InvalidOperationException">This operation may only be called with a <see cref="TokenType.Webhook"/> token.</exception>
|
||||||
public async Task DeleteWebhookMessageAsync(ulong webhookId, ulong messageId, RequestOptions options = null, ulong? threadId = null)
|
public async Task DeleteWebhookMessageAsync(ulong webhookId, ulong messageId, RequestOptions options = null, ulong? threadId = null)
|
||||||
{
|
{
|
||||||
@@ -897,10 +917,10 @@ namespace Discord.API
|
|||||||
Preconditions.NotEqual(channelId, 0, nameof(channelId));
|
Preconditions.NotEqual(channelId, 0, nameof(channelId));
|
||||||
options = RequestOptions.CreateOrClone(options);
|
options = RequestOptions.CreateOrClone(options);
|
||||||
|
|
||||||
if (args.Content.GetValueOrDefault(null) == null)
|
if (args.Embeds.IsSpecified)
|
||||||
args.Content = "";
|
Preconditions.AtMost(args.Embeds.Value.Length, DiscordConfig.MaxEmbedsPerMessage, nameof(args.Embeds), $"A max of {DiscordConfig.MaxEmbedsPerMessage} Embeds are allowed.");
|
||||||
else if (args.Content.IsSpecified && args.Content.Value?.Length > DiscordConfig.MaxMessageSize)
|
if (args.Content.IsSpecified && args.Content.Value is not null)
|
||||||
throw new ArgumentOutOfRangeException($"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", nameof(args.Content));
|
Preconditions.AtMost(args.Content.Value.Length, DiscordConfig.MaxMessageSize, nameof(args.Content), $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.");
|
||||||
|
|
||||||
var ids = new BucketIds(channelId: channelId);
|
var ids = new BucketIds(channelId: channelId);
|
||||||
return await SendMultipartAsync<Message>("POST", () => $"channels/{channelId}/messages", args.ToDictionary(), ids, clientBucket: ClientBucketType.SendEdit, options: options).ConfigureAwait(false);
|
return await SendMultipartAsync<Message>("POST", () => $"channels/{channelId}/messages", args.ToDictionary(), ids, clientBucket: ClientBucketType.SendEdit, options: options).ConfigureAwait(false);
|
||||||
@@ -917,19 +937,15 @@ namespace Discord.API
|
|||||||
Preconditions.NotEqual(webhookId, 0, nameof(webhookId));
|
Preconditions.NotEqual(webhookId, 0, nameof(webhookId));
|
||||||
options = RequestOptions.CreateOrClone(options);
|
options = RequestOptions.CreateOrClone(options);
|
||||||
|
|
||||||
if (args.Content.GetValueOrDefault(null) == null)
|
if (args.Embeds.IsSpecified)
|
||||||
args.Content = "";
|
Preconditions.AtMost(args.Embeds.Value.Length, DiscordConfig.MaxEmbedsPerMessage, nameof(args.Embeds), $"A max of {DiscordConfig.MaxEmbedsPerMessage} Embeds are allowed.");
|
||||||
else if (args.Content.IsSpecified)
|
if (args.Content.IsSpecified && args.Content.Value is not null)
|
||||||
{
|
Preconditions.AtMost(args.Content.Value.Length, DiscordConfig.MaxMessageSize, nameof(args.Content), $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.");
|
||||||
if (args.Content.Value == null)
|
|
||||||
args.Content = "";
|
|
||||||
if (args.Content.Value?.Length > DiscordConfig.MaxMessageSize)
|
|
||||||
throw new ArgumentOutOfRangeException($"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", nameof(args.Content));
|
|
||||||
}
|
|
||||||
|
|
||||||
var ids = new BucketIds(webhookId: webhookId);
|
var ids = new BucketIds(webhookId: webhookId);
|
||||||
return await SendMultipartAsync<Message>("POST", () => $"webhooks/{webhookId}/{AuthToken}?{WebhookQuery(true, threadId)}", args.ToDictionary(), ids, clientBucket: ClientBucketType.SendEdit, options: options).ConfigureAwait(false);
|
return await SendMultipartAsync<Message>("POST", () => $"webhooks/{webhookId}/{AuthToken}?{WebhookQuery(true, threadId)}", args.ToDictionary(), ids, clientBucket: ClientBucketType.SendEdit, options: options).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task DeleteMessageAsync(ulong channelId, ulong messageId, RequestOptions options = null)
|
public async Task DeleteMessageAsync(ulong channelId, ulong messageId, RequestOptions options = null)
|
||||||
{
|
{
|
||||||
Preconditions.NotEqual(channelId, 0, nameof(channelId));
|
Preconditions.NotEqual(channelId, 0, nameof(channelId));
|
||||||
@@ -939,6 +955,7 @@ namespace Discord.API
|
|||||||
var ids = new BucketIds(channelId: channelId);
|
var ids = new BucketIds(channelId: channelId);
|
||||||
await SendAsync("DELETE", () => $"channels/{channelId}/messages/{messageId}", ids, options: options).ConfigureAwait(false);
|
await SendAsync("DELETE", () => $"channels/{channelId}/messages/{messageId}", ids, options: options).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task DeleteMessagesAsync(ulong channelId, DeleteMessagesParams args, RequestOptions options = null)
|
public async Task DeleteMessagesAsync(ulong channelId, DeleteMessagesParams args, RequestOptions options = null)
|
||||||
{
|
{
|
||||||
Preconditions.NotEqual(channelId, 0, nameof(channelId));
|
Preconditions.NotEqual(channelId, 0, nameof(channelId));
|
||||||
@@ -967,8 +984,12 @@ namespace Discord.API
|
|||||||
Preconditions.NotEqual(channelId, 0, nameof(channelId));
|
Preconditions.NotEqual(channelId, 0, nameof(channelId));
|
||||||
Preconditions.NotEqual(messageId, 0, nameof(messageId));
|
Preconditions.NotEqual(messageId, 0, nameof(messageId));
|
||||||
Preconditions.NotNull(args, nameof(args));
|
Preconditions.NotNull(args, nameof(args));
|
||||||
if (args.Content.IsSpecified && args.Content.Value?.Length > DiscordConfig.MaxMessageSize)
|
|
||||||
throw new ArgumentOutOfRangeException($"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", nameof(args.Content));
|
if (args.Embeds.IsSpecified)
|
||||||
|
Preconditions.AtMost(args.Embeds.Value.Length, DiscordConfig.MaxEmbedsPerMessage, nameof(args.Embeds), "A max of 10 Embeds are allowed.");
|
||||||
|
if (args.Content.IsSpecified && args.Content.Value is not null)
|
||||||
|
Preconditions.AtMost(args.Content.Value.Length, DiscordConfig.MaxMessageSize, nameof(args.Content), $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.");
|
||||||
|
|
||||||
options = RequestOptions.CreateOrClone(options);
|
options = RequestOptions.CreateOrClone(options);
|
||||||
|
|
||||||
var ids = new BucketIds(channelId: channelId);
|
var ids = new BucketIds(channelId: channelId);
|
||||||
@@ -980,8 +1001,12 @@ namespace Discord.API
|
|||||||
Preconditions.NotEqual(channelId, 0, nameof(channelId));
|
Preconditions.NotEqual(channelId, 0, nameof(channelId));
|
||||||
Preconditions.NotEqual(messageId, 0, nameof(messageId));
|
Preconditions.NotEqual(messageId, 0, nameof(messageId));
|
||||||
Preconditions.NotNull(args, nameof(args));
|
Preconditions.NotNull(args, nameof(args));
|
||||||
if (args.Content.IsSpecified && args.Content.Value?.Length > DiscordConfig.MaxMessageSize)
|
|
||||||
throw new ArgumentOutOfRangeException($"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", nameof(args.Content));
|
if (args.Embeds.IsSpecified)
|
||||||
|
Preconditions.AtMost(args.Embeds.Value.Length, DiscordConfig.MaxEmbedsPerMessage, nameof(args.Embeds), "A max of 10 Embeds are allowed.");
|
||||||
|
if (args.Content.IsSpecified && args.Content.Value is not null)
|
||||||
|
Preconditions.AtMost(args.Content.Value.Length, DiscordConfig.MaxMessageSize, nameof(args.Content), $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.");
|
||||||
|
|
||||||
options = RequestOptions.CreateOrClone(options);
|
options = RequestOptions.CreateOrClone(options);
|
||||||
|
|
||||||
var ids = new BucketIds(channelId: channelId);
|
var ids = new BucketIds(channelId: channelId);
|
||||||
@@ -1444,8 +1469,15 @@ namespace Discord.API
|
|||||||
|
|
||||||
public async Task<Message> CreateInteractionFollowupMessageAsync(CreateWebhookMessageParams args, string token, RequestOptions options = null)
|
public async Task<Message> CreateInteractionFollowupMessageAsync(CreateWebhookMessageParams args, string token, RequestOptions options = null)
|
||||||
{
|
{
|
||||||
if ((!args.Embeds.IsSpecified || args.Embeds.Value == null || args.Embeds.Value.Length == 0) && !args.File.IsSpecified)
|
if ((!args.Embeds.IsSpecified || args.Embeds.Value == null || args.Embeds.Value.Length == 0)
|
||||||
Preconditions.NotNullOrEmpty(args.Content, nameof(args.Content));
|
&& (!args.Content.IsSpecified || args.Content.Value is null || string.IsNullOrWhiteSpace(args.Content.Value))
|
||||||
|
&& (!args.Components.IsSpecified || args.Components.Value is null || args.Components.Value.Length == 0))
|
||||||
|
{
|
||||||
|
throw new ArgumentException("At least one of 'Content', 'Embeds', 'File' or 'Components' must be specified.", nameof(args));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.Content.IsSpecified && args.Content.Value is not null && args.Content.Value.Length > DiscordConfig.MaxMessageSize)
|
||||||
|
throw new ArgumentException(message: $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", paramName: nameof(args.Content));
|
||||||
|
|
||||||
if (args.Content.IsSpecified && args.Content.Value?.Length > DiscordConfig.MaxMessageSize)
|
if (args.Content.IsSpecified && args.Content.Value?.Length > DiscordConfig.MaxMessageSize)
|
||||||
throw new ArgumentException(message: $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", paramName: nameof(args.Content));
|
throw new ArgumentException(message: $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", paramName: nameof(args.Content));
|
||||||
@@ -1460,9 +1492,12 @@ namespace Discord.API
|
|||||||
|
|
||||||
public async Task<Message> CreateInteractionFollowupMessageAsync(UploadWebhookFileParams args, string token, RequestOptions options = null)
|
public async Task<Message> CreateInteractionFollowupMessageAsync(UploadWebhookFileParams args, string token, RequestOptions options = null)
|
||||||
{
|
{
|
||||||
if ((!args.Embeds.IsSpecified || args.Embeds.Value == null || args.Embeds.Value.Length == 0) && !args.Files.Any())
|
if ((!args.Embeds.IsSpecified || args.Embeds.Value == null || args.Embeds.Value.Length == 0)
|
||||||
Preconditions.NotNullOrEmpty(args.Content, nameof(args.Content));
|
&& (!args.Content.IsSpecified || args.Content.Value is null || string.IsNullOrWhiteSpace(args.Content.Value))
|
||||||
|
&& (!args.MessageComponents.IsSpecified || args.MessageComponents.Value is null || args.MessageComponents.Value.Length == 0))
|
||||||
|
{
|
||||||
|
throw new ArgumentException("At least one of 'Content', 'Embeds', 'Files' or 'Components' must be specified.", nameof(args));
|
||||||
|
}
|
||||||
if (args.Content.IsSpecified && args.Content.Value?.Length > DiscordConfig.MaxMessageSize)
|
if (args.Content.IsSpecified && args.Content.Value?.Length > DiscordConfig.MaxMessageSize)
|
||||||
throw new ArgumentException(message: $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", paramName: nameof(args.Content));
|
throw new ArgumentException(message: $"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", paramName: nameof(args.Content));
|
||||||
|
|
||||||
|
|||||||
@@ -281,7 +281,9 @@ namespace Discord.Rest
|
|||||||
|
|
||||||
Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed.");
|
Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed.");
|
||||||
Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed.");
|
Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed.");
|
||||||
Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed.");
|
Preconditions.AtMost(embeds.Length, DiscordConfig.MaxEmbedsPerMessage, nameof(embeds), $"A max of {DiscordConfig.MaxEmbedsPerMessage} Embeds are allowed.");
|
||||||
|
|
||||||
|
Preconditions.MessageAtLeastOneOf(text, components, embeds, stickers);
|
||||||
|
|
||||||
// check that user flag and user Id list are exclusive, same with role flag and role Id list
|
// check that user flag and user Id list are exclusive, same with role flag and role Id list
|
||||||
if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue)
|
if (allowedMentions != null && allowedMentions.AllowedTypes.HasValue)
|
||||||
@@ -304,12 +306,12 @@ namespace Discord.Rest
|
|||||||
Preconditions.AtMost(stickers.Length, 3, nameof(stickers), "A max of 3 stickers are allowed.");
|
Preconditions.AtMost(stickers.Length, 3, nameof(stickers), "A max of 3 stickers are allowed.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (flags is not MessageFlags.None and not MessageFlags.SuppressEmbeds and not MessageFlags.SuppressNotification)
|
||||||
if (flags is not MessageFlags.None and not MessageFlags.SuppressEmbeds)
|
|
||||||
throw new ArgumentException("The only valid MessageFlags are SuppressEmbeds and none.", nameof(flags));
|
throw new ArgumentException("The only valid MessageFlags are SuppressEmbeds and none.", nameof(flags));
|
||||||
|
|
||||||
var args = new CreateMessageParams(text)
|
var args = new CreateMessageParams
|
||||||
{
|
{
|
||||||
|
Content = text,
|
||||||
IsTTS = isTTS,
|
IsTTS = isTTS,
|
||||||
Embeds = embeds.Any() ? embeds.Select(x => x.ToModel()).ToArray() : Optional<API.Embed[]>.Unspecified,
|
Embeds = embeds.Any() ? embeds.Select(x => x.ToModel()).ToArray() : Optional<API.Embed[]>.Unspecified,
|
||||||
AllowedMentions = allowedMentions?.ToModel(),
|
AllowedMentions = allowedMentions?.ToModel(),
|
||||||
@@ -346,7 +348,7 @@ namespace Discord.Rest
|
|||||||
/// <exception cref="NotSupportedException"><paramref name="filePath" /> is in an invalid format.</exception>
|
/// <exception cref="NotSupportedException"><paramref name="filePath" /> is in an invalid format.</exception>
|
||||||
/// <exception cref="IOException">An I/O error occurred while opening the file.</exception>
|
/// <exception cref="IOException">An I/O error occurred while opening the file.</exception>
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/>, <see cref="MessageFlags.SuppressNotification"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public static async Task<RestUserMessage> SendFileAsync(IMessageChannel channel, BaseDiscordClient client,
|
public static async Task<RestUserMessage> SendFileAsync(IMessageChannel channel, BaseDiscordClient client,
|
||||||
string filePath, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions,
|
string filePath, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions,
|
||||||
MessageReference messageReference, MessageComponent components, ISticker[] stickers, RequestOptions options,
|
MessageReference messageReference, MessageComponent components, ISticker[] stickers, RequestOptions options,
|
||||||
@@ -379,7 +381,7 @@ namespace Discord.Rest
|
|||||||
=> SendFilesAsync(channel, client, new[] { attachment }, text, isTTS, embed, allowedMentions, messageReference,
|
=> SendFilesAsync(channel, client, new[] { attachment }, text, isTTS, embed, allowedMentions, messageReference,
|
||||||
components, stickers, options, embeds, flags);
|
components, stickers, options, embeds, flags);
|
||||||
|
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/>, <see cref="MessageFlags.SuppressNotification"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public static async Task<RestUserMessage> SendFilesAsync(IMessageChannel channel, BaseDiscordClient client,
|
public static async Task<RestUserMessage> SendFilesAsync(IMessageChannel channel, BaseDiscordClient client,
|
||||||
IEnumerable<FileAttachment> attachments, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions,
|
IEnumerable<FileAttachment> attachments, string text, bool isTTS, Embed embed, AllowedMentions allowedMentions,
|
||||||
MessageReference messageReference, MessageComponent components, ISticker[] stickers, RequestOptions options,
|
MessageReference messageReference, MessageComponent components, ISticker[] stickers, RequestOptions options,
|
||||||
@@ -391,7 +393,9 @@ namespace Discord.Rest
|
|||||||
|
|
||||||
Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed.");
|
Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed.");
|
||||||
Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed.");
|
Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed.");
|
||||||
Preconditions.AtMost(embeds.Length, 10, nameof(embeds), "A max of 10 embeds are allowed.");
|
Preconditions.AtMost(embeds.Length, DiscordConfig.MaxEmbedsPerMessage, nameof(embeds), $"A max of {DiscordConfig.MaxEmbedsPerMessage} Embeds are allowed.");
|
||||||
|
|
||||||
|
Preconditions.MessageAtLeastOneOf(text, components, embeds, stickers, attachments);
|
||||||
|
|
||||||
foreach (var attachment in attachments)
|
foreach (var attachment in attachments)
|
||||||
{
|
{
|
||||||
@@ -424,8 +428,8 @@ namespace Discord.Rest
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags is not MessageFlags.None and not MessageFlags.SuppressEmbeds)
|
if (flags is not MessageFlags.None and not MessageFlags.SuppressEmbeds and not MessageFlags.SuppressNotification)
|
||||||
throw new ArgumentException("The only valid MessageFlags are SuppressEmbeds and none.", nameof(flags));
|
throw new ArgumentException("The only valid MessageFlags are SuppressEmbeds, SuppressNotification and none.", nameof(flags));
|
||||||
|
|
||||||
if (stickers != null)
|
if (stickers != null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ namespace Discord.Rest
|
|||||||
/// <exception cref="IOException">An I/O error occurred while opening the file.</exception>
|
/// <exception cref="IOException">An I/O error occurred while opening the file.</exception>
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public Task<RestUserMessage> SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null,
|
public Task<RestUserMessage> SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null,
|
||||||
RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
@@ -135,7 +135,7 @@ namespace Discord.Rest
|
|||||||
components, stickers, options, isSpoiler, embeds, flags);
|
components, stickers, options, isSpoiler, embeds, flags);
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
public Task<RestUserMessage> SendFileAsync(Stream stream, string filename, string text, bool isTTS = false,
|
public Task<RestUserMessage> SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false,
|
||||||
Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
@@ -144,7 +144,7 @@ namespace Discord.Rest
|
|||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
public Task<RestUserMessage> SendFileAsync(FileAttachment attachment, string text, bool isTTS = false,
|
public Task<RestUserMessage> SendFileAsync(FileAttachment attachment, string text = null, bool isTTS = false,
|
||||||
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
@@ -153,7 +153,7 @@ namespace Discord.Rest
|
|||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
public Task<RestUserMessage> SendFilesAsync(IEnumerable<FileAttachment> attachments, string text, bool isTTS = false,
|
public Task<RestUserMessage> SendFilesAsync(IEnumerable<FileAttachment> attachments, string text = null, bool isTTS = false,
|
||||||
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ namespace Discord.Rest
|
|||||||
/// <exception cref="IOException">An I/O error occurred while opening the file.</exception>
|
/// <exception cref="IOException">An I/O error occurred while opening the file.</exception>
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public Task<RestUserMessage> SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null,
|
public Task<RestUserMessage> SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null,
|
||||||
RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
@@ -146,7 +146,7 @@ namespace Discord.Rest
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public Task<RestUserMessage> SendFileAsync(Stream stream, string filename, string text, bool isTTS = false,
|
public Task<RestUserMessage> SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false,
|
||||||
Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
@@ -155,7 +155,7 @@ namespace Discord.Rest
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public Task<RestUserMessage> SendFileAsync(FileAttachment attachment, string text, bool isTTS = false,
|
public Task<RestUserMessage> SendFileAsync(FileAttachment attachment, string text = null, bool isTTS = false,
|
||||||
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
@@ -164,7 +164,7 @@ namespace Discord.Rest
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public Task<RestUserMessage> SendFilesAsync(IEnumerable<FileAttachment> attachments, string text, bool isTTS = false,
|
public Task<RestUserMessage> SendFilesAsync(IEnumerable<FileAttachment> attachments, string text = null, bool isTTS = false,
|
||||||
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ namespace Discord.Rest
|
|||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/>, <see cref="MessageFlags.SuppressNotification"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public virtual Task<RestUserMessage> SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null,
|
public virtual Task<RestUserMessage> SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null,
|
||||||
RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null,
|
RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null,
|
||||||
MessageComponent components = null, ISticker[] stickers = null, Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
MessageComponent components = null, ISticker[] stickers = null, Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
@@ -146,8 +146,8 @@ namespace Discord.Rest
|
|||||||
/// <exception cref="NotSupportedException"><paramref name="filePath" /> is in an invalid format.</exception>
|
/// <exception cref="NotSupportedException"><paramref name="filePath" /> is in an invalid format.</exception>
|
||||||
/// <exception cref="IOException">An I/O error occurred while opening the file.</exception>
|
/// <exception cref="IOException">An I/O error occurred while opening the file.</exception>
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/>, <see cref="MessageFlags.SuppressNotification"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public virtual Task<RestUserMessage> SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null,
|
public virtual Task<RestUserMessage> SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null,
|
||||||
RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
@@ -156,8 +156,8 @@ namespace Discord.Rest
|
|||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/>, <see cref="MessageFlags.SuppressNotification"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public virtual Task<RestUserMessage> SendFileAsync(Stream stream, string filename, string text, bool isTTS = false,
|
public virtual Task<RestUserMessage> SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false,
|
||||||
Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
@@ -166,8 +166,8 @@ namespace Discord.Rest
|
|||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/>, <see cref="MessageFlags.SuppressNotification"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public virtual Task<RestUserMessage> SendFileAsync(FileAttachment attachment, string text, bool isTTS = false,
|
public virtual Task<RestUserMessage> SendFileAsync(FileAttachment attachment, string text = null, bool isTTS = false,
|
||||||
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
@@ -176,8 +176,8 @@ namespace Discord.Rest
|
|||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/>, <see cref="MessageFlags.SuppressNotification"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public virtual Task<RestUserMessage> SendFilesAsync(IEnumerable<FileAttachment> attachments, string text, bool isTTS = false,
|
public virtual Task<RestUserMessage> SendFilesAsync(IEnumerable<FileAttachment> attachments, string text = null, bool isTTS = false,
|
||||||
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ namespace Discord.WebSocket
|
|||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public Task<RestUserMessage> SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null,
|
public Task<RestUserMessage> SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null,
|
||||||
RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
@@ -157,7 +157,7 @@ namespace Discord.WebSocket
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public Task<RestUserMessage> SendFileAsync(Stream stream, string filename, string text, bool isTTS = false,
|
public Task<RestUserMessage> SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false,
|
||||||
Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
@@ -166,7 +166,7 @@ namespace Discord.WebSocket
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public Task<RestUserMessage> SendFileAsync(FileAttachment attachment, string text, bool isTTS = false,
|
public Task<RestUserMessage> SendFileAsync(FileAttachment attachment, string text = null, bool isTTS = false,
|
||||||
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
@@ -175,7 +175,7 @@ namespace Discord.WebSocket
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public Task<RestUserMessage> SendFilesAsync(IEnumerable<FileAttachment> attachments, string text, bool isTTS = false,
|
public Task<RestUserMessage> SendFilesAsync(IEnumerable<FileAttachment> attachments, string text = null, bool isTTS = false,
|
||||||
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
|
|||||||
@@ -187,7 +187,7 @@ namespace Discord.WebSocket
|
|||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public Task<RestUserMessage> SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null,
|
public Task<RestUserMessage> SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null,
|
||||||
RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
@@ -196,7 +196,7 @@ namespace Discord.WebSocket
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public Task<RestUserMessage> SendFileAsync(Stream stream, string filename, string text, bool isTTS = false,
|
public Task<RestUserMessage> SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false,
|
||||||
Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
@@ -205,7 +205,7 @@ namespace Discord.WebSocket
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public Task<RestUserMessage> SendFileAsync(FileAttachment attachment, string text, bool isTTS = false,
|
public Task<RestUserMessage> SendFileAsync(FileAttachment attachment, string text = null, bool isTTS = false,
|
||||||
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
@@ -214,7 +214,7 @@ namespace Discord.WebSocket
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public Task<RestUserMessage> SendFilesAsync(IEnumerable<FileAttachment> attachments, string text, bool isTTS = false,
|
public Task<RestUserMessage> SendFilesAsync(IEnumerable<FileAttachment> attachments, string text = null, bool isTTS = false,
|
||||||
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
|
|||||||
@@ -222,7 +222,7 @@ namespace Discord.WebSocket
|
|||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/>, <see cref="MessageFlags.SuppressNotification"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public virtual Task<RestUserMessage> SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null,
|
public virtual Task<RestUserMessage> SendMessageAsync(string text = null, bool isTTS = false, Embed embed = null,
|
||||||
RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null,
|
RequestOptions options = null, AllowedMentions allowedMentions = null, MessageReference messageReference = null,
|
||||||
MessageComponent components = null, ISticker[] stickers = null, Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
MessageComponent components = null, ISticker[] stickers = null, Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
@@ -230,8 +230,8 @@ namespace Discord.WebSocket
|
|||||||
components, stickers, options, embeds, flags);
|
components, stickers, options, embeds, flags);
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/>, <see cref="MessageFlags.SuppressNotification"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public virtual Task<RestUserMessage> SendFileAsync(string filePath, string text, bool isTTS = false, Embed embed = null,
|
public virtual Task<RestUserMessage> SendFileAsync(string filePath, string text = null, bool isTTS = false, Embed embed = null,
|
||||||
RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
@@ -239,8 +239,8 @@ namespace Discord.WebSocket
|
|||||||
components, stickers, options, isSpoiler, embeds, flags);
|
components, stickers, options, isSpoiler, embeds, flags);
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/>, <see cref="MessageFlags.SuppressNotification"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public virtual Task<RestUserMessage> SendFileAsync(Stream stream, string filename, string text, bool isTTS = false,
|
public virtual Task<RestUserMessage> SendFileAsync(Stream stream, string filename, string text = null, bool isTTS = false,
|
||||||
Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
Embed embed = null, RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
@@ -248,8 +248,8 @@ namespace Discord.WebSocket
|
|||||||
messageReference, components, stickers, options, isSpoiler, embeds, flags);
|
messageReference, components, stickers, options, isSpoiler, embeds, flags);
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/>, <see cref="MessageFlags.SuppressNotification"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public virtual Task<RestUserMessage> SendFileAsync(FileAttachment attachment, string text, bool isTTS = false,
|
public virtual Task<RestUserMessage> SendFileAsync(FileAttachment attachment, string text = null, bool isTTS = false,
|
||||||
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
@@ -257,8 +257,8 @@ namespace Discord.WebSocket
|
|||||||
messageReference, components, stickers, options, embeds, flags);
|
messageReference, components, stickers, options, embeds, flags);
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Message content is too long, length must be less or equal to <see cref="DiscordConfig.MaxMessageSize"/>.</exception>
|
||||||
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/> and <see cref="MessageFlags.None"/>.</exception>
|
/// <exception cref="ArgumentException">The only valid <see cref="MessageFlags"/> are <see cref="MessageFlags.SuppressEmbeds"/>, <see cref="MessageFlags.SuppressNotification"/> and <see cref="MessageFlags.None"/>.</exception>
|
||||||
public virtual Task<RestUserMessage> SendFilesAsync(IEnumerable<FileAttachment> attachments, string text, bool isTTS = false,
|
public virtual Task<RestUserMessage> SendFilesAsync(IEnumerable<FileAttachment> attachments, string text = null, bool isTTS = false,
|
||||||
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
Embed embed = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
||||||
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
MessageReference messageReference = null, MessageComponent components = null, ISticker[] stickers = null,
|
||||||
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
Embed[] embeds = null, MessageFlags flags = MessageFlags.None)
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using Discord.Logging;
|
using Discord.Logging;
|
||||||
using Discord.Rest;
|
using Discord.Rest;
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
@@ -7,12 +8,19 @@ using System.IO;
|
|||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Discord.Webhook
|
namespace Discord.Webhook;
|
||||||
{
|
|
||||||
/// <summary> A client responsible for connecting as a Webhook. </summary>
|
/// <summary>
|
||||||
|
/// A client responsible for connecting as a Webhook.
|
||||||
|
/// </summary>
|
||||||
public class DiscordWebhookClient : IDisposable
|
public class DiscordWebhookClient : IDisposable
|
||||||
{
|
{
|
||||||
public event Func<LogMessage, Task> Log { add { _logEvent.Add(value); } remove { _logEvent.Remove(value); } }
|
public event Func<LogMessage, Task> Log
|
||||||
|
{
|
||||||
|
add => _logEvent.Add(value);
|
||||||
|
remove => _logEvent.Remove(value);
|
||||||
|
}
|
||||||
|
|
||||||
internal readonly AsyncEvent<Func<LogMessage, Task>> _logEvent = new AsyncEvent<Func<LogMessage, Task>>();
|
internal readonly AsyncEvent<Func<LogMessage, Task>> _logEvent = new AsyncEvent<Func<LogMessage, Task>>();
|
||||||
|
|
||||||
private readonly ulong _webhookId;
|
private readonly ulong _webhookId;
|
||||||
@@ -22,20 +30,30 @@ namespace Discord.Webhook
|
|||||||
internal API.DiscordRestApiClient ApiClient { get; }
|
internal API.DiscordRestApiClient ApiClient { get; }
|
||||||
internal LogManager LogManager { get; }
|
internal LogManager LogManager { get; }
|
||||||
|
|
||||||
/// <summary> Creates a new Webhook Discord client. </summary>
|
/// <summary>
|
||||||
|
/// Creates a new Webhook Discord client.
|
||||||
|
/// </summary>
|
||||||
public DiscordWebhookClient(IWebhook webhook)
|
public DiscordWebhookClient(IWebhook webhook)
|
||||||
: this(webhook.Id, webhook.Token, new DiscordRestConfig()) { }
|
: this(webhook.Id, webhook.Token, new DiscordRestConfig()) { }
|
||||||
/// <summary> Creates a new Webhook Discord client. </summary>
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new Webhook Discord client.
|
||||||
|
/// </summary>
|
||||||
public DiscordWebhookClient(ulong webhookId, string webhookToken)
|
public DiscordWebhookClient(ulong webhookId, string webhookToken)
|
||||||
: this(webhookId, webhookToken, new DiscordRestConfig()) { }
|
: this(webhookId, webhookToken, new DiscordRestConfig()) { }
|
||||||
/// <summary> Creates a new Webhook Discord client. </summary>
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new Webhook Discord client.
|
||||||
|
/// </summary>
|
||||||
public DiscordWebhookClient(string webhookUrl)
|
public DiscordWebhookClient(string webhookUrl)
|
||||||
: this(webhookUrl, new DiscordRestConfig()) { }
|
: this(webhookUrl, new DiscordRestConfig()) { }
|
||||||
|
|
||||||
// regex pattern to match webhook urls
|
// regex pattern to match webhook urls
|
||||||
private static Regex WebhookUrlRegex = new Regex(@"^.*(discord|discordapp)\.com\/api\/webhooks\/([\d]+)\/([a-z0-9_-]+)$", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
|
private static Regex WebhookUrlRegex = new Regex(@"^.*(discord|discordapp)\.com\/api\/webhooks\/([\d]+)\/([a-z0-9_-]+)$", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
|
||||||
|
|
||||||
/// <summary> Creates a new Webhook Discord client. </summary>
|
/// <summary>
|
||||||
|
/// Creates a new Webhook Discord client.
|
||||||
|
/// </summary>
|
||||||
public DiscordWebhookClient(ulong webhookId, string webhookToken, DiscordRestConfig config)
|
public DiscordWebhookClient(ulong webhookId, string webhookToken, DiscordRestConfig config)
|
||||||
: this(config)
|
: this(config)
|
||||||
{
|
{
|
||||||
@@ -43,7 +61,10 @@ namespace Discord.Webhook
|
|||||||
ApiClient.LoginAsync(TokenType.Webhook, webhookToken).GetAwaiter().GetResult();
|
ApiClient.LoginAsync(TokenType.Webhook, webhookToken).GetAwaiter().GetResult();
|
||||||
Webhook = WebhookClientHelper.GetWebhookAsync(this, webhookId).GetAwaiter().GetResult();
|
Webhook = WebhookClientHelper.GetWebhookAsync(this, webhookId).GetAwaiter().GetResult();
|
||||||
}
|
}
|
||||||
/// <summary> Creates a new Webhook Discord client. </summary>
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new Webhook Discord client.
|
||||||
|
/// </summary>
|
||||||
public DiscordWebhookClient(IWebhook webhook, DiscordRestConfig config)
|
public DiscordWebhookClient(IWebhook webhook, DiscordRestConfig config)
|
||||||
: this(config)
|
: this(config)
|
||||||
{
|
{
|
||||||
@@ -84,8 +105,13 @@ namespace Discord.Webhook
|
|||||||
}
|
}
|
||||||
private static API.DiscordRestApiClient CreateApiClient(DiscordRestConfig config)
|
private static API.DiscordRestApiClient CreateApiClient(DiscordRestConfig config)
|
||||||
=> new API.DiscordRestApiClient(config.RestClientProvider, DiscordRestConfig.UserAgent, useSystemClock: config.UseSystemClock, defaultRatelimitCallback: config.DefaultRatelimitCallback);
|
=> new API.DiscordRestApiClient(config.RestClientProvider, DiscordRestConfig.UserAgent, useSystemClock: config.UseSystemClock, defaultRatelimitCallback: config.DefaultRatelimitCallback);
|
||||||
/// <summary> Sends a message to the channel for this webhook. </summary>
|
|
||||||
/// <returns> Returns the ID of the created message. </returns>
|
/// <summary>
|
||||||
|
/// Sends a message to the channel for this webhook.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>
|
||||||
|
/// Returns the ID of the created message.
|
||||||
|
/// </returns>
|
||||||
public Task<ulong> SendMessageAsync(string text = null, bool isTTS = false, IEnumerable<Embed> embeds = null,
|
public Task<ulong> SendMessageAsync(string text = null, bool isTTS = false, IEnumerable<Embed> embeds = null,
|
||||||
string username = null, string avatarUrl = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
string username = null, string avatarUrl = null, RequestOptions options = null, AllowedMentions allowedMentions = null,
|
||||||
MessageComponent components = null, MessageFlags flags = MessageFlags.None, ulong? threadId = null, string threadName = null)
|
MessageComponent components = null, MessageFlags flags = MessageFlags.None, ulong? threadId = null, string threadName = null)
|
||||||
@@ -120,16 +146,25 @@ namespace Discord.Webhook
|
|||||||
public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null, ulong? threadId = null)
|
public Task DeleteMessageAsync(ulong messageId, RequestOptions options = null, ulong? threadId = null)
|
||||||
=> WebhookClientHelper.DeleteMessageAsync(this, messageId, options, threadId);
|
=> WebhookClientHelper.DeleteMessageAsync(this, messageId, options, threadId);
|
||||||
|
|
||||||
/// <summary> Sends a message to the channel for this webhook with an attachment. </summary>
|
/// <summary>
|
||||||
/// <returns> Returns the ID of the created message. </returns>
|
/// Sends a message to the channel for this webhook with an attachment.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>
|
||||||
|
/// Returns the ID of the created message.
|
||||||
|
/// </returns>
|
||||||
public Task<ulong> SendFileAsync(string filePath, string text, bool isTTS = false,
|
public Task<ulong> SendFileAsync(string filePath, string text, bool isTTS = false,
|
||||||
IEnumerable<Embed> embeds = null, string username = null, string avatarUrl = null,
|
IEnumerable<Embed> embeds = null, string username = null, string avatarUrl = null,
|
||||||
RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
||||||
MessageComponent components = null, MessageFlags flags = MessageFlags.None, ulong? threadId = null, string threadName = null)
|
MessageComponent components = null, MessageFlags flags = MessageFlags.None, ulong? threadId = null, string threadName = null)
|
||||||
=> WebhookClientHelper.SendFileAsync(this, filePath, text, isTTS, embeds, username, avatarUrl,
|
=> WebhookClientHelper.SendFileAsync(this, filePath, text, isTTS, embeds, username, avatarUrl,
|
||||||
allowedMentions, options, isSpoiler, components, flags, threadId, threadName);
|
allowedMentions, options, isSpoiler, components, flags, threadId, threadName);
|
||||||
/// <summary> Sends a message to the channel for this webhook with an attachment. </summary>
|
|
||||||
/// <returns> Returns the ID of the created message. </returns>
|
/// <summary>
|
||||||
|
/// Sends a message to the channel for this webhook with an attachment.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>
|
||||||
|
/// Returns the ID of the created message.
|
||||||
|
/// </returns>
|
||||||
public Task<ulong> SendFileAsync(Stream stream, string filename, string text, bool isTTS = false,
|
public Task<ulong> SendFileAsync(Stream stream, string filename, string text, bool isTTS = false,
|
||||||
IEnumerable<Embed> embeds = null, string username = null, string avatarUrl = null,
|
IEnumerable<Embed> embeds = null, string username = null, string avatarUrl = null,
|
||||||
RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
RequestOptions options = null, bool isSpoiler = false, AllowedMentions allowedMentions = null,
|
||||||
@@ -146,8 +181,12 @@ namespace Discord.Webhook
|
|||||||
=> WebhookClientHelper.SendFileAsync(this, attachment, text, isTTS, embeds, username,
|
=> WebhookClientHelper.SendFileAsync(this, attachment, text, isTTS, embeds, username,
|
||||||
avatarUrl, allowedMentions, components, options, flags, threadId, threadName);
|
avatarUrl, allowedMentions, components, options, flags, threadId, threadName);
|
||||||
|
|
||||||
/// <summary> Sends a message to the channel for this webhook with an attachment. </summary>
|
/// <summary>
|
||||||
/// <returns> Returns the ID of the created message. </returns>
|
/// Sends a message to the channel for this webhook with an attachment.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>
|
||||||
|
/// Returns the ID of the created message.
|
||||||
|
/// </returns>
|
||||||
public Task<ulong> SendFilesAsync(IEnumerable<FileAttachment> attachments, string text, bool isTTS = false,
|
public Task<ulong> SendFilesAsync(IEnumerable<FileAttachment> attachments, string text, bool isTTS = false,
|
||||||
IEnumerable<Embed> embeds = null, string username = null, string avatarUrl = null,
|
IEnumerable<Embed> embeds = null, string username = null, string avatarUrl = null,
|
||||||
RequestOptions options = null, AllowedMentions allowedMentions = null, MessageComponent components = null,
|
RequestOptions options = null, AllowedMentions allowedMentions = null, MessageComponent components = null,
|
||||||
@@ -155,12 +194,15 @@ namespace Discord.Webhook
|
|||||||
=> WebhookClientHelper.SendFilesAsync(this, attachments, text, isTTS, embeds, username, avatarUrl,
|
=> WebhookClientHelper.SendFilesAsync(this, attachments, text, isTTS, embeds, username, avatarUrl,
|
||||||
allowedMentions, components, options, flags, threadId, threadName);
|
allowedMentions, components, options, flags, threadId, threadName);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
/// <summary> Modifies the properties of this webhook. </summary>
|
/// Modifies the properties of this webhook.
|
||||||
|
/// </summary>
|
||||||
public Task ModifyWebhookAsync(Action<WebhookProperties> func, RequestOptions options = null)
|
public Task ModifyWebhookAsync(Action<WebhookProperties> func, RequestOptions options = null)
|
||||||
=> Webhook.ModifyAsync(func, options);
|
=> Webhook.ModifyAsync(func, options);
|
||||||
|
|
||||||
/// <summary> Deletes this webhook from Discord and disposes the client. </summary>
|
/// <summary>
|
||||||
|
/// Deletes this webhook from Discord and disposes the client.
|
||||||
|
/// </summary>
|
||||||
public async Task DeleteWebhookAsync(RequestOptions options = null)
|
public async Task DeleteWebhookAsync(RequestOptions options = null)
|
||||||
{
|
{
|
||||||
await Webhook.DeleteAsync(options).ConfigureAwait(false);
|
await Webhook.DeleteAsync(options).ConfigureAwait(false);
|
||||||
@@ -175,14 +217,14 @@ namespace Discord.Webhook
|
|||||||
internal static void ParseWebhookUrl(string webhookUrl, out ulong webhookId, out string webhookToken)
|
internal static void ParseWebhookUrl(string webhookUrl, out ulong webhookId, out string webhookToken)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(webhookUrl))
|
if (string.IsNullOrWhiteSpace(webhookUrl))
|
||||||
throw new ArgumentNullException(paramName: nameof(webhookUrl), message:
|
throw new ArgumentNullException(nameof(webhookUrl), "The given webhook Url cannot be null or whitespace.");
|
||||||
"The given webhook Url cannot be null or whitespace.");
|
|
||||||
|
|
||||||
// thrown when groups are not populated/valid, or when there is no match
|
// thrown when groups are not populated/valid, or when there is no match
|
||||||
ArgumentException ex(string reason = null)
|
ArgumentException ex(string reason = null)
|
||||||
=> new ArgumentException(paramName: nameof(webhookUrl), message:
|
=> new ($"The given webhook Url was not in a valid format. {reason}", nameof(webhookUrl));
|
||||||
$"The given webhook Url was not in a valid format. {reason}");
|
|
||||||
var match = WebhookUrlRegex.Match(webhookUrl);
|
var match = WebhookUrlRegex.Match(webhookUrl);
|
||||||
|
|
||||||
if (match != null)
|
if (match != null)
|
||||||
{
|
{
|
||||||
// ensure that the first group is a ulong, set the _webhookId
|
// ensure that the first group is a ulong, set the _webhookId
|
||||||
@@ -198,4 +240,3 @@ namespace Discord.Webhook
|
|||||||
throw ex();
|
throw ex();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -26,5 +26,9 @@ namespace Discord.Webhook
|
|||||||
/// Gets or sets the components that the message should display.
|
/// Gets or sets the components that the message should display.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Optional<MessageComponent> Components { get; set; }
|
public Optional<MessageComponent> Components { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the attachments for the message.
|
||||||
|
/// </summary>
|
||||||
|
public Optional<IEnumerable<FileAttachment>> Attachments { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ namespace Discord.Webhook
|
|||||||
throw new InvalidOperationException("Could not find a webhook with the supplied credentials.");
|
throw new InvalidOperationException("Could not find a webhook with the supplied credentials.");
|
||||||
return RestInternalWebhook.Create(client, model);
|
return RestInternalWebhook.Create(client, model);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task<ulong> SendMessageAsync(DiscordWebhookClient client,
|
public static async Task<ulong> SendMessageAsync(DiscordWebhookClient client,
|
||||||
string text, bool isTTS, IEnumerable<Embed> embeds, string username, string avatarUrl,
|
string text, bool isTTS, IEnumerable<Embed> embeds, string username, string avatarUrl,
|
||||||
AllowedMentions allowedMentions, RequestOptions options, MessageComponent components, MessageFlags flags, ulong? threadId = null, string threadName = null)
|
AllowedMentions allowedMentions, RequestOptions options, MessageComponent components, MessageFlags flags, ulong? threadId = null, string threadName = null)
|
||||||
@@ -33,6 +34,8 @@ namespace Discord.Webhook
|
|||||||
Flags = flags
|
Flags = flags
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Preconditions.WebhookMessageAtLeastOneOf(text, components, embeds?.ToArray());
|
||||||
|
|
||||||
if (embeds != null)
|
if (embeds != null)
|
||||||
args.Embeds = embeds.Select(x => x.ToModel()).ToArray();
|
args.Embeds = embeds.Select(x => x.ToModel()).ToArray();
|
||||||
if (username != null)
|
if (username != null)
|
||||||
@@ -86,6 +89,8 @@ namespace Discord.Webhook
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!args.Attachments.IsSpecified)
|
||||||
|
{
|
||||||
var apiArgs = new ModifyWebhookMessageParams
|
var apiArgs = new ModifyWebhookMessageParams
|
||||||
{
|
{
|
||||||
Content = args.Content.IsSpecified ? args.Content.Value : Optional.Create<string>(),
|
Content = args.Content.IsSpecified ? args.Content.Value : Optional.Create<string>(),
|
||||||
@@ -102,6 +107,25 @@ namespace Discord.Webhook
|
|||||||
await client.ApiClient.ModifyWebhookMessageAsync(client.Webhook.Id, messageId, apiArgs, options, threadId)
|
await client.ApiClient.ModifyWebhookMessageAsync(client.Webhook.Id, messageId, apiArgs, options, threadId)
|
||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var apiArgs = new UploadWebhookFileParams(args.Attachments.Value.ToArray())
|
||||||
|
{
|
||||||
|
Content = args.Content.IsSpecified ? args.Content.Value : Optional.Create<string>(),
|
||||||
|
Embeds =
|
||||||
|
args.Embeds.IsSpecified
|
||||||
|
? args.Embeds.Value.Select(embed => embed.ToModel()).ToArray()
|
||||||
|
: Optional.Create<API.Embed[]>(),
|
||||||
|
AllowedMentions = args.AllowedMentions.IsSpecified
|
||||||
|
? args.AllowedMentions.Value.ToModel()
|
||||||
|
: Optional.Create<API.AllowedMentions>(),
|
||||||
|
MessageComponents = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional<API.ActionRowComponent[]>.Unspecified,
|
||||||
|
};
|
||||||
|
|
||||||
|
await client.ApiClient.ModifyWebhookMessageAsync(client.Webhook.Id, messageId, apiArgs, options, threadId)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static async Task DeleteMessageAsync(DiscordWebhookClient client, ulong messageId, RequestOptions options, ulong? threadId)
|
public static async Task DeleteMessageAsync(DiscordWebhookClient client, ulong messageId, RequestOptions options, ulong? threadId)
|
||||||
{
|
{
|
||||||
@@ -136,7 +160,9 @@ namespace Discord.Webhook
|
|||||||
|
|
||||||
Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed.");
|
Preconditions.AtMost(allowedMentions?.RoleIds?.Count ?? 0, 100, nameof(allowedMentions.RoleIds), "A max of 100 role Ids are allowed.");
|
||||||
Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed.");
|
Preconditions.AtMost(allowedMentions?.UserIds?.Count ?? 0, 100, nameof(allowedMentions.UserIds), "A max of 100 user Ids are allowed.");
|
||||||
Preconditions.AtMost(embeds.Count(), 10, nameof(embeds), "A max of 10 embeds are allowed.");
|
Preconditions.AtMost(embeds.Count(), DiscordConfig.MaxEmbedsPerMessage, nameof(embeds), $"A max of {DiscordConfig.MaxEmbedsPerMessage} Embeds are allowed.");
|
||||||
|
|
||||||
|
Preconditions.WebhookMessageAtLeastOneOf(text, components, embeds.ToArray(), attachments);
|
||||||
|
|
||||||
foreach (var attachment in attachments)
|
foreach (var attachment in attachments)
|
||||||
{
|
{
|
||||||
@@ -159,8 +185,8 @@ namespace Discord.Webhook
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags is not MessageFlags.None and not MessageFlags.SuppressEmbeds)
|
if (flags is not MessageFlags.None and not MessageFlags.SuppressEmbeds and not MessageFlags.SuppressNotification)
|
||||||
throw new ArgumentException("The only valid MessageFlags are SuppressEmbeds and none.", nameof(flags));
|
throw new ArgumentException("The only valid MessageFlags are SuppressEmbeds, SuppressNotification and none.", nameof(flags));
|
||||||
|
|
||||||
var args = new UploadWebhookFileParams(attachments.ToArray())
|
var args = new UploadWebhookFileParams(attachments.ToArray())
|
||||||
{
|
{
|
||||||
@@ -178,8 +204,7 @@ namespace Discord.Webhook
|
|||||||
return msg.Id;
|
return msg.Id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task<WebhookModel> ModifyAsync(DiscordWebhookClient client,
|
public static async Task<WebhookModel> ModifyAsync(DiscordWebhookClient client, Action<WebhookProperties> func, RequestOptions options)
|
||||||
Action<WebhookProperties> func, RequestOptions options)
|
|
||||||
{
|
{
|
||||||
var args = new WebhookProperties();
|
var args = new WebhookProperties();
|
||||||
func(args);
|
func(args);
|
||||||
|
|||||||
Reference in New Issue
Block a user