From 11ece4bf169dd91cd13f49d2ce2f27b0c14bb6d6 Mon Sep 17 00:00:00 2001 From: d4n Date: Fri, 2 Sep 2022 21:47:13 -0500 Subject: [PATCH] Update app commands regex and fix localization on app context commands (#2452) Co-authored-by: Quin Lynch <49576606+quinchs@users.noreply.github.com> --- .../Interactions/ApplicationCommandOption.cs | 6 ++-- .../ApplicationCommandProperties.cs | 5 ++-- .../ContextMenus/MessageCommandBuilder.cs | 11 ++----- .../ContextMenus/UserCommandBuilder.cs | 11 ++----- .../SlashCommands/SlashCommandBuilder.cs | 29 +++++++++---------- 5 files changed, 24 insertions(+), 38 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs index bceefda32..df33cfe1d 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs @@ -145,10 +145,10 @@ namespace Discord if (name.Length > 32) throw new ArgumentOutOfRangeException(nameof(name), "Name length must be less than or equal to 32."); - if (!Regex.IsMatch(name, @"^[\w-]{1,32}$")) - throw new FormatException($"{nameof(name)} must match the regex ^[\\w-]{{1,32}}$"); + if (!Regex.IsMatch(name, @"^[-_\p{L}\p{N}\p{IsDevanagari}\p{IsThai}]{1,32}$")) + throw new ArgumentException(@"Name must match the regex ^[-_\p{L}\p{N}\p{IsDevanagari}\p{IsThai}]{1,32}$", nameof(name)); - if (name.Any(x => char.IsUpper(x))) + if (name.Any(char.IsUpper)) throw new FormatException("Name cannot contain any uppercase characters."); } diff --git a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs index 7ca16a27d..98e050df9 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs @@ -42,8 +42,9 @@ namespace Discord Preconditions.AtLeast(name.Length, 1, nameof(name)); Preconditions.AtMost(name.Length, SlashCommandBuilder.MaxNameLength, nameof(name)); - if (!Regex.IsMatch(name, @"^[\w-]{1,32}$")) - throw new ArgumentException("Option name cannot contain any special characters or whitespaces!", nameof(name)); + + if (Type == ApplicationCommandType.Slash && !Regex.IsMatch(name, @"^[-_\p{L}\p{N}\p{IsDevanagari}\p{IsThai}]{1,32}$")) + throw new ArgumentException(@"Name must match the regex ^[-_\p{L}\p{N}\p{IsDevanagari}\p{IsThai}]{1,32}$", nameof(name)); } _nameLocalizations = value; } diff --git a/src/Discord.Net.Core/Entities/Interactions/ContextMenus/MessageCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/ContextMenus/MessageCommandBuilder.cs index ed49c685d..613e30376 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ContextMenus/MessageCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ContextMenus/MessageCommandBuilder.cs @@ -67,7 +67,8 @@ namespace Discord Name = Name, IsDefaultPermission = IsDefaultPermission, IsDMEnabled = IsDMEnabled, - DefaultMemberPermissions = DefaultMemberPermissions ?? Optional.Unspecified + DefaultMemberPermissions = DefaultMemberPermissions ?? Optional.Unspecified, + NameLocalizations = NameLocalizations }; return props; @@ -157,14 +158,6 @@ namespace Discord Preconditions.NotNullOrEmpty(name, nameof(name)); Preconditions.AtLeast(name.Length, 1, nameof(name)); Preconditions.AtMost(name.Length, MaxNameLength, nameof(name)); - - // Discord updated the docs, this regex prevents special characters like @!$%(... etc, - // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand - if (!Regex.IsMatch(name, @"^[\w-]{1,32}$")) - throw new ArgumentException("Command name cannot contain any special characters or whitespaces!", nameof(name)); - - if (name.Any(x => char.IsUpper(x))) - throw new FormatException("Name cannot contain any uppercase characters."); } /// diff --git a/src/Discord.Net.Core/Entities/Interactions/ContextMenus/UserCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/ContextMenus/UserCommandBuilder.cs index d8bb2e056..8ac524582 100644 --- a/src/Discord.Net.Core/Entities/Interactions/ContextMenus/UserCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/ContextMenus/UserCommandBuilder.cs @@ -65,7 +65,8 @@ namespace Discord Name = Name, IsDefaultPermission = IsDefaultPermission, IsDMEnabled = IsDMEnabled, - DefaultMemberPermissions = DefaultMemberPermissions ?? Optional.Unspecified + DefaultMemberPermissions = DefaultMemberPermissions ?? Optional.Unspecified, + NameLocalizations = NameLocalizations }; return props; @@ -155,14 +156,6 @@ namespace Discord Preconditions.NotNullOrEmpty(name, nameof(name)); Preconditions.AtLeast(name.Length, 1, nameof(name)); Preconditions.AtMost(name.Length, MaxNameLength, nameof(name)); - - // Discord updated the docs, this regex prevents special characters like @!$%(... etc, - // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand - if (!Regex.IsMatch(name, @"^[\w-]{1,32}$")) - throw new ArgumentException("Command name cannot contain any special characters or whitespaces!", nameof(name)); - - if (name.Any(x => char.IsUpper(x))) - throw new FormatException("Name cannot contain any uppercase characters."); } /// diff --git a/src/Discord.Net.Core/Entities/Interactions/SlashCommands/SlashCommandBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/SlashCommands/SlashCommandBuilder.cs index b443c4468..1df886abe 100644 --- a/src/Discord.Net.Core/Entities/Interactions/SlashCommands/SlashCommandBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/SlashCommands/SlashCommandBuilder.cs @@ -207,10 +207,9 @@ namespace Discord { Preconditions.Options(name, description); - // Discord updated the docs, this regex prevents special characters like @!$%( and s p a c e s.. etc, - // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand - if (!Regex.IsMatch(name, @"^[\w-]{1,32}$")) - throw new ArgumentException("Command name cannot contain any special characters or whitespaces!", nameof(name)); + // https://discord.com/developers/docs/interactions/application-commands + if (!Regex.IsMatch(name, @"^[-_\p{L}\p{N}\p{IsDevanagari}\p{IsThai}]{1,32}$")) + throw new ArgumentException(@"Name must match the regex ^[-_\p{L}\p{N}\p{IsDevanagari}\p{IsThai}]{1,32}$", nameof(name)); // make sure theres only one option with default set to true if (isDefault == true && Options?.Any(x => x.IsDefault == true) == true) @@ -376,12 +375,11 @@ namespace Discord Preconditions.AtLeast(name.Length, 1, nameof(name)); Preconditions.AtMost(name.Length, MaxNameLength, nameof(name)); - // Discord updated the docs, this regex prevents special characters like @!$%(... etc, - // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand - if (!Regex.IsMatch(name, @"^[\w-]{1,32}$")) - throw new ArgumentException("Command name cannot contain any special characters or whitespaces!", nameof(name)); + // https://discord.com/developers/docs/interactions/application-commands + if (!Regex.IsMatch(name, @"^[-_\p{L}\p{N}\p{IsDevanagari}\p{IsThai}]{1,32}$")) + throw new ArgumentException(@"Name must match the regex ^[-_\p{L}\p{N}\p{IsDevanagari}\p{IsThai}]{1,32}$", nameof(name)); - if (name.Any(x => char.IsUpper(x))) + if (name.Any(char.IsUpper)) throw new FormatException("Name cannot contain any uppercase characters."); } @@ -587,10 +585,9 @@ namespace Discord { Preconditions.Options(name, description); - // Discord updated the docs, this regex prevents special characters like @!$%( and s p a c e s.. etc, - // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand - if (!Regex.IsMatch(name, @"^[\w-]{1,32}$")) - throw new ArgumentException("Command name cannot contain any special characters or whitespaces!", nameof(name)); + // https://discord.com/developers/docs/interactions/application-commands + if (!Regex.IsMatch(name, @"^[-_\p{L}\p{N}\p{IsDevanagari}\p{IsThai}]{1,32}$")) + throw new ArgumentException(@"Name must match the regex ^[-_\p{L}\p{N}\p{IsDevanagari}\p{IsThai}]{1,32}$", nameof(name)); // make sure theres only one option with default set to true if (isDefault && Options?.Any(x => x.IsDefault == true) == true) @@ -966,8 +963,10 @@ namespace Discord { Preconditions.AtLeast(name.Length, 1, nameof(name)); Preconditions.AtMost(name.Length, SlashCommandBuilder.MaxNameLength, nameof(name)); - if (!Regex.IsMatch(name, @"^[\w-]{1,32}$")) - throw new ArgumentException("Option name cannot contain any special characters or whitespaces!", nameof(name)); + + // https://discord.com/developers/docs/interactions/application-commands + if (!Regex.IsMatch(name, @"^[-_\p{L}\p{N}\p{IsDevanagari}\p{IsThai}]{1,32}$")) + throw new ArgumentException(@"Name must match the regex ^[-_\p{L}\p{N}\p{IsDevanagari}\p{IsThai}]{1,32}$", nameof(name)); } private static void EnsureValidCommandOptionDescription(string description)