* implement max/min length fields for ApplicationCommandOption * fix badly formed xml commentstags/3.8.0
| @@ -81,6 +81,16 @@ namespace Discord | |||||
| /// </summary> | /// </summary> | ||||
| public double? MaxValue { get; set; } | public double? MaxValue { get; set; } | ||||
| /// <summary> | |||||
| /// Gets or sets the minimum allowed length for a string input. | |||||
| /// </summary> | |||||
| public int? MinLength { get; set; } | |||||
| /// <summary> | |||||
| /// Gets or sets the maximum allowed length for a string input. | |||||
| /// </summary> | |||||
| public int? MaxLength { get; set; } | |||||
| /// <summary> | /// <summary> | ||||
| /// Gets or sets the choices for string and int types for the user to pick from. | /// Gets or sets the choices for string and int types for the user to pick from. | ||||
| /// </summary> | /// </summary> | ||||
| @@ -47,6 +47,16 @@ namespace Discord | |||||
| /// </summary> | /// </summary> | ||||
| double? MaxValue { get; } | double? MaxValue { get; } | ||||
| /// <summary> | |||||
| /// Gets the minimum allowed length for a string input. | |||||
| /// </summary> | |||||
| int? MinLength { get; } | |||||
| /// <summary> | |||||
| /// Gets the maximum allowed length for a string input. | |||||
| /// </summary> | |||||
| int? MaxLength { get; } | |||||
| /// <summary> | /// <summary> | ||||
| /// Gets the choices for string and int types for the user to pick from. | /// Gets the choices for string and int types for the user to pick from. | ||||
| /// </summary> | /// </summary> | ||||
| @@ -196,7 +196,7 @@ namespace Discord | |||||
| /// <returns>The current builder.</returns> | /// <returns>The current builder.</returns> | ||||
| public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType type, | public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType type, | ||||
| string description, bool? isRequired = null, bool? isDefault = null, bool isAutocomplete = false, double? minValue = null, double? maxValue = null, | string description, bool? isRequired = null, bool? isDefault = null, bool isAutocomplete = false, double? minValue = null, double? maxValue = null, | ||||
| List<SlashCommandOptionBuilder> options = null, List<ChannelType> channelTypes = null, params ApplicationCommandOptionChoiceProperties[] choices) | |||||
| int? minLength = null, int? maxLength = null, List<SlashCommandOptionBuilder> options = null, List<ChannelType> channelTypes = null, params ApplicationCommandOptionChoiceProperties[] choices) | |||||
| { | { | ||||
| Preconditions.Options(name, description); | Preconditions.Options(name, description); | ||||
| @@ -222,6 +222,8 @@ namespace Discord | |||||
| ChannelTypes = channelTypes, | ChannelTypes = channelTypes, | ||||
| MinValue = minValue, | MinValue = minValue, | ||||
| MaxValue = maxValue, | MaxValue = maxValue, | ||||
| MinLength = minLength, | |||||
| MaxLength = maxLength, | |||||
| }; | }; | ||||
| return AddOption(option); | return AddOption(option); | ||||
| @@ -354,6 +356,16 @@ namespace Discord | |||||
| /// </summary> | /// </summary> | ||||
| public double? MaxValue { get; set; } | public double? MaxValue { get; set; } | ||||
| /// <summary> | |||||
| /// Gets or sets the minimum allowed length for a string input. | |||||
| /// </summary> | |||||
| public int? MinLength { get; set; } | |||||
| /// <summary> | |||||
| /// Gets or sets the maximum allowed length for a string input. | |||||
| /// </summary> | |||||
| public int? MaxLength { get; set; } | |||||
| /// <summary> | /// <summary> | ||||
| /// Gets or sets the choices for string and int types for the user to pick from. | /// Gets or sets the choices for string and int types for the user to pick from. | ||||
| /// </summary> | /// </summary> | ||||
| @@ -377,6 +389,7 @@ namespace Discord | |||||
| { | { | ||||
| bool isSubType = Type == ApplicationCommandOptionType.SubCommandGroup; | bool isSubType = Type == ApplicationCommandOptionType.SubCommandGroup; | ||||
| bool isIntType = Type == ApplicationCommandOptionType.Integer; | bool isIntType = Type == ApplicationCommandOptionType.Integer; | ||||
| bool isStrType = Type == ApplicationCommandOptionType.String; | |||||
| if (isSubType && (Options == null || !Options.Any())) | if (isSubType && (Options == null || !Options.Any())) | ||||
| throw new InvalidOperationException("SubCommands/SubCommandGroups must have at least one option"); | throw new InvalidOperationException("SubCommands/SubCommandGroups must have at least one option"); | ||||
| @@ -390,6 +403,12 @@ namespace Discord | |||||
| if (isIntType && MaxValue != null && MaxValue % 1 != 0) | if (isIntType && MaxValue != null && MaxValue % 1 != 0) | ||||
| throw new InvalidOperationException("MaxValue cannot have decimals on Integer command options."); | throw new InvalidOperationException("MaxValue cannot have decimals on Integer command options."); | ||||
| if(isStrType && MinLength is not null && MinLength < 0) | |||||
| throw new InvalidOperationException("MinLength cannot be smaller than 0."); | |||||
| if (isStrType && MaxLength is not null && MaxLength < 1) | |||||
| throw new InvalidOperationException("MaxLength cannot be smaller than 1."); | |||||
| return new ApplicationCommandOptionProperties | return new ApplicationCommandOptionProperties | ||||
| { | { | ||||
| Name = Name, | Name = Name, | ||||
| @@ -404,7 +423,9 @@ namespace Discord | |||||
| IsAutocomplete = IsAutocomplete, | IsAutocomplete = IsAutocomplete, | ||||
| ChannelTypes = ChannelTypes, | ChannelTypes = ChannelTypes, | ||||
| MinValue = MinValue, | MinValue = MinValue, | ||||
| MaxValue = MaxValue | |||||
| MaxValue = MaxValue, | |||||
| MinLength = MinLength, | |||||
| MaxLength = MaxLength, | |||||
| }; | }; | ||||
| } | } | ||||
| @@ -425,7 +446,7 @@ namespace Discord | |||||
| /// <returns>The current builder.</returns> | /// <returns>The current builder.</returns> | ||||
| public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOptionType type, | public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOptionType type, | ||||
| string description, bool? isRequired = null, bool isDefault = false, bool isAutocomplete = false, double? minValue = null, double? maxValue = null, | string description, bool? isRequired = null, bool isDefault = false, bool isAutocomplete = false, double? minValue = null, double? maxValue = null, | ||||
| List<SlashCommandOptionBuilder> options = null, List<ChannelType> channelTypes = null, params ApplicationCommandOptionChoiceProperties[] choices) | |||||
| int? minLength = null, int? maxLength = null, List<SlashCommandOptionBuilder> options = null, List<ChannelType> channelTypes = null, params ApplicationCommandOptionChoiceProperties[] choices) | |||||
| { | { | ||||
| Preconditions.Options(name, description); | Preconditions.Options(name, description); | ||||
| @@ -447,6 +468,8 @@ namespace Discord | |||||
| IsAutocomplete = isAutocomplete, | IsAutocomplete = isAutocomplete, | ||||
| MinValue = minValue, | MinValue = minValue, | ||||
| MaxValue = maxValue, | MaxValue = maxValue, | ||||
| MinLength = minLength, | |||||
| MaxLength = maxLength, | |||||
| Options = options, | Options = options, | ||||
| Type = type, | Type = type, | ||||
| Choices = (choices ?? Array.Empty<ApplicationCommandOptionChoiceProperties>()).ToList(), | Choices = (choices ?? Array.Empty<ApplicationCommandOptionChoiceProperties>()).ToList(), | ||||
| @@ -669,6 +692,28 @@ namespace Discord | |||||
| return this; | return this; | ||||
| } | } | ||||
| /// <summary> | |||||
| /// Sets the current builders min length field. | |||||
| /// </summary> | |||||
| /// <param name="length">The value to set.</param> | |||||
| /// <returns>The current builder.</returns> | |||||
| public SlashCommandOptionBuilder WithMinLength(int length) | |||||
| { | |||||
| MinLength = length; | |||||
| return this; | |||||
| } | |||||
| /// <summary> | |||||
| /// Sets the current builders max length field. | |||||
| /// </summary> | |||||
| /// <param name="lenght">The value to set.</param> | |||||
| /// <returns>The current builder.</returns> | |||||
| public SlashCommandOptionBuilder WithMaxLength(int lenght) | |||||
| { | |||||
| MaxLength = lenght; | |||||
| return this; | |||||
| } | |||||
| /// <summary> | /// <summary> | ||||
| /// Sets the current type of this builder. | /// Sets the current type of this builder. | ||||
| /// </summary> | /// </summary> | ||||
| @@ -0,0 +1,25 @@ | |||||
| using System; | |||||
| namespace Discord.Interactions | |||||
| { | |||||
| /// <summary> | |||||
| /// Sets the maximum length allowed for a string type parameter. | |||||
| /// </summary> | |||||
| [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)] | |||||
| public class MaxLengthAttribute : Attribute | |||||
| { | |||||
| /// <summary> | |||||
| /// Gets the maximum length allowed for a string type parameter. | |||||
| /// </summary> | |||||
| public int Length { get; } | |||||
| /// <summary> | |||||
| /// Sets the maximum length allowed for a string type parameter. | |||||
| /// </summary> | |||||
| /// <param name="lenght">Maximum string length allowed.</param> | |||||
| public MaxLengthAttribute(int lenght) | |||||
| { | |||||
| Length = lenght; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,25 @@ | |||||
| using System; | |||||
| namespace Discord.Interactions | |||||
| { | |||||
| /// <summary> | |||||
| /// Sets the minimum length allowed for a string type parameter. | |||||
| /// </summary> | |||||
| [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)] | |||||
| public class MinLengthAttribute : Attribute | |||||
| { | |||||
| /// <summary> | |||||
| /// Gets the minimum length allowed for a string type parameter. | |||||
| /// </summary> | |||||
| public int Length { get; } | |||||
| /// <summary> | |||||
| /// Sets the minimum length allowed for a string type parameter. | |||||
| /// </summary> | |||||
| /// <param name="lenght">Minimum string length allowed.</param> | |||||
| public MinLengthAttribute(int lenght) | |||||
| { | |||||
| Length = lenght; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -463,6 +463,12 @@ namespace Discord.Interactions.Builders | |||||
| case MinValueAttribute minValue: | case MinValueAttribute minValue: | ||||
| builder.MinValue = minValue.Value; | builder.MinValue = minValue.Value; | ||||
| break; | break; | ||||
| case MinLengthAttribute minLength: | |||||
| builder.MinLength = minLength.Length; | |||||
| break; | |||||
| case MaxLengthAttribute maxLength: | |||||
| builder.MaxLength = maxLength.Length; | |||||
| break; | |||||
| case ComplexParameterAttribute complexParameter: | case ComplexParameterAttribute complexParameter: | ||||
| { | { | ||||
| builder.IsComplexParameter = true; | builder.IsComplexParameter = true; | ||||
| @@ -28,6 +28,16 @@ namespace Discord.Interactions.Builders | |||||
| /// </summary> | /// </summary> | ||||
| public double? MinValue { get; set; } | public double? MinValue { get; set; } | ||||
| /// <summary> | |||||
| /// Gets or sets the minimum length allowed for a string type parameter. | |||||
| /// </summary> | |||||
| public int? MinLength { get; set; } | |||||
| /// <summary> | |||||
| /// Gets or sets the maximum length allowed for a string type parameter. | |||||
| /// </summary> | |||||
| public int? MaxLength { get; set; } | |||||
| /// <summary> | /// <summary> | ||||
| /// Gets a collection of the choices of this command. | /// Gets a collection of the choices of this command. | ||||
| /// </summary> | /// </summary> | ||||
| @@ -125,6 +135,32 @@ namespace Discord.Interactions.Builders | |||||
| return this; | return this; | ||||
| } | } | ||||
| /// <summary> | |||||
| /// Sets <see cref="MinLength"/>. | |||||
| /// </summary> | |||||
| /// <param name="length">New value of the <see cref="MinLength"/>.</param> | |||||
| /// <returns> | |||||
| /// The builder instance. | |||||
| /// </returns> | |||||
| public SlashCommandParameterBuilder WithMinLength(int length) | |||||
| { | |||||
| MinLength = length; | |||||
| return this; | |||||
| } | |||||
| /// <summary> | |||||
| /// Sets <see cref="MaxLength"/>. | |||||
| /// </summary> | |||||
| /// <param name="length">New value of the <see cref="MaxLength"/>.</param> | |||||
| /// <returns> | |||||
| /// The builder instance. | |||||
| /// </returns> | |||||
| public SlashCommandParameterBuilder WithMaxLength(int length) | |||||
| { | |||||
| MaxLength = length; | |||||
| return this; | |||||
| } | |||||
| /// <summary> | /// <summary> | ||||
| /// Adds parameter choices to <see cref="Choices"/>. | /// Adds parameter choices to <see cref="Choices"/>. | ||||
| /// </summary> | /// </summary> | ||||
| @@ -38,6 +38,16 @@ namespace Discord.Interactions | |||||
| /// </summary> | /// </summary> | ||||
| public double? MaxValue { get; } | public double? MaxValue { get; } | ||||
| /// <summary> | |||||
| /// Gets the minimum length allowed for a string type parameter. | |||||
| /// </summary> | |||||
| public int? MinLength { get; } | |||||
| /// <summary> | |||||
| /// Gets the maximum length allowed for a string type parameter. | |||||
| /// </summary> | |||||
| public int? MaxLength { get; } | |||||
| /// <summary> | /// <summary> | ||||
| /// Gets the <see cref="TypeConverter{T}"/> that will be used to convert the incoming <see cref="Discord.WebSocket.SocketSlashCommandDataOption"/> into | /// Gets the <see cref="TypeConverter{T}"/> that will be used to convert the incoming <see cref="Discord.WebSocket.SocketSlashCommandDataOption"/> into | ||||
| /// <see cref="CommandParameterInfo.ParameterType"/>. | /// <see cref="CommandParameterInfo.ParameterType"/>. | ||||
| @@ -86,6 +96,8 @@ namespace Discord.Interactions | |||||
| Description = builder.Description; | Description = builder.Description; | ||||
| MaxValue = builder.MaxValue; | MaxValue = builder.MaxValue; | ||||
| MinValue = builder.MinValue; | MinValue = builder.MinValue; | ||||
| MinLength = builder.MinLength; | |||||
| MaxLength = builder.MaxLength; | |||||
| IsComplexParameter = builder.IsComplexParameter; | IsComplexParameter = builder.IsComplexParameter; | ||||
| IsAutocomplete = builder.Autocomplete; | IsAutocomplete = builder.Autocomplete; | ||||
| Choices = builder.Choices.ToImmutableArray(); | Choices = builder.Choices.ToImmutableArray(); | ||||
| @@ -23,7 +23,9 @@ namespace Discord.Interactions | |||||
| ChannelTypes = parameterInfo.ChannelTypes?.ToList(), | ChannelTypes = parameterInfo.ChannelTypes?.ToList(), | ||||
| IsAutocomplete = parameterInfo.IsAutocomplete, | IsAutocomplete = parameterInfo.IsAutocomplete, | ||||
| MaxValue = parameterInfo.MaxValue, | MaxValue = parameterInfo.MaxValue, | ||||
| MinValue = parameterInfo.MinValue | |||||
| MinValue = parameterInfo.MinValue, | |||||
| MinLength = parameterInfo.MinLength, | |||||
| MaxLength = parameterInfo.MaxLength, | |||||
| }; | }; | ||||
| parameterInfo.TypeConverter.Write(props, parameterInfo); | parameterInfo.TypeConverter.Write(props, parameterInfo); | ||||
| @@ -209,7 +211,13 @@ namespace Discord.Interactions | |||||
| Name = x.Name, | Name = x.Name, | ||||
| Value = x.Value | Value = x.Value | ||||
| }).ToList(), | }).ToList(), | ||||
| Options = commandOption.Options?.Select(x => x.ToApplicationCommandOptionProps()).ToList() | |||||
| Options = commandOption.Options?.Select(x => x.ToApplicationCommandOptionProps()).ToList(), | |||||
| MaxLength = commandOption.MaxLength, | |||||
| MinLength = commandOption.MinLength, | |||||
| MaxValue = commandOption.MaxValue, | |||||
| MinValue = commandOption.MinValue, | |||||
| IsAutocomplete = commandOption.IsAutocomplete.GetValueOrDefault(), | |||||
| ChannelTypes = commandOption.ChannelTypes.ToList(), | |||||
| }; | }; | ||||
| public static Modal ToModal(this ModalInfo modalInfo, string customId, Action<ModalBuilder> modifyModal = null) | public static Modal ToModal(this ModalInfo modalInfo, string customId, Action<ModalBuilder> modifyModal = null) | ||||
| @@ -38,6 +38,12 @@ namespace Discord.API | |||||
| [JsonProperty("channel_types")] | [JsonProperty("channel_types")] | ||||
| public Optional<ChannelType[]> ChannelTypes { get; set; } | public Optional<ChannelType[]> ChannelTypes { get; set; } | ||||
| [JsonProperty("min_length")] | |||||
| public Optional<int> MinLength { get; set; } | |||||
| [JsonProperty("max_length")] | |||||
| public Optional<int> MaxLength { get; set; } | |||||
| public ApplicationCommandOption() { } | public ApplicationCommandOption() { } | ||||
| public ApplicationCommandOption(IApplicationCommandOption cmd) | public ApplicationCommandOption(IApplicationCommandOption cmd) | ||||
| @@ -56,6 +62,8 @@ namespace Discord.API | |||||
| Default = cmd.IsDefault ?? Optional<bool>.Unspecified; | Default = cmd.IsDefault ?? Optional<bool>.Unspecified; | ||||
| MinValue = cmd.MinValue ?? Optional<double>.Unspecified; | MinValue = cmd.MinValue ?? Optional<double>.Unspecified; | ||||
| MaxValue = cmd.MaxValue ?? Optional<double>.Unspecified; | MaxValue = cmd.MaxValue ?? Optional<double>.Unspecified; | ||||
| MinLength = cmd.MinLength ?? Optional<int>.Unspecified; | |||||
| MaxLength = cmd.MaxLength ?? Optional<int>.Unspecified; | |||||
| Autocomplete = cmd.IsAutocomplete ?? Optional<bool>.Unspecified; | Autocomplete = cmd.IsAutocomplete ?? Optional<bool>.Unspecified; | ||||
| Name = cmd.Name; | Name = cmd.Name; | ||||
| @@ -77,6 +85,8 @@ namespace Discord.API | |||||
| Default = option.IsDefault ?? Optional<bool>.Unspecified; | Default = option.IsDefault ?? Optional<bool>.Unspecified; | ||||
| MinValue = option.MinValue ?? Optional<double>.Unspecified; | MinValue = option.MinValue ?? Optional<double>.Unspecified; | ||||
| MaxValue = option.MaxValue ?? Optional<double>.Unspecified; | MaxValue = option.MaxValue ?? Optional<double>.Unspecified; | ||||
| MinLength = option.MinLength ?? Optional<int>.Unspecified; | |||||
| MaxLength = option.MaxLength ?? Optional<int>.Unspecified; | |||||
| ChannelTypes = option.ChannelTypes?.ToArray() ?? Optional<ChannelType[]>.Unspecified; | ChannelTypes = option.ChannelTypes?.ToArray() ?? Optional<ChannelType[]>.Unspecified; | ||||
| @@ -35,6 +35,12 @@ namespace Discord.Rest | |||||
| /// <inheritdoc/> | /// <inheritdoc/> | ||||
| public double? MaxValue { get; private set; } | public double? MaxValue { get; private set; } | ||||
| /// <inheritdoc/> | |||||
| public int? MinLength { get; private set; } | |||||
| /// <inheritdoc/> | |||||
| public int? MaxLength { get; private set; } | |||||
| /// <summary> | /// <summary> | ||||
| /// Gets a collection of <see cref="RestApplicationCommandChoice"/>s for this command. | /// Gets a collection of <see cref="RestApplicationCommandChoice"/>s for this command. | ||||
| /// </summary> | /// </summary> | ||||
| @@ -78,6 +84,9 @@ namespace Discord.Rest | |||||
| if (model.Autocomplete.IsSpecified) | if (model.Autocomplete.IsSpecified) | ||||
| IsAutocomplete = model.Autocomplete.Value; | IsAutocomplete = model.Autocomplete.Value; | ||||
| MinLength = model.MinLength.ToNullable(); | |||||
| MaxLength = model.MaxLength.ToNullable(); | |||||
| Options = model.Options.IsSpecified | Options = model.Options.IsSpecified | ||||
| ? model.Options.Value.Select(Create).ToImmutableArray() | ? model.Options.Value.Select(Create).ToImmutableArray() | ||||
| : ImmutableArray.Create<RestApplicationCommandOption>(); | : ImmutableArray.Create<RestApplicationCommandOption>(); | ||||
| @@ -33,6 +33,12 @@ namespace Discord.WebSocket | |||||
| /// <inheritdoc/> | /// <inheritdoc/> | ||||
| public double? MaxValue { get; private set; } | public double? MaxValue { get; private set; } | ||||
| /// <inheritdoc/> | |||||
| public int? MinLength { get; private set; } | |||||
| /// <inheritdoc/> | |||||
| public int? MaxLength { get; private set; } | |||||
| /// <summary> | /// <summary> | ||||
| /// Gets a collection of choices for the user to pick from. | /// Gets a collection of choices for the user to pick from. | ||||
| /// </summary> | /// </summary> | ||||
| @@ -72,6 +78,9 @@ namespace Discord.WebSocket | |||||
| IsAutocomplete = model.Autocomplete.ToNullable(); | IsAutocomplete = model.Autocomplete.ToNullable(); | ||||
| MinLength = model.MinLength.ToNullable(); | |||||
| MaxLength = model.MaxLength.ToNullable(); | |||||
| Choices = model.Choices.IsSpecified | Choices = model.Choices.IsSpecified | ||||
| ? model.Choices.Value.Select(SocketApplicationCommandChoice.Create).ToImmutableArray() | ? model.Choices.Value.Select(SocketApplicationCommandChoice.Create).ToImmutableArray() | ||||
| : ImmutableArray.Create<SocketApplicationCommandChoice>(); | : ImmutableArray.Create<SocketApplicationCommandChoice>(); | ||||