* implement max/min length fields for ApplicationCommandOption * fix badly formed xml commentstags/3.8.0
| @@ -81,6 +81,16 @@ namespace Discord | |||
| /// </summary> | |||
| 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> | |||
| /// Gets or sets the choices for string and int types for the user to pick from. | |||
| /// </summary> | |||
| @@ -47,6 +47,16 @@ namespace Discord | |||
| /// </summary> | |||
| 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> | |||
| /// Gets the choices for string and int types for the user to pick from. | |||
| /// </summary> | |||
| @@ -196,7 +196,7 @@ namespace Discord | |||
| /// <returns>The current builder.</returns> | |||
| public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType type, | |||
| 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); | |||
| @@ -222,6 +222,8 @@ namespace Discord | |||
| ChannelTypes = channelTypes, | |||
| MinValue = minValue, | |||
| MaxValue = maxValue, | |||
| MinLength = minLength, | |||
| MaxLength = maxLength, | |||
| }; | |||
| return AddOption(option); | |||
| @@ -354,6 +356,16 @@ namespace Discord | |||
| /// </summary> | |||
| 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> | |||
| /// Gets or sets the choices for string and int types for the user to pick from. | |||
| /// </summary> | |||
| @@ -377,6 +389,7 @@ namespace Discord | |||
| { | |||
| bool isSubType = Type == ApplicationCommandOptionType.SubCommandGroup; | |||
| bool isIntType = Type == ApplicationCommandOptionType.Integer; | |||
| bool isStrType = Type == ApplicationCommandOptionType.String; | |||
| if (isSubType && (Options == null || !Options.Any())) | |||
| throw new InvalidOperationException("SubCommands/SubCommandGroups must have at least one option"); | |||
| @@ -390,6 +403,12 @@ namespace Discord | |||
| if (isIntType && MaxValue != null && MaxValue % 1 != 0) | |||
| 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 | |||
| { | |||
| Name = Name, | |||
| @@ -404,7 +423,9 @@ namespace Discord | |||
| IsAutocomplete = IsAutocomplete, | |||
| ChannelTypes = ChannelTypes, | |||
| MinValue = MinValue, | |||
| MaxValue = MaxValue | |||
| MaxValue = MaxValue, | |||
| MinLength = MinLength, | |||
| MaxLength = MaxLength, | |||
| }; | |||
| } | |||
| @@ -425,7 +446,7 @@ namespace Discord | |||
| /// <returns>The current builder.</returns> | |||
| public SlashCommandOptionBuilder AddOption(string name, ApplicationCommandOptionType type, | |||
| 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); | |||
| @@ -447,6 +468,8 @@ namespace Discord | |||
| IsAutocomplete = isAutocomplete, | |||
| MinValue = minValue, | |||
| MaxValue = maxValue, | |||
| MinLength = minLength, | |||
| MaxLength = maxLength, | |||
| Options = options, | |||
| Type = type, | |||
| Choices = (choices ?? Array.Empty<ApplicationCommandOptionChoiceProperties>()).ToList(), | |||
| @@ -669,6 +692,28 @@ namespace Discord | |||
| 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> | |||
| /// Sets the current type of this builder. | |||
| /// </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: | |||
| builder.MinValue = minValue.Value; | |||
| break; | |||
| case MinLengthAttribute minLength: | |||
| builder.MinLength = minLength.Length; | |||
| break; | |||
| case MaxLengthAttribute maxLength: | |||
| builder.MaxLength = maxLength.Length; | |||
| break; | |||
| case ComplexParameterAttribute complexParameter: | |||
| { | |||
| builder.IsComplexParameter = true; | |||
| @@ -28,6 +28,16 @@ namespace Discord.Interactions.Builders | |||
| /// </summary> | |||
| 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> | |||
| /// Gets a collection of the choices of this command. | |||
| /// </summary> | |||
| @@ -125,6 +135,32 @@ namespace Discord.Interactions.Builders | |||
| 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> | |||
| /// Adds parameter choices to <see cref="Choices"/>. | |||
| /// </summary> | |||
| @@ -38,6 +38,16 @@ namespace Discord.Interactions | |||
| /// </summary> | |||
| 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> | |||
| /// Gets the <see cref="TypeConverter{T}"/> that will be used to convert the incoming <see cref="Discord.WebSocket.SocketSlashCommandDataOption"/> into | |||
| /// <see cref="CommandParameterInfo.ParameterType"/>. | |||
| @@ -86,6 +96,8 @@ namespace Discord.Interactions | |||
| Description = builder.Description; | |||
| MaxValue = builder.MaxValue; | |||
| MinValue = builder.MinValue; | |||
| MinLength = builder.MinLength; | |||
| MaxLength = builder.MaxLength; | |||
| IsComplexParameter = builder.IsComplexParameter; | |||
| IsAutocomplete = builder.Autocomplete; | |||
| Choices = builder.Choices.ToImmutableArray(); | |||
| @@ -23,7 +23,9 @@ namespace Discord.Interactions | |||
| ChannelTypes = parameterInfo.ChannelTypes?.ToList(), | |||
| IsAutocomplete = parameterInfo.IsAutocomplete, | |||
| MaxValue = parameterInfo.MaxValue, | |||
| MinValue = parameterInfo.MinValue | |||
| MinValue = parameterInfo.MinValue, | |||
| MinLength = parameterInfo.MinLength, | |||
| MaxLength = parameterInfo.MaxLength, | |||
| }; | |||
| parameterInfo.TypeConverter.Write(props, parameterInfo); | |||
| @@ -209,7 +211,13 @@ namespace Discord.Interactions | |||
| Name = x.Name, | |||
| Value = x.Value | |||
| }).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) | |||
| @@ -38,6 +38,12 @@ namespace Discord.API | |||
| [JsonProperty("channel_types")] | |||
| 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(IApplicationCommandOption cmd) | |||
| @@ -56,6 +62,8 @@ namespace Discord.API | |||
| Default = cmd.IsDefault ?? Optional<bool>.Unspecified; | |||
| MinValue = cmd.MinValue ?? 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; | |||
| Name = cmd.Name; | |||
| @@ -77,6 +85,8 @@ namespace Discord.API | |||
| Default = option.IsDefault ?? Optional<bool>.Unspecified; | |||
| MinValue = option.MinValue ?? 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; | |||
| @@ -35,6 +35,12 @@ namespace Discord.Rest | |||
| /// <inheritdoc/> | |||
| public double? MaxValue { get; private set; } | |||
| /// <inheritdoc/> | |||
| public int? MinLength { get; private set; } | |||
| /// <inheritdoc/> | |||
| public int? MaxLength { get; private set; } | |||
| /// <summary> | |||
| /// Gets a collection of <see cref="RestApplicationCommandChoice"/>s for this command. | |||
| /// </summary> | |||
| @@ -78,6 +84,9 @@ namespace Discord.Rest | |||
| if (model.Autocomplete.IsSpecified) | |||
| IsAutocomplete = model.Autocomplete.Value; | |||
| MinLength = model.MinLength.ToNullable(); | |||
| MaxLength = model.MaxLength.ToNullable(); | |||
| Options = model.Options.IsSpecified | |||
| ? model.Options.Value.Select(Create).ToImmutableArray() | |||
| : ImmutableArray.Create<RestApplicationCommandOption>(); | |||
| @@ -33,6 +33,12 @@ namespace Discord.WebSocket | |||
| /// <inheritdoc/> | |||
| public double? MaxValue { get; private set; } | |||
| /// <inheritdoc/> | |||
| public int? MinLength { get; private set; } | |||
| /// <inheritdoc/> | |||
| public int? MaxLength { get; private set; } | |||
| /// <summary> | |||
| /// Gets a collection of choices for the user to pick from. | |||
| /// </summary> | |||
| @@ -72,6 +78,9 @@ namespace Discord.WebSocket | |||
| IsAutocomplete = model.Autocomplete.ToNullable(); | |||
| MinLength = model.MinLength.ToNullable(); | |||
| MaxLength = model.MaxLength.ToNullable(); | |||
| Choices = model.Choices.IsSpecified | |||
| ? model.Choices.Value.Select(SocketApplicationCommandChoice.Create).ToImmutableArray() | |||
| : ImmutableArray.Create<SocketApplicationCommandChoice>(); | |||