* General cleanup * Add Async suffix to SendAutocompleteResult * Fix more formatting * Fix unused RequestOptions in GetActiveThreadsAsync * Add message to ArgumentNullExceptionpull/1923/head
| @@ -1,7 +1,4 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| @@ -1,7 +1,4 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| @@ -9,7 +6,7 @@ namespace Discord | |||
| /// <summary> | |||
| /// Represents a thread channel inside of a guild. | |||
| /// </summary> | |||
| public interface IThreadChannel : ITextChannel, IGuildChannel | |||
| public interface IThreadChannel : ITextChannel | |||
| { | |||
| /// <summary> | |||
| /// Gets the type of the current thread channel. | |||
| @@ -56,7 +53,7 @@ namespace Discord | |||
| /// </summary> | |||
| /// <param name="options">The options to be used when sending the request.</param> | |||
| /// <returns> | |||
| /// A task that represents the asynchronous join operation. | |||
| /// A task that represents the asynchronous join operation. | |||
| /// </returns> | |||
| Task JoinAsync(RequestOptions options = null); | |||
| @@ -65,7 +62,7 @@ namespace Discord | |||
| /// </summary> | |||
| /// <param name="options">The options to be used when sending the request.</param> | |||
| /// <returns> | |||
| /// A task that represents the asynchronous leave operation. | |||
| /// A task that represents the asynchronous leave operation. | |||
| /// </returns> | |||
| Task LeaveAsync(RequestOptions options = null); | |||
| @@ -75,7 +72,7 @@ namespace Discord | |||
| /// <param name="user">The <see cref="IGuildUser"/> to add.</param> | |||
| /// <param name="options">The options to be used when sending the request.</param> | |||
| /// <returns> | |||
| /// A task that represents the asynchronous operation of adding a member to a thread. | |||
| /// A task that represents the asynchronous operation of adding a member to a thread. | |||
| /// </returns> | |||
| Task AddUserAsync(IGuildUser user, RequestOptions options = null); | |||
| @@ -85,7 +82,7 @@ namespace Discord | |||
| /// <param name="user">The <see cref="IGuildUser"/> to remove from this thread.</param> | |||
| /// <param name="options">The options to be used when sending the request.</param> | |||
| /// <returns> | |||
| /// A task that represents the asynchronous operation of removing a user from this thread. | |||
| /// A task that represents the asynchronous operation of removing a user from this thread. | |||
| /// </returns> | |||
| Task RemoveUserAsync(IGuildUser user, RequestOptions options = null); | |||
| } | |||
| @@ -1,9 +1,3 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| @@ -1,14 +1,17 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| /// Specifies the privacy levels of a Stage instance. | |||
| /// </summary> | |||
| public enum StagePrivacyLevel | |||
| { | |||
| /// <summary> | |||
| /// The Stage instance is visible publicly, such as on Stage Discovery. | |||
| /// </summary> | |||
| Public = 1, | |||
| GuildOnly = 2, | |||
| /// <summary> | |||
| /// The Stage instance is visible to only guild members. | |||
| /// </summary> | |||
| GuildOnly = 2 | |||
| } | |||
| } | |||
| @@ -1,9 +1,3 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| @@ -24,7 +18,7 @@ namespace Discord | |||
| /// <summary> | |||
| /// Three days (4320 minutes). | |||
| /// <remarks> | |||
| /// This option is explicity avaliable to nitro users. | |||
| /// This option is explicitly available to nitro users. | |||
| /// </remarks> | |||
| /// </summary> | |||
| ThreeDays = 4320, | |||
| @@ -32,9 +26,9 @@ namespace Discord | |||
| /// <summary> | |||
| /// One week (10080 minutes). | |||
| /// <remarks> | |||
| /// This option is explicity avaliable to nitro users. | |||
| /// This option is explicitly available to nitro users. | |||
| /// </remarks> | |||
| /// </summary> | |||
| OneWeek = 10080, | |||
| OneWeek = 10080 | |||
| } | |||
| } | |||
| @@ -1,9 +1,3 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| @@ -24,6 +18,6 @@ namespace Discord | |||
| /// <summary> | |||
| /// Represents a temporary sub-channel within a GUILD_TEXT channel that is only viewable by those invited and those with the MANAGE_THREADS permission | |||
| /// </summary> | |||
| PrivateThread = 12, | |||
| PrivateThread = 12 | |||
| } | |||
| } | |||
| @@ -1,9 +1,6 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Text.RegularExpressions; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| @@ -24,13 +21,13 @@ namespace Discord | |||
| set | |||
| { | |||
| if (value == null) | |||
| throw new ArgumentNullException($"{nameof(Name)} cannot be null!"); | |||
| throw new ArgumentNullException(nameof(value), $"{nameof(Name)} cannot be null."); | |||
| if (value.Length > 32) | |||
| throw new ArgumentException($"{nameof(Name)} length must be less than or equal to 32"); | |||
| throw new ArgumentOutOfRangeException(nameof(value), "Name length must be less than or equal to 32."); | |||
| if (!Regex.IsMatch(value, @"^[\w-]{1,32}$")) | |||
| throw new ArgumentException($"{nameof(Name)} must match the regex ^[\\w-]{{1,32}}$"); | |||
| throw new FormatException($"{nameof(value)} must match the regex ^[\\w-]{{1,32}}$"); | |||
| _name = value; | |||
| } | |||
| @@ -42,14 +39,12 @@ namespace Discord | |||
| public string Description | |||
| { | |||
| get => _description; | |||
| set | |||
| set => _description = value?.Length switch | |||
| { | |||
| if (value?.Length > 100) | |||
| throw new ArgumentException("Description length must be less than or equal to 100"); | |||
| if (value?.Length < 1) | |||
| throw new ArgumentException("Description length must at least 1 character in length"); | |||
| _description = value; | |||
| } | |||
| > 100 => throw new ArgumentOutOfRangeException(nameof(value), "Description length must be less than or equal to 100."), | |||
| 0 => throw new ArgumentOutOfRangeException(nameof(value), "Description length must be at least 1."), | |||
| _ => value | |||
| }; | |||
| } | |||
| /// <summary> | |||
| @@ -1,8 +1,4 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| @@ -19,14 +15,12 @@ namespace Discord | |||
| public string Name | |||
| { | |||
| get => _name; | |||
| set | |||
| set => _name = value?.Length switch | |||
| { | |||
| if(value?.Length > 100) | |||
| throw new ArgumentException("Name length must be less than or equal to 100"); | |||
| if (value?.Length < 1) | |||
| throw new ArgumentException("Name length must at least 1 character in length"); | |||
| _name = value; | |||
| } | |||
| > 100 => throw new ArgumentOutOfRangeException(nameof(value), "Name length must be less than or equal to 100."), | |||
| 0 => throw new ArgumentOutOfRangeException(nameof(value), "Name length must at least 1."), | |||
| _ => value | |||
| }; | |||
| } | |||
| /// <summary> | |||
| @@ -40,11 +34,8 @@ namespace Discord | |||
| get => _value; | |||
| set | |||
| { | |||
| if(value != null) | |||
| { | |||
| if(!(value is int) && !(value is string)) | |||
| throw new ArgumentException("The value of a choice must be a string or int!"); | |||
| } | |||
| if (value != null && value is not int && value is not string) | |||
| throw new ArgumentException("The value of a choice must be a string or int!"); | |||
| _value = value; | |||
| } | |||
| } | |||
| @@ -1,9 +1,3 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| @@ -37,7 +31,7 @@ namespace Discord | |||
| Boolean = 5, | |||
| /// <summary> | |||
| /// A <see cref="IGuildUser"/>. | |||
| /// A <see cref="IUser"/>. | |||
| /// </summary> | |||
| User = 6, | |||
| @@ -55,7 +49,7 @@ namespace Discord | |||
| /// A <see cref="IUser"/> or <see cref="IRole"/>. | |||
| /// </summary> | |||
| Mentionable = 9, | |||
| /// <summary> | |||
| /// A <see cref="double"/>. | |||
| /// </summary> | |||
| @@ -1,9 +1,3 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| @@ -1,9 +1,3 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| @@ -1,9 +1,3 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| @@ -1,8 +1,4 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| @@ -11,8 +7,8 @@ namespace Discord | |||
| /// </summary> | |||
| public class AutocompleteResult | |||
| { | |||
| private object _value { get; set; } | |||
| private string _name { get; set; } | |||
| private object _value; | |||
| private string _name; | |||
| /// <summary> | |||
| /// Gets or sets the name of the result. | |||
| @@ -28,12 +24,13 @@ namespace Discord | |||
| set | |||
| { | |||
| if (value == null) | |||
| throw new ArgumentException("Name cannot be null!"); | |||
| if (value.Length > 100) | |||
| throw new ArgumentException("Name length must be less than or equal to 100 characters in length!"); | |||
| if (value.Length < 1) | |||
| throw new ArgumentException("Name length must at least 1 character in length!"); | |||
| _name = value; | |||
| throw new ArgumentNullException(nameof(value), $"{nameof(Name)} cannot be null."); | |||
| _name = value.Length switch | |||
| { | |||
| > 100 => throw new ArgumentOutOfRangeException(nameof(value), "Name length must be less than or equal to 100."), | |||
| 0 => throw new ArgumentOutOfRangeException(nameof(value), "Name length must be at least 1."), | |||
| _ => value | |||
| }; | |||
| } | |||
| } | |||
| @@ -48,20 +45,15 @@ namespace Discord | |||
| public object Value | |||
| { | |||
| get => _value; | |||
| set | |||
| set => _value = value switch | |||
| { | |||
| if (value == null) | |||
| throw new ArgumentNullException("Value cannot be null"); | |||
| _value = value switch | |||
| { | |||
| string str => str, | |||
| int integer => integer, | |||
| long lng => lng, | |||
| double number => number, | |||
| _ => throw new ArgumentException($"Type {value.GetType().Name} cannot be set as a value! Only string, int, and double allowed!"), | |||
| }; | |||
| } | |||
| string str => str, | |||
| int integer => integer, | |||
| long lng => lng, | |||
| double number => number, | |||
| null => throw new ArgumentNullException(nameof(value), $"{nameof(Value)} cannot be null."), | |||
| _ => throw new ArgumentException($"Type {value.GetType().Name} cannot be set as a value! Only string, int, and double allowed!") | |||
| }; | |||
| } | |||
| /// <summary> | |||
| @@ -1,10 +1,3 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Text.RegularExpressions; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| @@ -12,7 +5,7 @@ namespace Discord | |||
| /// </summary> | |||
| public class MessageCommandBuilder | |||
| { | |||
| /// <summary> | |||
| /// <summary> | |||
| /// Returns the maximum length a commands name allowed by Discord | |||
| /// </summary> | |||
| public const int MaxNameLength = 32; | |||
| @@ -22,10 +15,7 @@ namespace Discord | |||
| /// </summary> | |||
| public string Name | |||
| { | |||
| get | |||
| { | |||
| return _name; | |||
| } | |||
| get => _name; | |||
| set | |||
| { | |||
| Preconditions.NotNullOrEmpty(value, nameof(Name)); | |||
| @@ -41,7 +31,7 @@ namespace Discord | |||
| /// </summary> | |||
| public bool IsDefaultPermission { get; set; } = true; | |||
| private string _name { get; set; } | |||
| private string _name; | |||
| /// <summary> | |||
| /// Build the current builder into a <see cref="MessageCommandProperties"/> class. | |||
| @@ -51,14 +41,13 @@ namespace Discord | |||
| /// </returns> | |||
| public MessageCommandProperties Build() | |||
| { | |||
| MessageCommandProperties props = new MessageCommandProperties() | |||
| var props = new MessageCommandProperties | |||
| { | |||
| Name = Name, | |||
| DefaultPermission = IsDefaultPermission | |||
| }; | |||
| return props; | |||
| } | |||
| /// <summary> | |||
| @@ -79,7 +68,7 @@ namespace Discord | |||
| /// </summary> | |||
| /// <param name="isDefaultPermission">The default permission value to set.</param> | |||
| /// <returns>The current builder.</returns> | |||
| public MessageCommandBuilder WithDefaultPermission (bool isDefaultPermission) | |||
| public MessageCommandBuilder WithDefaultPermission(bool isDefaultPermission) | |||
| { | |||
| IsDefaultPermission = isDefaultPermission; | |||
| return this; | |||
| @@ -1,9 +1,3 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| @@ -1,10 +1,3 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Text.RegularExpressions; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| @@ -22,10 +15,7 @@ namespace Discord | |||
| /// </summary> | |||
| public string Name | |||
| { | |||
| get | |||
| { | |||
| return _name; | |||
| } | |||
| get => _name; | |||
| set | |||
| { | |||
| Preconditions.NotNullOrEmpty(value, nameof(Name)); | |||
| @@ -41,7 +31,7 @@ namespace Discord | |||
| /// </summary> | |||
| public bool IsDefaultPermission { get; set; } = true; | |||
| private string _name { get; set; } | |||
| private string _name; | |||
| /// <summary> | |||
| /// Build the current builder into a <see cref="UserCommandProperties"/> class. | |||
| @@ -49,14 +39,13 @@ namespace Discord | |||
| /// <returns>A <see cref="UserCommandProperties"/> that can be used to create user commands.</returns> | |||
| public UserCommandProperties Build() | |||
| { | |||
| UserCommandProperties props = new UserCommandProperties() | |||
| var props = new UserCommandProperties | |||
| { | |||
| Name = Name, | |||
| DefaultPermission = IsDefaultPermission | |||
| }; | |||
| return props; | |||
| } | |||
| /// <summary> | |||
| @@ -77,7 +66,7 @@ namespace Discord | |||
| /// </summary> | |||
| /// <param name="isDefaultPermission">The default permission value to set.</param> | |||
| /// <returns>The current builder.</returns> | |||
| public UserCommandBuilder WithDefaultPermission (bool isDefaultPermission) | |||
| public UserCommandBuilder WithDefaultPermission(bool isDefaultPermission) | |||
| { | |||
| IsDefaultPermission = isDefaultPermission; | |||
| return this; | |||
| @@ -1,9 +1,3 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| @@ -1,7 +1,5 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| @@ -17,7 +15,7 @@ namespace Discord | |||
| ulong ApplicationId { get; } | |||
| /// <summary> | |||
| /// The type of the command | |||
| /// The type of the command. | |||
| /// </summary> | |||
| ApplicationCommandType Type { get; } | |||
| @@ -1,8 +1,4 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| @@ -1,8 +1,4 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| @@ -33,6 +29,5 @@ namespace Discord | |||
| /// Present if this option is a group or subcommand. | |||
| /// </summary> | |||
| IReadOnlyCollection<IApplicationCommandInteractionDataOption> Options { get; } | |||
| } | |||
| } | |||
| @@ -1,8 +1,4 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| @@ -39,16 +35,16 @@ namespace Discord | |||
| /// <summary> | |||
| /// Choices for string and int types for the user to pick from. | |||
| /// </summary> | |||
| IReadOnlyCollection<IApplicationCommandOptionChoice>? Choices { get; } | |||
| IReadOnlyCollection<IApplicationCommandOptionChoice> Choices { get; } | |||
| /// <summary> | |||
| /// If the option is a subcommand or subcommand group type, this nested options will be the parameters. | |||
| /// </summary> | |||
| IReadOnlyCollection<IApplicationCommandOption>? Options { get; } | |||
| IReadOnlyCollection<IApplicationCommandOption> Options { get; } | |||
| /// <summary> | |||
| /// The allowed channel types for this option. | |||
| /// </summary> | |||
| IReadOnlyCollection<ChannelType>? ChannelTypes { get; } | |||
| IReadOnlyCollection<ChannelType> ChannelTypes { get; } | |||
| } | |||
| } | |||
| @@ -1,9 +1,3 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| @@ -20,6 +14,5 @@ namespace Discord | |||
| /// value of the choice. | |||
| /// </summary> | |||
| object Value { get; } | |||
| } | |||
| } | |||
| @@ -1,7 +1,4 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| @@ -51,7 +48,7 @@ namespace Discord | |||
| /// <param name="options">The request options for this response.</param> | |||
| /// <param name="component">A <see cref="MessageComponent"/> to be sent with this response.</param> | |||
| /// <param name="embed">A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored.</param> | |||
| Task RespondAsync (string text = null, Embed[] embeds = null, bool isTTS = false, | |||
| Task RespondAsync(string text = null, Embed[] embeds = null, bool isTTS = false, | |||
| bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null); | |||
| /// <summary> | |||
| @@ -68,7 +65,7 @@ namespace Discord | |||
| /// <returns> | |||
| /// The sent message. | |||
| /// </returns> | |||
| Task<IUserMessage> FollowupAsync (string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, | |||
| Task<IUserMessage> FollowupAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, | |||
| AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null); | |||
| /// <summary> | |||
| @@ -76,7 +73,7 @@ namespace Discord | |||
| /// </summary> | |||
| /// <param name="options">The request options for this <see langword="async"/> request.</param> | |||
| /// <returns>A <see cref="IUserMessage"/> that represents the initial response.</returns> | |||
| Task<IUserMessage> GetOriginalResponseAsync (RequestOptions options = null); | |||
| Task<IUserMessage> GetOriginalResponseAsync(RequestOptions options = null); | |||
| /// <summary> | |||
| /// Edits original response for this interaction. | |||
| @@ -84,7 +81,7 @@ namespace Discord | |||
| /// <param name="func">A delegate containing the properties to modify the message with.</param> | |||
| /// <param name="options">The request options for this <see langword="async"/> request.</param> | |||
| /// <returns>A <see cref="IUserMessage"/> that represents the initial response.</returns> | |||
| Task<IUserMessage> ModifyOriginalResponseAsync (Action<MessageProperties> func, RequestOptions options = null); | |||
| Task<IUserMessage> ModifyOriginalResponseAsync(Action<MessageProperties> func, RequestOptions options = null); | |||
| /// <summary> | |||
| /// Acknowledges this interaction. | |||
| @@ -92,6 +89,6 @@ namespace Discord | |||
| /// <returns> | |||
| /// A task that represents the asynchronous operation of acknowledging the interaction. | |||
| /// </returns> | |||
| Task DeferAsync (bool ephemeral = false, RequestOptions options = null); | |||
| Task DeferAsync(bool ephemeral = false, RequestOptions options = null); | |||
| } | |||
| } | |||
| @@ -1,13 +1,7 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| /// Represents an interface used to specify classes that they are a vaild data type of a <see cref="IDiscordInteraction"/> class. | |||
| /// Represents an interface used to specify classes that they are a valid data type of a <see cref="IDiscordInteraction"/> class. | |||
| /// </summary> | |||
| public interface IDiscordInteractionData { } | |||
| } | |||
| @@ -1,8 +1,4 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| @@ -13,7 +9,7 @@ namespace Discord | |||
| /// After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using <see cref="ChannelMessageWithSource"/> | |||
| /// or you can choose to send a deferred response with <see cref="DeferredChannelMessageWithSource"/>. If choosing a deferred response, the user will see a loading state for the interaction, | |||
| /// and you'll have up to 15 minutes to edit the original deferred response using Edit Original Interaction Response. | |||
| /// You can read more about Response types <see href="https://discord.com/developers/docs/interactions/slash-commands#interaction-response">Here</see> | |||
| /// You can read more about Response types <see href="https://discord.com/developers/docs/interactions/slash-commands#interaction-response">Here</see>. | |||
| /// </remarks> | |||
| public enum InteractionResponseType : byte | |||
| { | |||
| @@ -45,17 +41,17 @@ namespace Discord | |||
| DeferredChannelMessageWithSource = 5, | |||
| /// <summary> | |||
| /// For components: ACK an interaction and edit the original message later; the user does not see a loading state | |||
| /// For components: ACK an interaction and edit the original message later; the user does not see a loading state. | |||
| /// </summary> | |||
| DeferredUpdateMessage = 6, | |||
| /// <summary> | |||
| /// For components: edit the message the component was attached to | |||
| /// For components: edit the message the component was attached to. | |||
| /// </summary> | |||
| UpdateMessage = 7, | |||
| /// <summary> | |||
| /// Respond with a set of choices to a autocomplete interaction | |||
| /// Respond with a set of choices to a autocomplete interaction. | |||
| /// </summary> | |||
| ApplicationCommandAutocompleteResult = 8 | |||
| } | |||
| @@ -1,9 +1,3 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| @@ -29,6 +23,6 @@ namespace Discord | |||
| /// <summary> | |||
| /// An autocomplete request sent from discord. | |||
| /// </summary> | |||
| ApplicationCommandAutocomplete = 4, | |||
| ApplicationCommandAutocomplete = 4 | |||
| } | |||
| } | |||
| @@ -1,28 +1,22 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| /// Represents a <see cref="IMessageComponent"/> Row for child components to live in. | |||
| /// Represents a <see cref="IMessageComponent"/> Row for child components to live in. | |||
| /// </summary> | |||
| public class ActionRowComponent : IMessageComponent | |||
| { | |||
| /// <inheritdoc/> | |||
| public ComponentType Type { get; } = ComponentType.ActionRow; | |||
| public ComponentType Type => ComponentType.ActionRow; | |||
| /// <summary> | |||
| /// Gets the child components in this row. | |||
| /// </summary> | |||
| public IReadOnlyCollection<IMessageComponent> Components { get; internal set; } | |||
| internal ActionRowComponent() { } | |||
| internal ActionRowComponent(List<IMessageComponent> components) | |||
| { | |||
| Components = components; | |||
| @@ -1,10 +1,3 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| @@ -13,7 +6,7 @@ namespace Discord | |||
| public class ButtonComponent : IMessageComponent | |||
| { | |||
| /// <inheritdoc/> | |||
| public ComponentType Type { get; } = ComponentType.Button; | |||
| public ComponentType Type => ComponentType.Button; | |||
| /// <summary> | |||
| /// Gets the <see cref="ButtonStyle"/> of this button, example buttons with each style can be found <see href="https://discord.com/assets/7bb017ce52cfd6575e21c058feb3883b.png">Here</see>. | |||
| @@ -34,7 +27,7 @@ namespace Discord | |||
| public string CustomId { get; } | |||
| /// <summary> | |||
| /// Gets the URL for a <see cref="ButtonStyle.Link"/> button. | |||
| /// Gets the URL for a <see cref="ButtonStyle.Link"/> button. | |||
| /// </summary> | |||
| /// <remarks> | |||
| /// You cannot have a button with a <b>URL</b> and a <b>CustomId</b>. | |||
| @@ -1,9 +1,3 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| @@ -31,14 +31,14 @@ namespace Discord | |||
| set | |||
| { | |||
| if (value == null) | |||
| throw new ArgumentNullException(paramName: nameof(ActionRows), message: "Cannot set an component builder's components collection to null."); | |||
| throw new ArgumentNullException(nameof(value), $"{nameof(ActionRows)} cannot be null."); | |||
| if (value.Count > MaxActionRowCount) | |||
| throw new ArgumentException(message: $"Action row count must be less than or equal to {MaxActionRowCount}.", paramName: nameof(ActionRows)); | |||
| throw new ArgumentOutOfRangeException(nameof(value), $"Action row count must be less than or equal to {MaxActionRowCount}."); | |||
| _actionRows = value; | |||
| } | |||
| } | |||
| private List<ActionRowBuilder> _actionRows { get; set; } | |||
| private List<ActionRowBuilder> _actionRows; | |||
| /// <summary> | |||
| /// Creates a new builder from a message. | |||
| @@ -56,7 +56,7 @@ namespace Discord | |||
| public static ComponentBuilder FromComponents(IReadOnlyCollection<IMessageComponent> components) | |||
| { | |||
| var builder = new ComponentBuilder(); | |||
| for(int i = 0; i != components.Count; i++) | |||
| for (int i = 0; i != components.Count; i++) | |||
| { | |||
| var component = components.ElementAt(i); | |||
| builder.AddComponent(component, i); | |||
| @@ -118,7 +118,7 @@ namespace Discord | |||
| public ComponentBuilder WithSelectMenu(SelectMenuBuilder menu, int row = 0) | |||
| { | |||
| Preconditions.LessThan(row, MaxActionRowCount, nameof(row)); | |||
| if (menu.Options.Distinct().Count() != menu.Options.Count()) | |||
| if (menu.Options.Distinct().Count() != menu.Options.Count) | |||
| throw new InvalidOperationException("Please make sure that there is no duplicates values."); | |||
| var builtMenu = menu.Build(); | |||
| @@ -218,7 +218,7 @@ namespace Discord | |||
| else | |||
| { | |||
| ActionRowBuilder actionRow; | |||
| if(_actionRows.Count > row) | |||
| if (_actionRows.Count > row) | |||
| actionRow = _actionRows.ElementAt(row); | |||
| else | |||
| { | |||
| @@ -244,10 +244,9 @@ namespace Discord | |||
| /// <returns>A <see cref="MessageComponent"/> that can be sent with <see cref="IMessageChannel.SendMessageAsync"/>.</returns> | |||
| public MessageComponent Build() | |||
| { | |||
| if (_actionRows != null) | |||
| return new MessageComponent(_actionRows.Select(x => x.Build()).ToList()); | |||
| else | |||
| return MessageComponent.Empty; | |||
| return _actionRows != null | |||
| ? new MessageComponent(_actionRows.Select(x => x.Build()).ToList()) | |||
| : MessageComponent.Empty; | |||
| } | |||
| } | |||
| @@ -272,19 +271,18 @@ namespace Discord | |||
| set | |||
| { | |||
| if (value == null) | |||
| throw new ArgumentNullException(message: "Action row components cannot be null!", paramName: nameof(Components)); | |||
| if (value.Count <= 0) | |||
| throw new ArgumentException(message: "There must be at least 1 component in a row", paramName: nameof(Components)); | |||
| if (value.Count > MaxChildCount) | |||
| throw new ArgumentException(message: $"Action row can only contain {MaxChildCount} child components!", paramName: nameof(Components)); | |||
| throw new ArgumentNullException(nameof(value), $"{nameof(Components)} cannot be null."); | |||
| _components = value; | |||
| _components = value.Count switch | |||
| { | |||
| 0 => throw new ArgumentOutOfRangeException(nameof(value), "There must be at least 1 component in a row."), | |||
| > MaxChildCount => throw new ArgumentOutOfRangeException(nameof(value), $"Action row can only contain {MaxChildCount} child components!"), | |||
| _ => value | |||
| }; | |||
| } | |||
| } | |||
| private List<IMessageComponent> _components { get; set; } = new List<IMessageComponent>(); | |||
| private List<IMessageComponent> _components = new List<IMessageComponent>(); | |||
| /// <summary> | |||
| /// Adds a list of components to the current row. | |||
| @@ -359,18 +357,12 @@ namespace Discord | |||
| public string Label | |||
| { | |||
| get => _label; | |||
| set | |||
| set => _label = value?.Length switch | |||
| { | |||
| if (value != null) | |||
| { | |||
| if (value.Length > MaxButtonLabelLength) | |||
| throw new ArgumentException($"Button label must be {MaxButtonLabelLength} characters or less!", paramName: nameof(Label)); | |||
| if (value.Length < 1) | |||
| throw new ArgumentException("Button label must be 1 character or more!", paramName: nameof(Label)); | |||
| } | |||
| _label = value; | |||
| } | |||
| > MaxButtonLabelLength => throw new ArgumentOutOfRangeException(nameof(value), $"Label length must be less or equal to {MaxButtonLabelLength}."), | |||
| 0 => throw new ArgumentOutOfRangeException(nameof(value), "Label length must be at least 1."), | |||
| _ => value | |||
| }; | |||
| } | |||
| /// <summary> | |||
| @@ -381,17 +373,12 @@ namespace Discord | |||
| public string CustomId | |||
| { | |||
| get => _customId; | |||
| set | |||
| set => _customId = value?.Length switch | |||
| { | |||
| if (value != null) | |||
| { | |||
| if (value.Length > ComponentBuilder.MaxCustomIdLength) | |||
| throw new ArgumentException($"Custom Id must be {ComponentBuilder.MaxCustomIdLength} characters or less!", paramName: nameof(CustomId)); | |||
| if (value.Length < 1) | |||
| throw new ArgumentException("Custom Id must be 1 character or more!", paramName: nameof(CustomId)); | |||
| } | |||
| _customId = value; | |||
| } | |||
| > ComponentBuilder.MaxCustomIdLength => throw new ArgumentOutOfRangeException(nameof(value), $"Custom Id length must be less or equal to {ComponentBuilder.MaxCustomIdLength}."), | |||
| 0 => throw new ArgumentOutOfRangeException(nameof(value), "Custom Id length must be at least 1."), | |||
| _ => value | |||
| }; | |||
| } | |||
| /// <summary> | |||
| @@ -414,7 +401,6 @@ namespace Discord | |||
| /// </summary> | |||
| public bool IsDisabled { get; set; } | |||
| private string _label; | |||
| private string _customId; | |||
| @@ -594,8 +580,7 @@ namespace Discord | |||
| { | |||
| if (string.IsNullOrEmpty(Url)) | |||
| throw new InvalidOperationException("Link buttons must have a link associated with them"); | |||
| else | |||
| UrlValidation.ValidateButton(Url); | |||
| UrlValidation.ValidateButton(Url); | |||
| } | |||
| else if (string.IsNullOrEmpty(CustomId)) | |||
| throw new InvalidOperationException("Non-link buttons must have a custom id associated with them"); | |||
| @@ -632,17 +617,12 @@ namespace Discord | |||
| public string CustomId | |||
| { | |||
| get => _customId; | |||
| set | |||
| set => _customId = value?.Length switch | |||
| { | |||
| if (value != null) | |||
| { | |||
| if (value.Length > ComponentBuilder.MaxCustomIdLength) | |||
| throw new ArgumentException($"Custom Id must be {ComponentBuilder.MaxCustomIdLength} characters or less!", paramName: nameof(CustomId)); | |||
| if (value.Length < 1) | |||
| throw new ArgumentException("Custom Id must be 1 character or more!", paramName: nameof(CustomId)); | |||
| } | |||
| _customId = value; | |||
| } | |||
| > ComponentBuilder.MaxCustomIdLength => throw new ArgumentOutOfRangeException(nameof(value), $"Custom Id length must be less or equal to {ComponentBuilder.MaxCustomIdLength}."), | |||
| 0 => throw new ArgumentOutOfRangeException(nameof(value), "Custom Id length must be at least 1."), | |||
| _ => value | |||
| }; | |||
| } | |||
| /// <summary> | |||
| @@ -653,18 +633,12 @@ namespace Discord | |||
| public string Placeholder | |||
| { | |||
| get => _placeholder; | |||
| set | |||
| set => _placeholder = value?.Length switch | |||
| { | |||
| if (value != null) | |||
| { | |||
| if (value.Length > MaxPlaceholderLength) | |||
| throw new ArgumentException($"The placeholder must be {MaxPlaceholderLength} characters or less!", paramName: nameof(Placeholder)); | |||
| if (value.Length < 1) | |||
| throw new ArgumentException("The placeholder must be 1 character or more!", paramName: nameof(Placeholder)); | |||
| } | |||
| _placeholder = value; | |||
| } | |||
| > MaxPlaceholderLength => throw new ArgumentOutOfRangeException(nameof(value), $"Placeholder length must be less or equal to {MaxPlaceholderLength}."), | |||
| 0 => throw new ArgumentOutOfRangeException(nameof(value), "Placeholder length must be at least 1."), | |||
| _ => value | |||
| }; | |||
| } | |||
| /// <summary> | |||
| @@ -708,7 +682,7 @@ namespace Discord | |||
| if (value != null) | |||
| Preconditions.LessThan(value.Count, MaxOptionCount, nameof(Options)); | |||
| else | |||
| throw new ArgumentNullException(nameof(value)); | |||
| throw new ArgumentNullException(nameof(value), $"{nameof(Options)} cannot be null."); | |||
| _options = value; | |||
| } | |||
| @@ -908,7 +882,7 @@ namespace Discord | |||
| /// The maximum length of a <see cref="SelectMenuOption.Description"/>. | |||
| /// </summary> | |||
| public const int MaxDescriptionLength = 100; | |||
| /// <summary> | |||
| /// The maximum length of a <see cref="SelectMenuOption.Value"/>. | |||
| /// </summary> | |||
| @@ -922,42 +896,28 @@ namespace Discord | |||
| public string Label | |||
| { | |||
| get => _label; | |||
| set | |||
| set => _label = value?.Length switch | |||
| { | |||
| if (value != null) | |||
| { | |||
| if (value.Length > MaxSelectLabelLength) | |||
| throw new ArgumentException($"Select option label must be {MaxSelectLabelLength} characters or less!", paramName: nameof(Label)); | |||
| if (value.Length < 1) | |||
| throw new ArgumentException("Select option label must be 1 character or more!", paramName: nameof(Label)); | |||
| } | |||
| _label = value; | |||
| } | |||
| > MaxSelectLabelLength => throw new ArgumentOutOfRangeException(nameof(value), $"Label length must be less or equal to {MaxSelectLabelLength}."), | |||
| 0 => throw new ArgumentOutOfRangeException(nameof(value), "Label length must be at least 1."), | |||
| _ => value | |||
| }; | |||
| } | |||
| /// <summary> | |||
| /// Gets or sets the custom id of the current select menu. | |||
| /// Gets or sets the value of the current select menu. | |||
| /// </summary> | |||
| /// <exception cref="ArgumentException" accessor="set"><see cref="Value"/> length exceeds <see cref="MaxSelectValueLength"/>.</exception> | |||
| /// <exception cref="ArgumentException" accessor="set"><see cref="Value"/> length subceeds 1.</exception> | |||
| public string Value | |||
| { | |||
| get => _value; | |||
| set | |||
| set => _value = value?.Length switch | |||
| { | |||
| if (value != null) | |||
| { | |||
| if (value.Length > MaxSelectValueLength) | |||
| throw new ArgumentException($"Select option value must be {MaxSelectValueLength} characters or less!", paramName: nameof(Label)); | |||
| if (value.Length < 1) | |||
| throw new ArgumentException("Select option value must be 1 character or more!", paramName: nameof(Label)); | |||
| } | |||
| else | |||
| throw new ArgumentException("Select option value must not be null or empty!", paramName: nameof(Label)); | |||
| _value = value; | |||
| } | |||
| > MaxSelectValueLength => throw new ArgumentOutOfRangeException(nameof(value), $"Value length must be less or equal to {MaxSelectValueLength}."), | |||
| 0 => throw new ArgumentOutOfRangeException(nameof(value), "Value length must be at least 1."), | |||
| _ => value | |||
| }; | |||
| } | |||
| /// <summary> | |||
| @@ -968,18 +928,12 @@ namespace Discord | |||
| public string Description | |||
| { | |||
| get => _description; | |||
| set | |||
| set => _description = value?.Length switch | |||
| { | |||
| if (value != null) | |||
| { | |||
| if (value.Length > MaxDescriptionLength) | |||
| throw new ArgumentException($"The description must be {MaxDescriptionLength} characters or less!", paramName: nameof(Label)); | |||
| if (value.Length < 1) | |||
| throw new ArgumentException("The description must be 1 character or more!", paramName: nameof(Label)); | |||
| } | |||
| _description = value; | |||
| } | |||
| > MaxDescriptionLength => throw new ArgumentOutOfRangeException(nameof(value), $"Description length must be less or equal to {MaxDescriptionLength}."), | |||
| 0 => throw new ArgumentOutOfRangeException(nameof(value), "Description length must be at least 1."), | |||
| _ => value | |||
| }; | |||
| } | |||
| /// <summary> | |||
| @@ -1,29 +1,23 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| /// Represents a type of a component | |||
| /// Represents a type of a component. | |||
| /// </summary> | |||
| public enum ComponentType | |||
| { | |||
| /// <summary> | |||
| /// A container for other components | |||
| /// A container for other components. | |||
| /// </summary> | |||
| ActionRow = 1, | |||
| /// <summary> | |||
| /// A clickable button | |||
| /// A clickable button. | |||
| /// </summary> | |||
| Button = 2, | |||
| /// <summary> | |||
| /// A select menu for picking from choices | |||
| /// A select menu for picking from choices. | |||
| /// </summary> | |||
| SelectMenu = 3, | |||
| SelectMenu = 3 | |||
| } | |||
| } | |||
| @@ -1,9 +1,3 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| @@ -1,8 +1,4 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| @@ -1,8 +1,5 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| @@ -1,9 +1,3 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| @@ -1,9 +1,7 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Text.RegularExpressions; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| @@ -30,20 +28,17 @@ namespace Discord | |||
| /// </summary> | |||
| public string Name | |||
| { | |||
| get | |||
| { | |||
| return _name; | |||
| } | |||
| get => _name; | |||
| set | |||
| { | |||
| Preconditions.NotNullOrEmpty(value, nameof(Name)); | |||
| Preconditions.AtLeast(value.Length, 1, nameof(Name)); | |||
| Preconditions.AtMost(value.Length, MaxNameLength, nameof(Name)); | |||
| Preconditions.NotNullOrEmpty(value, nameof(value)); | |||
| Preconditions.AtLeast(value.Length, 1, nameof(value)); | |||
| Preconditions.AtMost(value.Length, MaxNameLength, nameof(value)); | |||
| // Discord updated the docs, this regex prevents special characters like @!$%(... etc, | |||
| // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand | |||
| if (!Regex.IsMatch(value, @"^[\w-]{1,32}$")) | |||
| throw new ArgumentException("Command name cannot contain any special characters or whitespaces!"); | |||
| throw new ArgumentException("Command name cannot contain any special characters or whitespaces!", nameof(value)); | |||
| _name = value; | |||
| } | |||
| @@ -55,10 +50,7 @@ namespace Discord | |||
| /// </summary> | |||
| public string Description | |||
| { | |||
| get | |||
| { | |||
| return _description; | |||
| } | |||
| get => _description; | |||
| set | |||
| { | |||
| Preconditions.NotNullOrEmpty(value, nameof(Description)); | |||
| @@ -77,10 +69,7 @@ namespace Discord | |||
| get => _options; | |||
| set | |||
| { | |||
| if (value != null) | |||
| if (value.Count > MaxOptionsCount) | |||
| throw new ArgumentException(message: $"Option count must be less than or equal to {MaxOptionsCount}.", paramName: nameof(Options)); | |||
| Preconditions.AtMost(value?.Count ?? 0, MaxOptionsCount, nameof(value)); | |||
| _options = value; | |||
| } | |||
| } | |||
| @@ -90,9 +79,9 @@ namespace Discord | |||
| /// </summary> | |||
| public bool DefaultPermission { get; set; } = true; | |||
| private string _name { get; set; } | |||
| private string _description { get; set; } | |||
| private List<SlashCommandOptionBuilder> _options { get; set; } | |||
| private string _name; | |||
| private string _description; | |||
| private List<SlashCommandOptionBuilder> _options; | |||
| /// <summary> | |||
| /// Build the current builder into a <see cref="SlashCommandProperties"/> class. | |||
| @@ -100,11 +89,11 @@ namespace Discord | |||
| /// <returns>A <see cref="SlashCommandProperties"/> that can be used to create slash commands over rest.</returns> | |||
| public SlashCommandProperties Build() | |||
| { | |||
| SlashCommandProperties props = new SlashCommandProperties() | |||
| var props = new SlashCommandProperties | |||
| { | |||
| Name = Name, | |||
| Description = Description, | |||
| DefaultPermission = DefaultPermission, | |||
| DefaultPermission = DefaultPermission | |||
| }; | |||
| if (Options != null && Options.Any()) | |||
| @@ -117,7 +106,6 @@ namespace Discord | |||
| } | |||
| return props; | |||
| } | |||
| /// <summary> | |||
| @@ -163,7 +151,7 @@ namespace Discord | |||
| /// <param name="description">The description of this option.</param> | |||
| /// <param name="required">If this option is required for this command.</param> | |||
| /// <param name="isDefault">If this option is the default option.</param> | |||
| /// <param name="isAutocomplete">If this option is set to autocompleate.</param> | |||
| /// <param name="isAutocomplete">If this option is set to autocomplete.</param> | |||
| /// <param name="options">The options of the option to add.</param> | |||
| /// <param name="channelTypes">The allowed channel types for this option.</param> | |||
| /// <param name="choices">The choices of this option.</param> | |||
| @@ -188,14 +176,10 @@ namespace Discord | |||
| Preconditions.AtMost(description.Length, MaxDescriptionLength, nameof(description)); | |||
| // make sure theres only one option with default set to true | |||
| if (isDefault.HasValue && isDefault.Value) | |||
| { | |||
| if (Options != null) | |||
| if (Options.Any(x => x.Default.HasValue && x.Default.Value)) | |||
| throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault)); | |||
| } | |||
| if (isDefault == true && Options?.Any(x => x.Default == true) == true) | |||
| throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault)); | |||
| SlashCommandOptionBuilder option = new SlashCommandOptionBuilder | |||
| var option = new SlashCommandOptionBuilder | |||
| { | |||
| Name = name, | |||
| Description = description, | |||
| @@ -204,8 +188,8 @@ namespace Discord | |||
| Options = options, | |||
| Type = type, | |||
| Autocomplete = isAutocomplete, | |||
| Choices = choices != null ? new List<ApplicationCommandOptionChoiceProperties>(choices) : null, | |||
| ChannelTypes = channelTypes, | |||
| Choices = (choices ?? Array.Empty<ApplicationCommandOptionChoiceProperties>()).ToList(), | |||
| ChannelTypes = channelTypes | |||
| }; | |||
| return AddOption(option); | |||
| @@ -228,14 +212,12 @@ namespace Discord | |||
| /// <returns>The current builder.</returns> | |||
| public SlashCommandBuilder AddOption(SlashCommandOptionBuilder option) | |||
| { | |||
| if (Options == null) | |||
| Options = new List<SlashCommandOptionBuilder>(); | |||
| Options ??= new List<SlashCommandOptionBuilder>(); | |||
| if (Options.Count >= MaxOptionsCount) | |||
| throw new ArgumentOutOfRangeException(nameof(Options), $"Cannot have more than {MaxOptionsCount} options!"); | |||
| throw new InvalidOperationException($"Cannot have more than {MaxOptionsCount} options!"); | |||
| if (option == null) | |||
| throw new ArgumentNullException(nameof(option), "Option cannot be null"); | |||
| Preconditions.NotNull(option, nameof(option)); | |||
| Options.Add(option); | |||
| return this; | |||
| @@ -251,10 +233,9 @@ namespace Discord | |||
| throw new ArgumentNullException(nameof(options), "Options cannot be null!"); | |||
| if (options.Length == 0) | |||
| throw new ArgumentException(nameof(options), "Options cannot be empty!"); | |||
| throw new ArgumentException("Options cannot be empty!", nameof(options)); | |||
| if (Options == null) | |||
| Options = new List<SlashCommandOptionBuilder>(); | |||
| Options ??= new List<SlashCommandOptionBuilder>(); | |||
| if (Options.Count + options.Length > MaxOptionsCount) | |||
| throw new ArgumentOutOfRangeException(nameof(options), $"Cannot have more than {MaxOptionsCount} options!"); | |||
| @@ -290,14 +271,13 @@ namespace Discord | |||
| get => _name; | |||
| set | |||
| { | |||
| if (value?.Length > SlashCommandBuilder.MaxNameLength) | |||
| throw new ArgumentException($"Name length must be less than or equal to {SlashCommandBuilder.MaxNameLength}"); | |||
| if (value?.Length < 1) | |||
| throw new ArgumentException("Name length must at least 1 characters in length"); | |||
| if (value != null) | |||
| { | |||
| Preconditions.AtLeast(value.Length, 1, nameof(value)); | |||
| Preconditions.AtMost(value.Length, SlashCommandBuilder.MaxNameLength, nameof(value)); | |||
| if (!Regex.IsMatch(value, @"^[\w-]{1,32}$")) | |||
| throw new ArgumentException("Option name cannot contain any special characters or whitespaces!"); | |||
| throw new ArgumentException("Option name cannot contain any special characters or whitespaces!", nameof(value)); | |||
| } | |||
| _name = value; | |||
| } | |||
| @@ -311,10 +291,11 @@ namespace Discord | |||
| get => _description; | |||
| set | |||
| { | |||
| if (value?.Length > SlashCommandBuilder.MaxDescriptionLength) | |||
| throw new ArgumentException($"Description length must be less than or equal to {SlashCommandBuilder.MaxDescriptionLength}"); | |||
| if (value?.Length < 1) | |||
| throw new ArgumentException("Description length must at least 1 character in length"); | |||
| if (value != null) | |||
| { | |||
| Preconditions.AtLeast(value.Length, 1, nameof(value)); | |||
| Preconditions.AtMost(value.Length, SlashCommandBuilder.MaxDescriptionLength, nameof(value)); | |||
| } | |||
| _description = value; | |||
| } | |||
| @@ -333,7 +314,7 @@ namespace Discord | |||
| /// <summary> | |||
| /// Gets or sets if the option is required. | |||
| /// </summary> | |||
| public bool? Required { get; set; } = null; | |||
| public bool? Required { get; set; } | |||
| /// <summary> | |||
| /// Gets or sets whether or not this option supports autocomplete. | |||
| @@ -364,19 +345,19 @@ namespace Discord | |||
| bool isSubType = Type == ApplicationCommandOptionType.SubCommandGroup; | |||
| if (isSubType && (Options == null || !Options.Any())) | |||
| throw new ArgumentException(nameof(Options), "SubCommands/SubCommandGroups must have at least one option"); | |||
| throw new InvalidOperationException("SubCommands/SubCommandGroups must have at least one option"); | |||
| if (!isSubType && (Options != null && Options.Any()) && Type != ApplicationCommandOptionType.SubCommand) | |||
| throw new ArgumentException(nameof(Options), $"Cannot have options on {Type} type"); | |||
| if (!isSubType && Options != null && Options.Any() && Type != ApplicationCommandOptionType.SubCommand) | |||
| throw new InvalidOperationException($"Cannot have options on {Type} type"); | |||
| return new ApplicationCommandOptionProperties() | |||
| return new ApplicationCommandOptionProperties | |||
| { | |||
| Name = Name, | |||
| Description = Description, | |||
| Default = Default, | |||
| Required = Required, | |||
| Type = Type, | |||
| Options = Options?.Count > 0 ? new List<ApplicationCommandOptionProperties>(Options.Select(x => x.Build())) : null, | |||
| Options = Options?.Count > 0 ? Options.Select(x => x.Build()).ToList() : new List<ApplicationCommandOptionProperties>(), | |||
| Choices = Choices, | |||
| Autocomplete = Autocomplete, | |||
| ChannelTypes = ChannelTypes | |||
| @@ -416,14 +397,10 @@ namespace Discord | |||
| Preconditions.AtMost(description.Length, SlashCommandBuilder.MaxDescriptionLength, nameof(description)); | |||
| // make sure theres only one option with default set to true | |||
| if (isDefault) | |||
| { | |||
| if (Options != null) | |||
| if (Options.Any(x => x.Default.HasValue && x.Default.Value)) | |||
| throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault)); | |||
| } | |||
| if (isDefault && Options?.Any(x => x.Default == true) == true) | |||
| throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault)); | |||
| SlashCommandOptionBuilder option = new SlashCommandOptionBuilder | |||
| var option = new SlashCommandOptionBuilder | |||
| { | |||
| Name = name, | |||
| Description = description, | |||
| @@ -432,8 +409,8 @@ namespace Discord | |||
| Autocomplete = isAutocomplete, | |||
| Options = options, | |||
| Type = type, | |||
| Choices = choices != null ? new List<ApplicationCommandOptionChoiceProperties>(choices) : null, | |||
| ChannelTypes = channelTypes, | |||
| Choices = (choices ?? Array.Empty<ApplicationCommandOptionChoiceProperties>()).ToList(), | |||
| ChannelTypes = channelTypes | |||
| }; | |||
| return AddOption(option); | |||
| @@ -445,14 +422,12 @@ namespace Discord | |||
| /// <returns>The current builder.</returns> | |||
| public SlashCommandOptionBuilder AddOption(SlashCommandOptionBuilder option) | |||
| { | |||
| if (Options == null) | |||
| Options = new List<SlashCommandOptionBuilder>(); | |||
| Options ??= new List<SlashCommandOptionBuilder>(); | |||
| if (Options.Count >= SlashCommandBuilder.MaxOptionsCount) | |||
| throw new ArgumentOutOfRangeException(nameof(Choices), $"There can only be {SlashCommandBuilder.MaxOptionsCount} options per sub command group!"); | |||
| throw new InvalidOperationException($"There can only be {SlashCommandBuilder.MaxOptionsCount} options per sub command group!"); | |||
| if (option == null) | |||
| throw new ArgumentNullException(nameof(option), "Option cannot be null"); | |||
| Preconditions.NotNull(option, nameof(option)); | |||
| Options.Add(option); | |||
| return this; | |||
| @@ -466,19 +441,17 @@ namespace Discord | |||
| /// <returns>The current builder.</returns> | |||
| public SlashCommandOptionBuilder AddChoice(string name, int value) | |||
| { | |||
| if (Choices == null) | |||
| Choices = new List<ApplicationCommandOptionChoiceProperties>(); | |||
| Choices ??= new List<ApplicationCommandOptionChoiceProperties>(); | |||
| if (Choices.Count >= MaxChoiceCount) | |||
| throw new ArgumentOutOfRangeException(nameof(Choices), $"Cannot add more than {MaxChoiceCount} choices!"); | |||
| throw new InvalidOperationException($"Cannot add more than {MaxChoiceCount} choices!"); | |||
| if (name == null) | |||
| throw new ArgumentNullException($"{nameof(name)} cannot be null!"); | |||
| Preconditions.NotNull(name, nameof(name)); | |||
| Preconditions.AtLeast(name.Length, 1, nameof(name)); | |||
| Preconditions.AtMost(name.Length, 100, nameof(name)); | |||
| Choices.Add(new ApplicationCommandOptionChoiceProperties() | |||
| Choices.Add(new ApplicationCommandOptionChoiceProperties | |||
| { | |||
| Name = name, | |||
| Value = value | |||
| @@ -495,17 +468,13 @@ namespace Discord | |||
| /// <returns>The current builder.</returns> | |||
| public SlashCommandOptionBuilder AddChoice(string name, string value) | |||
| { | |||
| if (Choices == null) | |||
| Choices = new List<ApplicationCommandOptionChoiceProperties>(); | |||
| Choices ??= new List<ApplicationCommandOptionChoiceProperties>(); | |||
| if (Choices.Count >= MaxChoiceCount) | |||
| throw new ArgumentOutOfRangeException(nameof(Choices), $"Cannot add more than {MaxChoiceCount} choices!"); | |||
| if (name == null) | |||
| throw new ArgumentNullException($"{nameof(name)} cannot be null!"); | |||
| throw new InvalidOperationException($"Cannot add more than {MaxChoiceCount} choices!"); | |||
| if (value == null) | |||
| throw new ArgumentNullException($"{nameof(value)} cannot be null!"); | |||
| Preconditions.NotNull(name, nameof(name)); | |||
| Preconditions.NotNull(value, nameof(value)); | |||
| Preconditions.AtLeast(name.Length, 1, nameof(name)); | |||
| Preconditions.AtMost(name.Length, 100, nameof(name)); | |||
| @@ -513,7 +482,7 @@ namespace Discord | |||
| Preconditions.AtLeast(value.Length, 1, nameof(value)); | |||
| Preconditions.AtMost(value.Length, 100, nameof(value)); | |||
| Choices.Add(new ApplicationCommandOptionChoiceProperties() | |||
| Choices.Add(new ApplicationCommandOptionChoiceProperties | |||
| { | |||
| Name = name, | |||
| Value = value | |||
| @@ -523,14 +492,13 @@ namespace Discord | |||
| } | |||
| /// <summary> | |||
| /// Adds a channnel type to the current option. | |||
| /// Adds a channel type to the current option. | |||
| /// </summary> | |||
| /// <param name="channelType">The <see cref="ChannelType"/> to add.</param> | |||
| /// <returns>The current builder.</returns> | |||
| public SlashCommandOptionBuilder AddChannelType(ChannelType channelType) | |||
| { | |||
| if (ChannelTypes == null) | |||
| ChannelTypes = new List<ChannelType>(); | |||
| ChannelTypes ??= new List<ChannelType>(); | |||
| ChannelTypes.Add(channelType); | |||
| @@ -1,8 +1,4 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| @@ -1,15 +1,25 @@ | |||
| namespace Discord | |||
| { | |||
| /// <summary> Defines the types of formats for stickers. </summary> | |||
| /// <summary> | |||
| /// Defines the types of formats for stickers. | |||
| /// </summary> | |||
| public enum StickerFormatType | |||
| { | |||
| /// <summary> Default value for a sticker format type. </summary> | |||
| /// <summary> | |||
| /// Default value for a sticker format type. | |||
| /// </summary> | |||
| None = 0, | |||
| /// <summary> The sticker format type is png. </summary> | |||
| /// <summary> | |||
| /// The sticker format type is png. | |||
| /// </summary> | |||
| Png = 1, | |||
| /// <summary> The sticker format type is apng. </summary> | |||
| /// <summary> | |||
| /// The sticker format type is apng. | |||
| /// </summary> | |||
| Apng = 2, | |||
| /// <summary> The sticker format type is lottie. </summary> | |||
| Lottie = 3, | |||
| /// <summary> | |||
| /// The sticker format type is lottie. | |||
| /// </summary> | |||
| Lottie = 3 | |||
| } | |||
| } | |||
| @@ -1,8 +1,4 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| @@ -24,18 +20,13 @@ namespace Discord | |||
| /// <summary> | |||
| /// Converts the current timestamp tag to the string representation supported by discord. | |||
| /// <para> | |||
| /// If the <see cref="TimestampTag.Time"/> is null then the default 0 will be used. | |||
| /// If the <see cref="Time"/> is null then the default 0 will be used. | |||
| /// </para> | |||
| /// </summary> | |||
| /// <returns>A string thats compatible in a discord message, ex: <code><t:1625944201:f></code></returns> | |||
| /// <returns>A string that is compatible in a discord message, ex: <code><t:1625944201:f></code></returns> | |||
| public override string ToString() | |||
| { | |||
| if (Time == null) | |||
| return $"<t:0:{(char)Style}>"; | |||
| var offset = (DateTimeOffset)this.Time; | |||
| return $"<t:{offset.ToUnixTimeSeconds()}:{(char)Style}>"; | |||
| return $"<t:{((DateTimeOffset)Time).ToUnixTimeSeconds()}:{(char)Style}>"; | |||
| } | |||
| /// <summary> | |||
| @@ -46,7 +37,7 @@ namespace Discord | |||
| /// <returns>The newly create timestamp tag.</returns> | |||
| public static TimestampTag FromDateTime(DateTime time, TimestampTagStyles style = TimestampTagStyles.ShortDateTime) | |||
| { | |||
| return new TimestampTag() | |||
| return new TimestampTag | |||
| { | |||
| Style = style, | |||
| Time = time | |||
| @@ -1,9 +1,3 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| @@ -1,9 +1,3 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| @@ -18,6 +12,6 @@ namespace Discord | |||
| /// <summary> | |||
| /// The target of the permission is a user. | |||
| /// </summary> | |||
| User = 2, | |||
| User = 2 | |||
| } | |||
| } | |||
| @@ -1,8 +1,4 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| @@ -1,7 +1,4 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| @@ -1,6 +1,4 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| @@ -57,12 +55,12 @@ namespace Discord | |||
| new StickerFormatType Format { get; } | |||
| /// <summary> | |||
| /// Gets whether this guild sticker can be used, may be false due to loss of Server Boosts | |||
| /// Gets whether this guild sticker can be used, may be false due to loss of Server Boosts. | |||
| /// </summary> | |||
| bool? IsAvailable { get; } | |||
| /// <summary> | |||
| /// Gets the standard sticker's sort order within its pack | |||
| /// Gets the standard sticker's sort order within its pack. | |||
| /// </summary> | |||
| int? SortOrder { get; } | |||
| /// <summary> | |||
| @@ -1,9 +1,3 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| @@ -1,16 +1,12 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Collections.Immutable; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| /// Represents a discord sticker pack. | |||
| /// </summary> | |||
| /// <typeparam name="TSticker">The type of the stickers within the collection</typeparam> | |||
| /// <typeparam name="TSticker">The type of the stickers within the collection.</typeparam> | |||
| public class StickerPack<TSticker> where TSticker : ISticker | |||
| { | |||
| /// <summary> | |||
| @@ -1,8 +1,4 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| @@ -1,13 +1,7 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| /// Represents a type of sticker | |||
| /// Represents a type of sticker.. | |||
| /// </summary> | |||
| public enum StickerType | |||
| { | |||
| @@ -19,6 +13,6 @@ namespace Discord | |||
| /// <summary> | |||
| /// Represents a sticker that was created within a guild. | |||
| /// </summary> | |||
| Guild = 2, | |||
| Guild = 2 | |||
| } | |||
| } | |||
| @@ -1,8 +1,4 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.Net | |||
| { | |||
| @@ -2,38 +2,38 @@ using System; | |||
| namespace Discord.Utils | |||
| { | |||
| static class UrlValidation | |||
| internal static class UrlValidation | |||
| { | |||
| /// <summary> | |||
| /// Not full URL validation right now. Just ensures protocol is present and that it's either http or https | |||
| /// <see cref="ValidateButton(string)"/> should be used for url buttons | |||
| /// <see cref="ValidateButton(string)"/> should be used for url buttons. | |||
| /// </summary> | |||
| /// <param name="url">url to validate before sending to Discord.</param> | |||
| /// <param name="url">The URL to validate before sending to Discord.</param> | |||
| /// <exception cref="InvalidOperationException">A URL must include a protocol (http or https).</exception> | |||
| /// <returns>true if url is valid by our standard, false if null, throws an error upon invalid </returns> | |||
| /// <returns>true if URL is valid by our standard, false if null, throws an error upon invalid.</returns> | |||
| public static bool Validate(string url) | |||
| { | |||
| if (string.IsNullOrEmpty(url)) | |||
| return false; | |||
| if(!(url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || (url.StartsWith("https://", StringComparison.OrdinalIgnoreCase)))) | |||
| if (!(url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https://", StringComparison.OrdinalIgnoreCase))) | |||
| throw new InvalidOperationException($"The url {url} must include a protocol (either HTTP or HTTPS)"); | |||
| return true; | |||
| } | |||
| /// <summary> | |||
| /// Not full URL validation right now. Just Ensures the protocol is either http, https, or discord | |||
| /// <see cref="Validate(string)"/> should be used everything other than url buttons | |||
| /// <see cref="Validate(string)"/> should be used everything other than url buttons. | |||
| /// </summary> | |||
| /// <param name="url">the url to validate before sending to discord</param> | |||
| /// <param name="url">The URL to validate before sending to discord.</param> | |||
| /// <exception cref="InvalidOperationException">A URL must include a protocol (either http, https, or discord).</exception> | |||
| /// <returns>true if the url is valid by our standard, false if null, throws an error upon invalid</returns> | |||
| /// <returns>true if the URL is valid by our standard, false if null, throws an error upon invalid.</returns> | |||
| public static bool ValidateButton(string url) | |||
| { | |||
| if (string.IsNullOrEmpty(url)) | |||
| return false; | |||
| if(!((url.StartsWith("http://", StringComparison.OrdinalIgnoreCase)) || | |||
| (url.StartsWith("https://", StringComparison.OrdinalIgnoreCase)) || | |||
| (url.StartsWith("discord://", StringComparison.OrdinalIgnoreCase)))) | |||
| if (!(url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || | |||
| url.StartsWith("https://", StringComparison.OrdinalIgnoreCase) || | |||
| url.StartsWith("discord://", StringComparison.OrdinalIgnoreCase))) | |||
| throw new InvalidOperationException($"The url {url} must include a protocol (either HTTP, HTTPS, or DISCORD)"); | |||
| return true; | |||
| } | |||
| @@ -1,10 +1,5 @@ | |||
| using Newtonsoft.Json; | |||
| using Newtonsoft.Json.Linq; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API | |||
| { | |||
| @@ -26,7 +21,7 @@ namespace Discord.API | |||
| { | |||
| ComponentType.Button => new ButtonComponent(x as Discord.ButtonComponent), | |||
| ComponentType.SelectMenu => new SelectMenuComponent(x as Discord.SelectMenuComponent), | |||
| _ => null, | |||
| _ => null | |||
| }; | |||
| }).ToArray(); | |||
| } | |||
| @@ -1,9 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API | |||
| { | |||
| @@ -1,5 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System.Collections.Generic; | |||
| namespace Discord.API | |||
| { | |||
| @@ -19,6 +18,5 @@ namespace Discord.API | |||
| [JsonProperty("type")] | |||
| public ApplicationCommandType Type { get; set; } | |||
| } | |||
| } | |||
| @@ -1,5 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System.Collections.Generic; | |||
| namespace Discord.API | |||
| { | |||
| @@ -1,9 +1,5 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API | |||
| { | |||
| @@ -40,7 +36,7 @@ namespace Discord.API | |||
| public ApplicationCommandOption(IApplicationCommandOption cmd) | |||
| { | |||
| Choices = cmd.Choices.Select(x => new ApplicationCommandOptionChoice() | |||
| Choices = cmd.Choices.Select(x => new ApplicationCommandOptionChoice | |||
| { | |||
| Name = x.Name, | |||
| Value = x.Value | |||
| @@ -50,42 +46,28 @@ namespace Discord.API | |||
| ChannelTypes = cmd.ChannelTypes.ToArray(); | |||
| Required = cmd.IsRequired.HasValue | |||
| ? cmd.IsRequired.Value | |||
| : Optional<bool>.Unspecified; | |||
| Default = cmd.IsDefault.HasValue | |||
| ? cmd.IsDefault.Value | |||
| : Optional<bool>.Unspecified; | |||
| Required = cmd.IsRequired ?? Optional<bool>.Unspecified; | |||
| Default = cmd.IsDefault ?? Optional<bool>.Unspecified; | |||
| Name = cmd.Name; | |||
| Type = cmd.Type; | |||
| Description = cmd.Description; | |||
| } | |||
| public ApplicationCommandOption(Discord.ApplicationCommandOptionProperties option) | |||
| public ApplicationCommandOption(ApplicationCommandOptionProperties option) | |||
| { | |||
| Choices = option.Choices != null | |||
| ? option.Choices.Select(x => new ApplicationCommandOptionChoice() | |||
| { | |||
| Name = x.Name, | |||
| Value = x.Value | |||
| }).ToArray() | |||
| : Optional<ApplicationCommandOptionChoice[]>.Unspecified; | |||
| Options = option.Options != null | |||
| ? option.Options.Select(x => new ApplicationCommandOption(x)).ToArray() | |||
| : Optional<ApplicationCommandOption[]>.Unspecified; | |||
| Required = option.Required.HasValue | |||
| ? option.Required.Value | |||
| : Optional<bool>.Unspecified; | |||
| Default = option.Default.HasValue | |||
| ? option.Default.Value | |||
| : Optional<bool>.Unspecified; | |||
| ChannelTypes = option.ChannelTypes != null | |||
| ? option.ChannelTypes.ToArray() | |||
| : Optional<ChannelType[]>.Unspecified; | |||
| Choices = option.Choices?.Select(x => new ApplicationCommandOptionChoice | |||
| { | |||
| Name = x.Name, | |||
| Value = x.Value | |||
| }).ToArray() ?? Optional<ApplicationCommandOptionChoice[]>.Unspecified; | |||
| Options = option.Options?.Select(x => new ApplicationCommandOption(x)).ToArray() ?? Optional<ApplicationCommandOption[]>.Unspecified; | |||
| Required = option.Required ?? Optional<bool>.Unspecified; | |||
| Default = option.Default ?? Optional<bool>.Unspecified; | |||
| ChannelTypes = option.ChannelTypes?.ToArray() ?? Optional<ChannelType[]>.Unspecified; | |||
| Name = option.Name; | |||
| Type = option.Type; | |||
| @@ -1,9 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API | |||
| { | |||
| @@ -1,9 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API | |||
| { | |||
| @@ -1,9 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API | |||
| { | |||
| @@ -1,9 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API | |||
| { | |||
| @@ -1,9 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API | |||
| { | |||
| @@ -45,16 +40,16 @@ namespace Discord.API | |||
| { | |||
| if (c.Emote is Emote e) | |||
| { | |||
| Emote = new Emoji() | |||
| Emote = new Emoji | |||
| { | |||
| Name = e.Name, | |||
| Animated = e.Animated, | |||
| Id = e.Id, | |||
| Id = e.Id | |||
| }; | |||
| } | |||
| else | |||
| { | |||
| Emote = new Emoji() | |||
| Emote = new Emoji | |||
| { | |||
| Name = c.Emote.Name | |||
| }; | |||
| @@ -1,9 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API.Rest | |||
| { | |||
| @@ -1,9 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API | |||
| { | |||
| @@ -19,6 +14,6 @@ namespace Discord.API | |||
| public ulong GuildId { get; set; } | |||
| [JsonProperty("permissions")] | |||
| public API.ApplicationCommandPermissions[] Permissions { get; set; } | |||
| public ApplicationCommandPermissions[] Permissions { get; set; } | |||
| } | |||
| } | |||
| @@ -1,9 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API | |||
| { | |||
| @@ -11,7 +11,7 @@ namespace Discord.API | |||
| public Optional<string> Content { get; set; } | |||
| [JsonProperty("embeds")] | |||
| public Optional<API.Embed[]> Embeds { get; set; } | |||
| public Optional<Embed[]> Embeds { get; set; } | |||
| [JsonProperty("allowed_mentions")] | |||
| public Optional<AllowedMentions> AllowedMentions { get; set; } | |||
| @@ -20,9 +20,9 @@ namespace Discord.API | |||
| public Optional<MessageFlags> Flags { get; set; } | |||
| [JsonProperty("components")] | |||
| public Optional<API.ActionRowComponent[]> Components { get; set; } | |||
| public Optional<ActionRowComponent[]> Components { get; set; } | |||
| [JsonProperty("choices")] | |||
| public Optional<API.ApplicationCommandOptionChoice[]> Choices { get; set; } | |||
| public Optional<ApplicationCommandOptionChoice[]> Choices { get; set; } | |||
| } | |||
| } | |||
| @@ -1,9 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API | |||
| { | |||
| @@ -1,9 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API | |||
| { | |||
| @@ -1,9 +1,5 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API | |||
| { | |||
| @@ -1,9 +1,5 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API | |||
| { | |||
| @@ -1,9 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API | |||
| { | |||
| @@ -36,23 +31,23 @@ namespace Discord.API | |||
| { | |||
| if (option.Emote is Emote e) | |||
| { | |||
| Emoji = new Emoji() | |||
| Emoji = new Emoji | |||
| { | |||
| Name = e.Name, | |||
| Animated = e.Animated, | |||
| Id = e.Id, | |||
| Id = e.Id | |||
| }; | |||
| } | |||
| else | |||
| { | |||
| Emoji = new Emoji() | |||
| Emoji = new Emoji | |||
| { | |||
| Name = option.Emote.Name | |||
| }; | |||
| } | |||
| } | |||
| Default = option.Default.HasValue ? option.Default.Value : Optional<bool>.Unspecified; | |||
| Default = option.Default ?? Optional<bool>.Unspecified; | |||
| } | |||
| } | |||
| } | |||
| @@ -1,9 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API | |||
| { | |||
| @@ -11,7 +11,7 @@ namespace Discord.API | |||
| [JsonProperty("name")] | |||
| public string Name { get; set; } | |||
| [JsonProperty("description")] | |||
| public string Desription { get; set; } | |||
| public string Description { get; set; } | |||
| [JsonProperty("tags")] | |||
| public Optional<string> Tags { get; set; } | |||
| [JsonProperty("type")] | |||
| @@ -1,9 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API | |||
| { | |||
| @@ -1,9 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API | |||
| { | |||
| @@ -1,9 +1,5 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API | |||
| { | |||
| @@ -18,7 +14,7 @@ namespace Discord.API | |||
| [JsonProperty("join_timestamp")] | |||
| public DateTimeOffset JoinTimestamp { get; set; } | |||
| [JsonProperty("presense")] | |||
| [JsonProperty("presence")] | |||
| public Optional<Presence> Presence { get; set; } | |||
| [JsonProperty("member")] | |||
| @@ -1,9 +1,5 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API | |||
| { | |||
| @@ -1,10 +1,4 @@ | |||
| using Discord.API; | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API.Rest | |||
| { | |||
| @@ -30,7 +24,7 @@ namespace Discord.API.Rest | |||
| { | |||
| Name = name; | |||
| Description = description; | |||
| Options = Optional.Create<ApplicationCommandOption[]>(options); | |||
| Options = Optional.Create(options); | |||
| Type = type; | |||
| } | |||
| } | |||
| @@ -1,9 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API.Rest | |||
| { | |||
| @@ -1,12 +1,6 @@ | |||
| using Discord.Net.Rest; | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.IO; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API.Rest | |||
| { | |||
| internal class CreateStickerParams | |||
| @@ -30,7 +24,7 @@ namespace Discord.API.Rest | |||
| if (File is FileStream fileStream) | |||
| contentType = $"image/{Path.GetExtension(fileStream.Name)}"; | |||
| else if(FileName != null) | |||
| else if (FileName != null) | |||
| contentType = $"image/{Path.GetExtension(FileName)}"; | |||
| d["file"] = new MultipartFile(File, FileName ?? "image", contentType.Replace(".", "")); | |||
| @@ -1,9 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API.Rest | |||
| { | |||
| @@ -1,9 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API.Rest | |||
| { | |||
| @@ -1,9 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API.Rest | |||
| { | |||
| @@ -1,9 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API.Rest | |||
| { | |||
| @@ -19,7 +14,7 @@ namespace Discord.API.Rest | |||
| public Optional<AllowedMentions> AllowedMentions { get; set; } | |||
| [JsonProperty("components")] | |||
| public Optional<API.ActionRowComponent[]> Components { get; set; } | |||
| public Optional<ActionRowComponent[]> Components { get; set; } | |||
| [JsonProperty("flags")] | |||
| public Optional<MessageFlags?> Flags { get; set; } | |||
| @@ -1,15 +1,9 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API.Rest | |||
| { | |||
| internal class ModifyStageInstanceParams | |||
| { | |||
| [JsonProperty("topic")] | |||
| public Optional<string> Topic { get; set; } | |||
| @@ -1,9 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API.Rest | |||
| { | |||
| @@ -1,9 +1,3 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| using Discord; | |||
| using Newtonsoft.Json; | |||
| namespace Discord.API.Rest | |||
| @@ -1,9 +1,4 @@ | |||
| using Newtonsoft.Json; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.API.Rest | |||
| { | |||
| @@ -194,17 +194,17 @@ namespace Discord.Rest | |||
| }; | |||
| } | |||
| public static async Task<IReadOnlyCollection<RestGlobalCommand>> GetGlobalApplicationCommands(BaseDiscordClient client, | |||
| public static async Task<IReadOnlyCollection<RestGlobalCommand>> GetGlobalApplicationCommandsAsync(BaseDiscordClient client, | |||
| RequestOptions options = null) | |||
| { | |||
| var response = await client.ApiClient.GetGlobalApplicationCommandsAsync(options).ConfigureAwait(false); | |||
| if (!response.Any()) | |||
| return new RestGlobalCommand[0]; | |||
| return Array.Empty<RestGlobalCommand>(); | |||
| return response.Select(x => RestGlobalCommand.Create(client, x)).ToArray(); | |||
| } | |||
| public static async Task<RestGlobalCommand> GetGlobalApplicationCommand(BaseDiscordClient client, ulong id, | |||
| public static async Task<RestGlobalCommand> GetGlobalApplicationCommandAsync(BaseDiscordClient client, ulong id, | |||
| RequestOptions options = null) | |||
| { | |||
| var model = await client.ApiClient.GetGlobalApplicationCommandAsync(id, options); | |||
| @@ -212,55 +212,55 @@ namespace Discord.Rest | |||
| return model != null ? RestGlobalCommand.Create(client, model) : null; | |||
| } | |||
| public static async Task<IReadOnlyCollection<RestGuildCommand>> GetGuildApplicationCommands(BaseDiscordClient client, ulong guildId, | |||
| public static async Task<IReadOnlyCollection<RestGuildCommand>> GetGuildApplicationCommandsAsync(BaseDiscordClient client, ulong guildId, | |||
| RequestOptions options = null) | |||
| { | |||
| var response = await client.ApiClient.GetGuildApplicationCommandsAsync(guildId, options).ConfigureAwait(false); | |||
| if (!response.Any()) | |||
| return new RestGuildCommand[0].ToImmutableArray(); | |||
| return ImmutableArray.Create<RestGuildCommand>(); | |||
| return response.Select(x => RestGuildCommand.Create(client, x, guildId)).ToImmutableArray(); | |||
| } | |||
| public static async Task<RestGuildCommand> GetGuildApplicationCommand(BaseDiscordClient client, ulong id, ulong guildId, | |||
| public static async Task<RestGuildCommand> GetGuildApplicationCommandAsync(BaseDiscordClient client, ulong id, ulong guildId, | |||
| RequestOptions options = null) | |||
| { | |||
| var model = await client.ApiClient.GetGuildApplicationCommandAsync(guildId, id, options); | |||
| return model != null ? RestGuildCommand.Create(client, model, guildId) : null; | |||
| } | |||
| public static async Task<RestGuildCommand> CreateGuildApplicationCommand(BaseDiscordClient client, ulong guildId, ApplicationCommandProperties properties, | |||
| public static async Task<RestGuildCommand> CreateGuildApplicationCommandAsync(BaseDiscordClient client, ulong guildId, ApplicationCommandProperties properties, | |||
| RequestOptions options = null) | |||
| { | |||
| var model = await InteractionHelper.CreateGuildCommand(client, guildId, properties, options); | |||
| var model = await InteractionHelper.CreateGuildCommandAsync(client, guildId, properties, options); | |||
| return RestGuildCommand.Create(client, model, guildId); | |||
| } | |||
| public static async Task<RestGlobalCommand> CreateGlobalApplicationCommand(BaseDiscordClient client, ApplicationCommandProperties properties, | |||
| public static async Task<RestGlobalCommand> CreateGlobalApplicationCommandAsync(BaseDiscordClient client, ApplicationCommandProperties properties, | |||
| RequestOptions options = null) | |||
| { | |||
| var model = await InteractionHelper.CreateGlobalCommand(client, properties, options); | |||
| var model = await InteractionHelper.CreateGlobalCommandAsync(client, properties, options); | |||
| return RestGlobalCommand.Create(client, model); | |||
| } | |||
| public static async Task<IReadOnlyCollection<RestGlobalCommand>> BulkOverwriteGlobalApplicationCommand(BaseDiscordClient client, ApplicationCommandProperties[] properties, | |||
| public static async Task<IReadOnlyCollection<RestGlobalCommand>> BulkOverwriteGlobalApplicationCommandAsync(BaseDiscordClient client, ApplicationCommandProperties[] properties, | |||
| RequestOptions options = null) | |||
| { | |||
| var models = await InteractionHelper.BulkOverwriteGlobalCommands(client, properties, options); | |||
| var models = await InteractionHelper.BulkOverwriteGlobalCommandsAsync(client, properties, options); | |||
| return models.Select(x => RestGlobalCommand.Create(client, x)).ToImmutableArray(); | |||
| } | |||
| public static async Task<IReadOnlyCollection<RestGuildCommand>> BulkOverwriteGuildApplicationCommand(BaseDiscordClient client, ulong guildId, | |||
| public static async Task<IReadOnlyCollection<RestGuildCommand>> BulkOverwriteGuildApplicationCommandAsync(BaseDiscordClient client, ulong guildId, | |||
| ApplicationCommandProperties[] properties, RequestOptions options = null) | |||
| { | |||
| var models = await InteractionHelper.BulkOverwriteGuildCommands(client, guildId, properties, options); | |||
| var models = await InteractionHelper.BulkOverwriteGuildCommandsAsync(client, guildId, properties, options); | |||
| return models.Select(x => RestGuildCommand.Create(client, x, guildId)).ToImmutableArray(); | |||
| } | |||
| public static Task AddRoleAsync(BaseDiscordClient client, ulong guildId, ulong userId, ulong roleId, RequestOptions options = null) | |||
| => client.ApiClient.AddRoleAsync(guildId, userId, roleId, options); | |||
| public static Task RemoveRoleAsync(BaseDiscordClient client, ulong guildId, ulong userId, ulong roleId, RequestOptions options = null) | |||
| => client.ApiClient.RemoveRoleAsync(guildId, userId, roleId, options); | |||
| #endregion | |||
| @@ -534,7 +534,7 @@ namespace Discord.API | |||
| var bucket = new BucketIds(channelId: channelId); | |||
| return await SendAsync<ChannelThreads>("GET", () => $"channels/{channelId}/threads/active", bucket); | |||
| return await SendAsync<ChannelThreads>("GET", () => $"channels/{channelId}/threads/active", bucket, options: options); | |||
| } | |||
| public async Task<ChannelThreads> GetPublicArchivedThreadsAsync(ulong channelId, DateTimeOffset? before = null, int? limit = null, RequestOptions options = null) | |||
| @@ -609,7 +609,6 @@ namespace Discord.API | |||
| #region Stage | |||
| public async Task<StageInstance> CreateStageInstanceAsync(CreateStageInstanceParams args, RequestOptions options = null) | |||
| { | |||
| options = RequestOptions.CreateOrClone(options); | |||
| var bucket = new BucketIds(); | |||
| @@ -110,17 +110,17 @@ namespace Discord.Rest | |||
| => ClientHelper.GetWebhookAsync(this, id, options); | |||
| public Task<RestGlobalCommand> CreateGlobalCommand(ApplicationCommandProperties properties, RequestOptions options = null) | |||
| => ClientHelper.CreateGlobalApplicationCommand(this, properties, options); | |||
| => ClientHelper.CreateGlobalApplicationCommandAsync(this, properties, options); | |||
| public Task<RestGuildCommand> CreateGuildCommand(ApplicationCommandProperties properties, ulong guildId, RequestOptions options = null) | |||
| => ClientHelper.CreateGuildApplicationCommand(this, guildId, properties, options); | |||
| => ClientHelper.CreateGuildApplicationCommandAsync(this, guildId, properties, options); | |||
| public Task<IReadOnlyCollection<RestGlobalCommand>> GetGlobalApplicationCommands(RequestOptions options = null) | |||
| => ClientHelper.GetGlobalApplicationCommands(this, options); | |||
| => ClientHelper.GetGlobalApplicationCommandsAsync(this, options); | |||
| public Task<IReadOnlyCollection<RestGuildCommand>> GetGuildApplicationCommands(ulong guildId, RequestOptions options = null) | |||
| => ClientHelper.GetGuildApplicationCommands(this, guildId, options); | |||
| => ClientHelper.GetGuildApplicationCommandsAsync(this, guildId, options); | |||
| public Task<IReadOnlyCollection<RestGlobalCommand>> BulkOverwriteGlobalCommands(ApplicationCommandProperties[] commandProperties, RequestOptions options = null) | |||
| => ClientHelper.BulkOverwriteGlobalApplicationCommand(this, commandProperties, options); | |||
| => ClientHelper.BulkOverwriteGlobalApplicationCommandAsync(this, commandProperties, options); | |||
| public Task<IReadOnlyCollection<RestGuildCommand>> BulkOverwriteGuildCommands(ApplicationCommandProperties[] commandProperties, ulong guildId, RequestOptions options = null) | |||
| => ClientHelper.BulkOverwriteGuildApplicationCommand(this, guildId, commandProperties, options); | |||
| => ClientHelper.BulkOverwriteGuildApplicationCommandAsync(this, guildId, commandProperties, options); | |||
| public Task<IReadOnlyCollection<GuildApplicationCommandPermission>> BatchEditGuildCommandPermissions(ulong guildId, IDictionary<ulong, ApplicationCommandPermission[]> permissions, RequestOptions options = null) | |||
| => InteractionHelper.BatchEditGuildCommandPermissionsAsync(this, guildId, permissions, options); | |||
| public Task DeleteAllGlobalCommandsAsync(RequestOptions options = null) | |||
| @@ -231,7 +231,7 @@ namespace Discord.Rest | |||
| => await GetGlobalApplicationCommands(options).ConfigureAwait(false); | |||
| /// <inheritdoc /> | |||
| async Task<IApplicationCommand> IDiscordClient.GetGlobalApplicationCommandAsync(ulong id, RequestOptions options) | |||
| => await ClientHelper.GetGlobalApplicationCommand(this, id, options).ConfigureAwait(false); | |||
| => await ClientHelper.GetGlobalApplicationCommandAsync(this, id, options).ConfigureAwait(false); | |||
| #endregion | |||
| } | |||
| } | |||
| @@ -1,9 +1,3 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.Rest | |||
| { | |||
| /// <summary> | |||
| @@ -28,9 +22,9 @@ namespace Discord.Rest | |||
| internal StageInfo(IUser user, StagePrivacyLevel? level, string topic) | |||
| { | |||
| this.Topic = topic; | |||
| this.PrivacyLevel = level; | |||
| this.User = user; | |||
| Topic = topic; | |||
| PrivacyLevel = level; | |||
| User = user; | |||
| } | |||
| } | |||
| } | |||
| @@ -1,9 +1,4 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| using Model = Discord.API.AuditLog; | |||
| using EntryModel = Discord.API.AuditLogEntry; | |||
| @@ -1,9 +1,4 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| using Model = Discord.API.AuditLog; | |||
| using EntryModel = Discord.API.AuditLogEntry; | |||
| @@ -1,8 +1,4 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| using Model = Discord.API.AuditLog; | |||
| using EntryModel = Discord.API.AuditLogEntry; | |||
| @@ -1,10 +1,8 @@ | |||
| using Discord.API; | |||
| using Discord.API.Rest; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| using Model = Discord.API.Channel; | |||
| using StageInstance = Discord.API.StageInstance; | |||
| namespace Discord.Rest | |||
| { | |||
| @@ -25,12 +23,9 @@ namespace Discord.Rest | |||
| /// <inheritdoc/> | |||
| public bool IsLive { get; private set; } | |||
| internal RestStageChannel(BaseDiscordClient discord, IGuild guild, ulong id) | |||
| : base(discord, guild, id) | |||
| { | |||
| } | |||
| : base(discord, guild, id) { } | |||
| internal static new RestStageChannel Create(BaseDiscordClient discord, IGuild guild, Model model) | |||
| internal new static RestStageChannel Create(BaseDiscordClient discord, IGuild guild, Model model) | |||
| { | |||
| var entity = new RestStageChannel(discord, guild, model.Id); | |||
| entity.Update(model); | |||
| @@ -65,7 +60,7 @@ namespace Discord.Rest | |||
| /// <inheritdoc/> | |||
| public async Task StartStageAsync(string topic, StagePrivacyLevel privacyLevel = StagePrivacyLevel.GuildOnly, RequestOptions options = null) | |||
| { | |||
| var args = new API.Rest.CreateStageInstanceParams() | |||
| var args = new CreateStageInstanceParams | |||
| { | |||
| ChannelId = Id, | |||
| PrivacyLevel = privacyLevel, | |||
| @@ -82,7 +77,7 @@ namespace Discord.Rest | |||
| { | |||
| await Discord.ApiClient.DeleteStageInstanceAsync(Id, options); | |||
| Update(null, false); | |||
| Update(null); | |||
| } | |||
| /// <inheritdoc/> | |||
| @@ -98,7 +93,7 @@ namespace Discord.Rest | |||
| /// <inheritdoc/> | |||
| public Task RequestToSpeakAsync(RequestOptions options = null) | |||
| { | |||
| var args = new API.Rest.ModifyVoiceStateParams() | |||
| var args = new ModifyVoiceStateParams | |||
| { | |||
| ChannelId = Id, | |||
| RequestToSpeakTimestamp = DateTimeOffset.UtcNow | |||
| @@ -109,7 +104,7 @@ namespace Discord.Rest | |||
| /// <inheritdoc/> | |||
| public Task BecomeSpeakerAsync(RequestOptions options = null) | |||
| { | |||
| var args = new API.Rest.ModifyVoiceStateParams() | |||
| var args = new ModifyVoiceStateParams | |||
| { | |||
| ChannelId = Id, | |||
| Suppressed = false | |||
| @@ -120,7 +115,7 @@ namespace Discord.Rest | |||
| /// <inheritdoc/> | |||
| public Task StopSpeakingAsync(RequestOptions options = null) | |||
| { | |||
| var args = new API.Rest.ModifyVoiceStateParams() | |||
| var args = new ModifyVoiceStateParams | |||
| { | |||
| ChannelId = Id, | |||
| Suppressed = true | |||
| @@ -131,7 +126,7 @@ namespace Discord.Rest | |||
| /// <inheritdoc/> | |||
| public Task MoveToSpeakerAsync(IGuildUser user, RequestOptions options = null) | |||
| { | |||
| var args = new API.Rest.ModifyVoiceStateParams() | |||
| var args = new ModifyVoiceStateParams | |||
| { | |||
| ChannelId = Id, | |||
| Suppressed = false | |||
| @@ -143,7 +138,7 @@ namespace Discord.Rest | |||
| /// <inheritdoc/> | |||
| public Task RemoveFromSpeakerAsync(IGuildUser user, RequestOptions options = null) | |||
| { | |||
| var args = new API.Rest.ModifyVoiceStateParams() | |||
| var args = new ModifyVoiceStateParams | |||
| { | |||
| ChannelId = Id, | |||
| Suppressed = true | |||
| @@ -2,8 +2,6 @@ using System; | |||
| using System.Collections.Generic; | |||
| using System.Collections.Immutable; | |||
| using System.IO; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| using Model = Discord.API.Channel; | |||
| @@ -42,10 +40,7 @@ namespace Discord.Rest | |||
| public ulong ParentChannelId { get; private set; } | |||
| internal RestThreadChannel(BaseDiscordClient discord, IGuild guild, ulong id) | |||
| : base(discord, guild, id) | |||
| { | |||
| } | |||
| : base(discord, guild, id) { } | |||
| internal new static RestThreadChannel Create(BaseDiscordClient discord, IGuild guild, Model model) | |||
| { | |||
| @@ -66,7 +61,6 @@ namespace Discord.Rest | |||
| AutoArchiveDuration = model.ThreadMetadata.Value.AutoArchiveDuration; | |||
| ArchiveTimestamp = model.ThreadMetadata.Value.ArchiveTimestamp; | |||
| IsLocked = model.ThreadMetadata.Value.Locked.GetValueOrDefault(false); | |||
| } | |||
| MemberCount = model.MemberCount.GetValueOrDefault(0); | |||
| @@ -110,107 +104,106 @@ namespace Discord.Rest | |||
| /// <b>This method is not supported in threads.</b> | |||
| /// </remarks> | |||
| public override Task AddPermissionOverwriteAsync(IRole role, OverwritePermissions permissions, RequestOptions options = null) | |||
| => throw new NotImplementedException(); | |||
| => throw new NotSupportedException("This method is not supported in threads."); | |||
| /// <inheritdoc/> | |||
| /// <remarks> | |||
| /// <b>This method is not supported in threads.</b> | |||
| /// </remarks> | |||
| public override Task AddPermissionOverwriteAsync(IUser user, OverwritePermissions permissions, RequestOptions options = null) | |||
| => throw new NotImplementedException(); | |||
| => throw new NotSupportedException("This method is not supported in threads."); | |||
| /// <inheritdoc/> | |||
| /// <remarks> | |||
| /// <b>This method is not supported in threads.</b> | |||
| /// </remarks> | |||
| public override Task<IInviteMetadata> CreateInviteAsync(int? maxAge = 86400, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) | |||
| => throw new NotImplementedException(); | |||
| => throw new NotSupportedException("This method is not supported in threads."); | |||
| /// <inheritdoc/> | |||
| /// <remarks> | |||
| /// <b>This method is not supported in threads.</b> | |||
| /// </remarks> | |||
| public override Task<IInviteMetadata> CreateInviteToApplicationAsync(ulong applicationId, int? maxAge, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) | |||
| => throw new NotImplementedException(); | |||
| => throw new NotSupportedException("This method is not supported in threads."); | |||
| /// <inheritdoc/> | |||
| /// <remarks> | |||
| /// <b>This method is not supported in threads.</b> | |||
| /// </remarks> | |||
| public override Task<IInviteMetadata> CreateInviteToStreamAsync(IUser user, int? maxAge, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null) | |||
| => throw new NotImplementedException(); | |||
| => throw new NotSupportedException("This method is not supported in threads."); | |||
| /// <inheritdoc/> | |||
| /// <remarks> | |||
| /// <b>This method is not supported in threads.</b> | |||
| /// </remarks> | |||
| public override Task<RestWebhook> CreateWebhookAsync(string name, Stream avatar = null, RequestOptions options = null) | |||
| => throw new NotImplementedException(); | |||
| => throw new NotSupportedException("This method is not supported in threads."); | |||
| /// <inheritdoc/> | |||
| /// <remarks> | |||
| /// <b>This method is not supported in threads.</b> | |||
| /// </remarks> | |||
| public override Task<ICategoryChannel> GetCategoryAsync(RequestOptions options = null) | |||
| => throw new NotImplementedException(); | |||
| => throw new NotSupportedException("This method is not supported in threads."); | |||
| /// <inheritdoc/> | |||
| /// <remarks> | |||
| /// <b>This method is not supported in threads.</b> | |||
| /// </remarks> | |||
| public override Task<IReadOnlyCollection<IInviteMetadata>> GetInvitesAsync(RequestOptions options = null) | |||
| => throw new NotImplementedException(); | |||
| => throw new NotSupportedException("This method is not supported in threads."); | |||
| /// <inheritdoc/> | |||
| /// <remarks> | |||
| /// <b>This method is not supported in threads.</b> | |||
| /// </remarks> | |||
| public override OverwritePermissions? GetPermissionOverwrite(IRole role) | |||
| => throw new NotImplementedException(); | |||
| => throw new NotSupportedException("This method is not supported in threads."); | |||
| /// <inheritdoc/> | |||
| /// <remarks> | |||
| /// <b>This method is not supported in threads.</b> | |||
| /// </remarks> | |||
| public override OverwritePermissions? GetPermissionOverwrite(IUser user) | |||
| => throw new NotImplementedException(); | |||
| => throw new NotSupportedException("This method is not supported in threads."); | |||
| /// <inheritdoc/> | |||
| /// <remarks> | |||
| /// <b>This method is not supported in threads.</b> | |||
| /// </remarks> | |||
| public override Task<RestWebhook> GetWebhookAsync(ulong id, RequestOptions options = null) | |||
| => throw new NotImplementedException(); | |||
| => throw new NotSupportedException("This method is not supported in threads."); | |||
| /// <inheritdoc/> | |||
| /// <remarks> | |||
| /// <b>This method is not supported in threads.</b> | |||
| /// </remarks> | |||
| public override Task<IReadOnlyCollection<RestWebhook>> GetWebhooksAsync(RequestOptions options = null) | |||
| => throw new NotImplementedException(); | |||
| => throw new NotSupportedException("This method is not supported in threads."); | |||
| /// <inheritdoc/> | |||
| /// <remarks> | |||
| /// <b>This method is not supported in threads.</b> | |||
| /// </remarks> | |||
| public override Task RemovePermissionOverwriteAsync(IRole role, RequestOptions options = null) | |||
| => throw new NotImplementedException(); | |||
| => throw new NotSupportedException("This method is not supported in threads."); | |||
| /// <inheritdoc/> | |||
| /// <remarks> | |||
| /// <b>This method is not supported in threads.</b> | |||
| /// </remarks> | |||
| public override Task RemovePermissionOverwriteAsync(IUser user, RequestOptions options = null) | |||
| => throw new NotImplementedException(); | |||
| => throw new NotSupportedException("This method is not supported in threads."); | |||
| /// <inheritdoc/> | |||
| /// <remarks> | |||
| /// <b>This method is not supported in threads.</b> | |||
| /// </remarks> | |||
| public override IReadOnlyCollection<Overwrite> PermissionOverwrites | |||
| => throw new NotImplementedException(); | |||
| => throw new NotSupportedException("This method is not supported in threads."); | |||
| /// <inheritdoc/> | |||
| public Task JoinAsync(RequestOptions options = null) | |||
| => Discord.ApiClient.JoinThreadAsync(Id, options); | |||
| @@ -1,8 +1,6 @@ | |||
| using Discord.API.Rest; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| using Model = Discord.API.Channel; | |||
| @@ -14,22 +12,22 @@ namespace Discord.Rest | |||
| ThreadArchiveDuration autoArchiveDuration = ThreadArchiveDuration.OneDay, IMessage message = null, RequestOptions options = null) | |||
| { | |||
| if (autoArchiveDuration == ThreadArchiveDuration.OneWeek && !channel.Guild.Features.Contains("SEVEN_DAY_THREAD_ARCHIVE")) | |||
| throw new ArgumentException($"The guild {channel.Guild.Name} does not have the SEVEN_DAY_THREAD_ARCHIVE feature!"); | |||
| throw new ArgumentException($"The guild {channel.Guild.Name} does not have the SEVEN_DAY_THREAD_ARCHIVE feature!", nameof(autoArchiveDuration)); | |||
| if (autoArchiveDuration == ThreadArchiveDuration.ThreeDays && !channel.Guild.Features.Contains("THREE_DAY_THREAD_ARCHIVE")) | |||
| throw new ArgumentException($"The guild {channel.Guild.Name} does not have the THREE_DAY_THREAD_ARCHIVE feature!"); | |||
| throw new ArgumentException($"The guild {channel.Guild.Name} does not have the THREE_DAY_THREAD_ARCHIVE feature!", nameof(autoArchiveDuration)); | |||
| if (type == ThreadType.PrivateThread && !channel.Guild.Features.Contains("PRIVATE_THREADS")) | |||
| throw new ArgumentException($"The guild {channel.Guild.Name} does not have the PRIVATE_THREADS feature!"); | |||
| throw new ArgumentException($"The guild {channel.Guild.Name} does not have the PRIVATE_THREADS feature!", nameof(type)); | |||
| var args = new StartThreadParams() | |||
| var args = new StartThreadParams | |||
| { | |||
| Name = name, | |||
| Duration = autoArchiveDuration, | |||
| Type = type | |||
| }; | |||
| Model model = null; | |||
| Model model; | |||
| if (message != null) | |||
| model = await client.ApiClient.StartThreadAsync(channel.Id, message.Id, args, options).ConfigureAwait(false); | |||
| @@ -45,7 +43,7 @@ namespace Discord.Rest | |||
| { | |||
| var args = new TextChannelProperties(); | |||
| func(args); | |||
| var apiArgs = new API.Rest.ModifyThreadParams | |||
| var apiArgs = new ModifyThreadParams | |||
| { | |||
| Name = args.Name, | |||
| Archived = args.Archived, | |||
| @@ -63,7 +61,7 @@ namespace Discord.Rest | |||
| return users.Select(x => RestThreadUser.Create(client, channel.Guild, x, channel)).ToArray(); | |||
| } | |||
| public static async Task<RestThreadUser> GetUserAsync(ulong userdId, IThreadChannel channel, BaseDiscordClient client, RequestOptions options = null) | |||
| => (await GetUsersAsync(channel, client, options).ConfigureAwait(false)).FirstOrDefault(x => x.Id == userdId); | |||
| public static async Task<RestThreadUser> GetUserAsync(ulong userId, IThreadChannel channel, BaseDiscordClient client, RequestOptions options = null) | |||
| => (await GetUsersAsync(channel, client, options).ConfigureAwait(false)).FirstOrDefault(x => x.Id == userId); | |||
| } | |||
| } | |||
| @@ -922,7 +922,7 @@ namespace Discord.Rest | |||
| /// of application commands found within the guild. | |||
| /// </returns> | |||
| public async Task<IReadOnlyCollection<RestGuildCommand>> GetApplicationCommandsAsync (RequestOptions options = null) | |||
| => await ClientHelper.GetGuildApplicationCommands(Discord, Id, options).ConfigureAwait(false); | |||
| => await ClientHelper.GetGuildApplicationCommandsAsync(Discord, Id, options).ConfigureAwait(false); | |||
| /// <summary> | |||
| /// Gets an application command within this guild with the specified id. | |||
| /// </summary> | |||
| @@ -933,7 +933,7 @@ namespace Discord.Rest | |||
| /// if found, otherwise <see langword="null"/>. | |||
| /// </returns> | |||
| public async Task<RestGuildCommand> GetApplicationCommandAsync(ulong id, RequestOptions options = null) | |||
| => await ClientHelper.GetGuildApplicationCommand(Discord, id, Id, options); | |||
| => await ClientHelper.GetGuildApplicationCommandAsync(Discord, id, Id, options); | |||
| /// <summary> | |||
| /// Creates an application command within this guild. | |||
| /// </summary> | |||
| @@ -944,7 +944,7 @@ namespace Discord.Rest | |||
| /// </returns> | |||
| public async Task<RestGuildCommand> CreateApplicationCommandAsync(ApplicationCommandProperties properties, RequestOptions options = null) | |||
| { | |||
| var model = await InteractionHelper.CreateGuildCommand(Discord, Id, properties, options); | |||
| var model = await InteractionHelper.CreateGuildCommandAsync(Discord, Id, properties, options); | |||
| return RestGuildCommand.Create(Discord, model, Id); | |||
| } | |||
| @@ -959,7 +959,7 @@ namespace Discord.Rest | |||
| public async Task<IReadOnlyCollection<RestGuildCommand>> BulkOverwriteApplicationCommandsAsync(ApplicationCommandProperties[] properties, | |||
| RequestOptions options = null) | |||
| { | |||
| var models = await InteractionHelper.BulkOverwriteGuildCommands(Discord, Id, properties, options); | |||
| var models = await InteractionHelper.BulkOverwriteGuildCommandsAsync(Discord, Id, properties, options); | |||
| return models.Select(x => RestGuildCommand.Create(Discord, x, Id)).ToImmutableArray(); | |||
| } | |||
| @@ -4,6 +4,7 @@ using Discord.Net; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Net; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.Rest | |||
| @@ -13,15 +14,15 @@ namespace Discord.Rest | |||
| #region InteractionHelper | |||
| public static Task DeleteAllGuildCommandsAsync(BaseDiscordClient client, ulong guildId, RequestOptions options = null) | |||
| { | |||
| return client.ApiClient.BulkOverwriteGuildApplicationCommandsAsync(guildId, new CreateApplicationCommandParams[0], options); | |||
| return client.ApiClient.BulkOverwriteGuildApplicationCommandsAsync(guildId, Array.Empty<CreateApplicationCommandParams>(), options); | |||
| } | |||
| public static Task DeleteAllGlobalCommandsAsync(BaseDiscordClient client, RequestOptions options = null) | |||
| { | |||
| return client.ApiClient.BulkOverwriteGlobalApplicationCommandsAsync(new CreateApplicationCommandParams[0], options); | |||
| return client.ApiClient.BulkOverwriteGlobalApplicationCommandsAsync(Array.Empty<CreateApplicationCommandParams>(), options); | |||
| } | |||
| public static Task SendInteractionResponse(BaseDiscordClient client, InteractionResponse response, | |||
| public static Task SendInteractionResponseAsync(BaseDiscordClient client, InteractionResponse response, | |||
| ulong interactionId, string interactionToken, RequestOptions options = null) | |||
| { | |||
| return client.ApiClient.CreateInteractionResponseAsync(response, interactionId, interactionToken, options); | |||
| @@ -39,7 +40,7 @@ namespace Discord.Rest | |||
| { | |||
| var model = await client.ApiClient.CreateInteractionFollowupMessageAsync(args, token, options).ConfigureAwait(false); | |||
| RestFollowupMessage entity = RestFollowupMessage.Create(client, model, token, channel); | |||
| var entity = RestFollowupMessage.Create(client, model, token, channel); | |||
| return entity; | |||
| } | |||
| #endregion | |||
| @@ -50,22 +51,21 @@ namespace Discord.Rest | |||
| { | |||
| var model = await client.ApiClient.GetGlobalApplicationCommandAsync(id, options).ConfigureAwait(false); | |||
| return RestGlobalCommand.Create(client, model); | |||
| } | |||
| public static Task<ApplicationCommand> CreateGlobalCommand<TArg>(BaseDiscordClient client, | |||
| public static Task<ApplicationCommand> CreateGlobalCommandAsync<TArg>(BaseDiscordClient client, | |||
| Action<TArg> func, RequestOptions options = null) where TArg : ApplicationCommandProperties | |||
| { | |||
| var args = Activator.CreateInstance(typeof(TArg)); | |||
| func((TArg)args); | |||
| return CreateGlobalCommand(client, (TArg)args, options); | |||
| return CreateGlobalCommandAsync(client, (TArg)args, options); | |||
| } | |||
| public static async Task<ApplicationCommand> CreateGlobalCommand(BaseDiscordClient client, | |||
| public static async Task<ApplicationCommand> CreateGlobalCommandAsync(BaseDiscordClient client, | |||
| ApplicationCommandProperties arg, RequestOptions options = null) | |||
| { | |||
| Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); | |||
| var model = new CreateApplicationCommandParams() | |||
| var model = new CreateApplicationCommandParams | |||
| { | |||
| Name = arg.Name.Value, | |||
| Type = arg.Type, | |||
| @@ -81,25 +81,25 @@ namespace Discord.Rest | |||
| model.Description = slashProps.Description.Value; | |||
| model.Options = slashProps.Options.IsSpecified | |||
| ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() | |||
| : Optional<Discord.API.ApplicationCommandOption[]>.Unspecified; | |||
| ? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() | |||
| : Optional<ApplicationCommandOption[]>.Unspecified; | |||
| } | |||
| return await client.ApiClient.CreateGlobalApplicationCommandAsync(model, options).ConfigureAwait(false); | |||
| } | |||
| public static async Task<ApplicationCommand[]> BulkOverwriteGlobalCommands(BaseDiscordClient client, | |||
| public static async Task<ApplicationCommand[]> BulkOverwriteGlobalCommandsAsync(BaseDiscordClient client, | |||
| ApplicationCommandProperties[] args, RequestOptions options = null) | |||
| { | |||
| Preconditions.NotNull(args, nameof(args)); | |||
| List<CreateApplicationCommandParams> models = new List<CreateApplicationCommandParams>(); | |||
| var models = new List<CreateApplicationCommandParams>(); | |||
| foreach (var arg in args) | |||
| { | |||
| Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); | |||
| var model = new CreateApplicationCommandParams() | |||
| var model = new CreateApplicationCommandParams | |||
| { | |||
| Name = arg.Name.Value, | |||
| Type = arg.Type, | |||
| @@ -115,28 +115,28 @@ namespace Discord.Rest | |||
| model.Description = slashProps.Description.Value; | |||
| model.Options = slashProps.Options.IsSpecified | |||
| ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() | |||
| : Optional<Discord.API.ApplicationCommandOption[]>.Unspecified; | |||
| ? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() | |||
| : Optional<ApplicationCommandOption[]>.Unspecified; | |||
| } | |||
| models.Add(model); | |||
| } | |||
| return await client.ApiClient.BulkOverwriteGlobalApplicationCommandsAsync(models.ToArray(), options).ConfigureAwait(false); | |||
| return await client.ApiClient.BulkOverwriteGlobalApplicationCommandsAsync(models.ToArray(), options).ConfigureAwait(false); | |||
| } | |||
| public static async Task<IReadOnlyCollection<ApplicationCommand>> BulkOverwriteGuildCommands(BaseDiscordClient client, ulong guildId, | |||
| public static async Task<IReadOnlyCollection<ApplicationCommand>> BulkOverwriteGuildCommandsAsync(BaseDiscordClient client, ulong guildId, | |||
| ApplicationCommandProperties[] args, RequestOptions options = null) | |||
| { | |||
| Preconditions.NotNull(args, nameof(args)); | |||
| List<CreateApplicationCommandParams> models = new List<CreateApplicationCommandParams>(); | |||
| var models = new List<CreateApplicationCommandParams>(); | |||
| foreach (var arg in args) | |||
| { | |||
| Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); | |||
| var model = new CreateApplicationCommandParams() | |||
| var model = new CreateApplicationCommandParams | |||
| { | |||
| Name = arg.Name.Value, | |||
| Type = arg.Type, | |||
| @@ -152,8 +152,8 @@ namespace Discord.Rest | |||
| model.Description = slashProps.Description.Value; | |||
| model.Options = slashProps.Options.IsSpecified | |||
| ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() | |||
| : Optional<Discord.API.ApplicationCommandOption[]>.Unspecified; | |||
| ? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() | |||
| : Optional<ApplicationCommandOption[]>.Unspecified; | |||
| } | |||
| models.Add(model); | |||
| @@ -180,15 +180,15 @@ namespace Discord.Rest | |||
| } | |||
| } | |||
| public static Task<ApplicationCommand> ModifyGlobalCommand<TArg>(BaseDiscordClient client, IApplicationCommand command, | |||
| public static Task<ApplicationCommand> ModifyGlobalCommandAsync<TArg>(BaseDiscordClient client, IApplicationCommand command, | |||
| Action<TArg> func, RequestOptions options = null) where TArg : ApplicationCommandProperties | |||
| { | |||
| var arg = GetApplicationCommandProperties<TArg>(command); | |||
| func(arg); | |||
| return ModifyGlobalCommand(client, command, arg, options); | |||
| return ModifyGlobalCommandAsync(client, command, arg, options); | |||
| } | |||
| public static async Task<ApplicationCommand> ModifyGlobalCommand(BaseDiscordClient client, IApplicationCommand command, | |||
| public static async Task<ApplicationCommand> ModifyGlobalCommandAsync(BaseDiscordClient client, IApplicationCommand command, | |||
| ApplicationCommandProperties args, RequestOptions options = null) | |||
| { | |||
| if (args.Name.IsSpecified) | |||
| @@ -197,7 +197,7 @@ namespace Discord.Rest | |||
| Preconditions.AtLeast(args.Name.Value.Length, 1, nameof(args.Name)); | |||
| } | |||
| var model = new Discord.API.Rest.ModifyApplicationCommandParams() | |||
| var model = new ModifyApplicationCommandParams | |||
| { | |||
| Name = args.Name, | |||
| DefaultPermission = args.DefaultPermission.IsSpecified | |||
| @@ -205,7 +205,7 @@ namespace Discord.Rest | |||
| : Optional<bool>.Unspecified | |||
| }; | |||
| if(args is SlashCommandProperties slashProps) | |||
| if (args is SlashCommandProperties slashProps) | |||
| { | |||
| if (slashProps.Description.IsSpecified) | |||
| { | |||
| @@ -222,15 +222,14 @@ namespace Discord.Rest | |||
| model.Description = slashProps.Description; | |||
| model.Options = slashProps.Options.IsSpecified | |||
| ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() | |||
| : Optional<Discord.API.ApplicationCommandOption[]>.Unspecified; | |||
| ? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() | |||
| : Optional<ApplicationCommandOption[]>.Unspecified; | |||
| } | |||
| return await client.ApiClient.ModifyGlobalApplicationCommandAsync(model, command.Id, options).ConfigureAwait(false); | |||
| } | |||
| public static async Task DeleteGlobalCommand(BaseDiscordClient client, IApplicationCommand command, RequestOptions options = null) | |||
| public static async Task DeleteGlobalCommandAsync(BaseDiscordClient client, IApplicationCommand command, RequestOptions options = null) | |||
| { | |||
| Preconditions.NotNull(command, nameof(command)); | |||
| Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); | |||
| @@ -240,18 +239,18 @@ namespace Discord.Rest | |||
| #endregion | |||
| #region Guild Commands | |||
| public static Task<ApplicationCommand> CreateGuildCommand<TArg>(BaseDiscordClient client, ulong guildId, | |||
| public static Task<ApplicationCommand> CreateGuildCommandAsync<TArg>(BaseDiscordClient client, ulong guildId, | |||
| Action<TArg> func, RequestOptions options) where TArg : ApplicationCommandProperties | |||
| { | |||
| var args = Activator.CreateInstance(typeof(TArg)); | |||
| func((TArg)args); | |||
| return CreateGuildCommand(client, guildId, (TArg)args, options); | |||
| return CreateGuildCommandAsync(client, guildId, (TArg)args, options); | |||
| } | |||
| public static async Task<ApplicationCommand> CreateGuildCommand(BaseDiscordClient client, ulong guildId, | |||
| public static async Task<ApplicationCommand> CreateGuildCommandAsync(BaseDiscordClient client, ulong guildId, | |||
| ApplicationCommandProperties arg, RequestOptions options = null) | |||
| { | |||
| var model = new CreateApplicationCommandParams() | |||
| var model = new CreateApplicationCommandParams | |||
| { | |||
| Name = arg.Name.Value, | |||
| Type = arg.Type, | |||
| @@ -267,25 +266,25 @@ namespace Discord.Rest | |||
| model.Description = slashProps.Description.Value; | |||
| model.Options = slashProps.Options.IsSpecified | |||
| ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() | |||
| : Optional<Discord.API.ApplicationCommandOption[]>.Unspecified; | |||
| ? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() | |||
| : Optional<ApplicationCommandOption[]>.Unspecified; | |||
| } | |||
| return await client.ApiClient.CreateGuildApplicationCommandAsync(model, guildId, options).ConfigureAwait(false); | |||
| } | |||
| public static Task<ApplicationCommand> ModifyGuildCommand<TArg>(BaseDiscordClient client, IApplicationCommand command, ulong guildId, | |||
| public static Task<ApplicationCommand> ModifyGuildCommandAsync<TArg>(BaseDiscordClient client, IApplicationCommand command, ulong guildId, | |||
| Action<TArg> func, RequestOptions options = null) where TArg : ApplicationCommandProperties | |||
| { | |||
| var arg = GetApplicationCommandProperties<TArg>(command); | |||
| func(arg); | |||
| return ModifyGuildCommand(client, command, guildId, arg, options); | |||
| return ModifyGuildCommandAsync(client, command, guildId, arg, options); | |||
| } | |||
| public static async Task<ApplicationCommand> ModifyGuildCommand(BaseDiscordClient client, IApplicationCommand command, ulong guildId, | |||
| public static async Task<ApplicationCommand> ModifyGuildCommandAsync(BaseDiscordClient client, IApplicationCommand command, ulong guildId, | |||
| ApplicationCommandProperties arg, RequestOptions options = null) | |||
| { | |||
| var model = new ModifyApplicationCommandParams() | |||
| var model = new ModifyApplicationCommandParams | |||
| { | |||
| Name = arg.Name, | |||
| DefaultPermission = arg.DefaultPermission.IsSpecified | |||
| @@ -300,14 +299,14 @@ namespace Discord.Rest | |||
| model.Description = slashProps.Description.Value; | |||
| model.Options = slashProps.Options.IsSpecified | |||
| ? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() | |||
| : Optional<Discord.API.ApplicationCommandOption[]>.Unspecified; | |||
| ? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray() | |||
| : Optional<ApplicationCommandOption[]>.Unspecified; | |||
| } | |||
| return await client.ApiClient.ModifyGuildApplicationCommandAsync(model, guildId, command.Id, options).ConfigureAwait(false); | |||
| } | |||
| public static async Task DeleteGuildCommand(BaseDiscordClient client, ulong guildId, IApplicationCommand command, RequestOptions options = null) | |||
| public static async Task DeleteGuildCommandAsync(BaseDiscordClient client, ulong guildId, IApplicationCommand command, RequestOptions options = null) | |||
| { | |||
| Preconditions.NotNull(command, nameof(command)); | |||
| Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); | |||
| @@ -315,21 +314,16 @@ namespace Discord.Rest | |||
| await client.ApiClient.DeleteGuildApplicationCommandAsync(guildId, command.Id, options).ConfigureAwait(false); | |||
| } | |||
| public static Task DeleteUnknownApplicationCommand(BaseDiscordClient client, ulong? guildId, IApplicationCommand command, RequestOptions options = null) | |||
| public static Task DeleteUnknownApplicationCommandAsync(BaseDiscordClient client, ulong? guildId, IApplicationCommand command, RequestOptions options = null) | |||
| { | |||
| if (guildId.HasValue) | |||
| { | |||
| return DeleteGuildCommand(client, guildId.Value, command, options); | |||
| } | |||
| else | |||
| { | |||
| return DeleteGlobalCommand(client, command, options); | |||
| } | |||
| return guildId.HasValue | |||
| ? DeleteGuildCommandAsync(client, guildId.Value, command, options) | |||
| : DeleteGlobalCommandAsync(client, command, options); | |||
| } | |||
| #endregion | |||
| #region Responses | |||
| public static async Task<Discord.API.Message> ModifyFollowupMessage(BaseDiscordClient client, RestFollowupMessage message, Action<MessageProperties> func, | |||
| public static async Task<Message> ModifyFollowupMessageAsync(BaseDiscordClient client, RestFollowupMessage message, Action<MessageProperties> func, | |||
| RequestOptions options = null) | |||
| { | |||
| var args = new MessageProperties(); | |||
| @@ -359,21 +353,19 @@ namespace Discord.Rest | |||
| Preconditions.AtMost(apiEmbeds?.Count ?? 0, 10, nameof(args.Embeds), "A max of 10 embeds are allowed."); | |||
| var apiArgs = new API.Rest.ModifyInteractionResponseParams | |||
| var apiArgs = new ModifyInteractionResponseParams | |||
| { | |||
| Content = args.Content, | |||
| Embeds = apiEmbeds?.ToArray() ?? Optional<API.Embed[]>.Unspecified, | |||
| AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional<API.AllowedMentions>.Unspecified, | |||
| Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional<API.ActionRowComponent[]>.Unspecified, | |||
| Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional<API.ActionRowComponent[]>.Unspecified | |||
| }; | |||
| return await client.ApiClient.ModifyInteractionFollowupMessageAsync(apiArgs, message.Id, message.Token, options).ConfigureAwait(false); | |||
| } | |||
| public static async Task DeleteFollowupMessage(BaseDiscordClient client, RestFollowupMessage message, RequestOptions options = null) | |||
| public static async Task DeleteFollowupMessageAsync(BaseDiscordClient client, RestFollowupMessage message, RequestOptions options = null) | |||
| => await client.ApiClient.DeleteInteractionFollowupMessageAsync(message.Id, message.Token, options); | |||
| public static async Task<Message> ModifyInteractionResponse(BaseDiscordClient client, string token, Action<MessageProperties> func, | |||
| public static async Task<Message> ModifyInteractionResponseAsync(BaseDiscordClient client, string token, Action<MessageProperties> func, | |||
| RequestOptions options = null) | |||
| { | |||
| var args = new MessageProperties(); | |||
| @@ -415,25 +407,24 @@ namespace Discord.Rest | |||
| return await client.ApiClient.ModifyInteractionResponseAsync(apiArgs, token, options).ConfigureAwait(false); | |||
| } | |||
| public static async Task DeletedInteractionResponse(BaseDiscordClient client, RestInteractionMessage message, RequestOptions options = null) | |||
| public static async Task DeleteInteractionResponseAsync(BaseDiscordClient client, RestInteractionMessage message, RequestOptions options = null) | |||
| => await client.ApiClient.DeleteInteractionFollowupMessageAsync(message.Id, message.Token, options); | |||
| public static Task SendAutocompleteResult(BaseDiscordClient client, IEnumerable<AutocompleteResult> result, ulong interactionId, | |||
| public static Task SendAutocompleteResultAsync(BaseDiscordClient client, IEnumerable<AutocompleteResult> result, ulong interactionId, | |||
| string interactionToken, RequestOptions options) | |||
| { | |||
| if (result == null) | |||
| result = new AutocompleteResult[0]; | |||
| result ??= Array.Empty<AutocompleteResult>(); | |||
| Preconditions.AtMost(result.Count(), 20, nameof(result), "A maximum of 20 choices are allowed!"); | |||
| var apiArgs = new InteractionResponse() | |||
| var apiArgs = new InteractionResponse | |||
| { | |||
| Type = InteractionResponseType.ApplicationCommandAutocompleteResult, | |||
| Data = new InteractionCallbackData() | |||
| Data = new InteractionCallbackData | |||
| { | |||
| Choices = result.Any() | |||
| ? result.Select(x => new API.ApplicationCommandOptionChoice() { Name = x.Name, Value = x.Value }).ToArray() | |||
| : new ApplicationCommandOptionChoice[0] | |||
| ? result.Select(x => new ApplicationCommandOptionChoice { Name = x.Name, Value = x.Value }).ToArray() | |||
| : Array.Empty<ApplicationCommandOptionChoice>() | |||
| } | |||
| }; | |||
| @@ -448,7 +439,7 @@ namespace Discord.Rest | |||
| var models = await client.ApiClient.GetGuildApplicationCommandPermissionsAsync(guildId, options); | |||
| return models.Select(x => | |||
| new GuildApplicationCommandPermission(x.Id, x.ApplicationId, guildId, x.Permissions.Select( | |||
| y => new Discord.ApplicationCommandPermission(y.Id, y.Type, y.Permission)) | |||
| y => new ApplicationCommandPermission(y.Id, y.Type, y.Permission)) | |||
| .ToArray()) | |||
| ).ToArray(); | |||
| } | |||
| @@ -464,7 +455,7 @@ namespace Discord.Rest | |||
| } | |||
| catch (HttpException x) | |||
| { | |||
| if (x.HttpCode == System.Net.HttpStatusCode.NotFound) | |||
| if (x.HttpCode == HttpStatusCode.NotFound) | |||
| return null; | |||
| throw; | |||
| } | |||
| @@ -477,11 +468,11 @@ namespace Discord.Rest | |||
| Preconditions.AtMost(args.Length, 10, nameof(args)); | |||
| Preconditions.AtLeast(args.Length, 0, nameof(args)); | |||
| List<ApplicationCommandPermissions> permissionsList = new List<ApplicationCommandPermissions>(); | |||
| var permissionsList = new List<ApplicationCommandPermissions>(); | |||
| foreach (var arg in args) | |||
| { | |||
| var permissions = new ApplicationCommandPermissions() | |||
| var permissions = new ApplicationCommandPermissions | |||
| { | |||
| Id = arg.TargetId, | |||
| Permission = arg.Permission, | |||
| @@ -491,7 +482,7 @@ namespace Discord.Rest | |||
| permissionsList.Add(permissions); | |||
| } | |||
| ModifyGuildApplicationCommandPermissionsParams model = new ModifyGuildApplicationCommandPermissionsParams() | |||
| var model = new ModifyGuildApplicationCommandPermissionsParams | |||
| { | |||
| Permissions = permissionsList.ToArray() | |||
| }; | |||
| @@ -508,16 +499,16 @@ namespace Discord.Rest | |||
| Preconditions.NotNull(args, nameof(args)); | |||
| Preconditions.NotEqual(args.Count, 0, nameof(args)); | |||
| List<ModifyGuildApplicationCommandPermissions> models = new List<ModifyGuildApplicationCommandPermissions>(); | |||
| var models = new List<ModifyGuildApplicationCommandPermissions>(); | |||
| foreach (var arg in args) | |||
| { | |||
| Preconditions.AtMost(arg.Value.Length, 10, nameof(args)); | |||
| var model = new ModifyGuildApplicationCommandPermissions() | |||
| var model = new ModifyGuildApplicationCommandPermissions | |||
| { | |||
| Id = arg.Key, | |||
| Permissions = arg.Value.Select(x => new ApplicationCommandPermissions() | |||
| Permissions = arg.Value.Select(x => new ApplicationCommandPermissions | |||
| { | |||
| Id = x.TargetId, | |||
| Permission = x.Permission, | |||
| @@ -2,7 +2,6 @@ using System; | |||
| using System.Collections.Generic; | |||
| using System.Collections.Immutable; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| using Model = Discord.API.ApplicationCommand; | |||
| @@ -38,21 +37,13 @@ namespace Discord.Rest | |||
| => SnowflakeUtils.FromSnowflake(Id); | |||
| internal RestApplicationCommand(BaseDiscordClient client, ulong id) | |||
| : base(client, id) | |||
| { | |||
| } | |||
| : base(client, id) { } | |||
| internal static RestApplicationCommand Create(BaseDiscordClient client, Model model, ulong? guildId) | |||
| { | |||
| if (guildId.HasValue) | |||
| { | |||
| return RestGuildCommand.Create(client, model, guildId.Value); | |||
| } | |||
| else | |||
| { | |||
| return RestGlobalCommand.Create(client, model); | |||
| } | |||
| return guildId.HasValue | |||
| ? RestGuildCommand.Create(client, model, guildId.Value) | |||
| : RestGlobalCommand.Create(client, model); | |||
| } | |||
| internal virtual void Update(Model model) | |||
| @@ -64,7 +55,7 @@ namespace Discord.Rest | |||
| IsDefaultPermission = model.DefaultPermissions.GetValueOrDefault(true); | |||
| Options = model.Options.IsSpecified | |||
| ? model.Options.Value.Select(x => RestApplicationCommandOption.Create(x)).ToImmutableArray() | |||
| ? model.Options.Value.Select(RestApplicationCommandOption.Create).ToImmutableArray() | |||
| : ImmutableArray.Create<RestApplicationCommandOption>(); | |||
| } | |||
| @@ -76,7 +67,7 @@ namespace Discord.Rest | |||
| { | |||
| return ModifyAsync<ApplicationCommandProperties>(func, options); | |||
| } | |||
| /// <inheritdoc/> | |||
| public abstract Task ModifyAsync<TArg>(Action<TArg> func, RequestOptions options = null) | |||
| where TArg : ApplicationCommandProperties; | |||
| @@ -1,8 +1,3 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| using Model = Discord.API.ApplicationCommandOptionChoice; | |||
| namespace Discord.Rest | |||