Skip to content
This repository was archived by the owner on Aug 28, 2019. It is now read-only.

Commit f54c4ca

Browse files
committed
Validate application command names
1 parent 65fc695 commit f54c4ca

File tree

1 file changed

+21
-5
lines changed

1 file changed

+21
-5
lines changed

discord/app_commands/commands.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@
121121

122122

123123
VALID_SLASH_COMMAND_NAME = re.compile(r'^[\w-]{1,32}$')
124+
VALID_CONTEXT_MENU_NAME = re.compile(r'^[\w\s-]{1,32}$')
124125
CAMEL_CASE_REGEX = re.compile(r'(?<!^)(?=[A-Z])')
125126

126127

@@ -136,6 +137,21 @@ def _to_kebab_case(text: str) -> str:
136137
return CAMEL_CASE_REGEX.sub('-', text).lower()
137138

138139

140+
def validate_name(name: str) -> str:
141+
match = VALID_SLASH_COMMAND_NAME.match(name)
142+
if match is None:
143+
raise ValueError('names must be between 1-32 characters')
144+
if not name.islower():
145+
raise ValueError('names must be all lower case')
146+
return name
147+
148+
149+
def validate_context_menu_name(name: str) -> str:
150+
if VALID_CONTEXT_MENU_NAME.match(name) is None:
151+
raise ValueError('context menu names must be between 1-32 characters')
152+
return name
153+
154+
139155
def _validate_auto_complete_callback(
140156
callback: AutocompleteCallback[GroupT, ChoiceT]
141157
) -> AutocompleteCallback[GroupT, ChoiceT]:
@@ -342,7 +358,7 @@ def __init__(
342358
parent: Optional[Group] = None,
343359
guild_ids: Optional[List[int]] = None,
344360
):
345-
self.name: str = name
361+
self.name: str = validate_name(name)
346362
self.description: str = description
347363
self._attr: Optional[str] = None
348364
self._callback: CommandCallback[GroupT, P, T] = callback
@@ -591,7 +607,7 @@ def __init__(
591607
callback: ContextMenuCallback,
592608
type: AppCommandType,
593609
):
594-
self.name: str = name
610+
self.name: str = validate_context_menu_name(name)
595611
self._callback: ContextMenuCallback = callback
596612
self.type: AppCommandType = type
597613
(param, annotation, actual_type) = _get_context_menu_parameter(callback)
@@ -673,9 +689,9 @@ def __init_subclass__(cls, *, name: str = MISSING, description: str = MISSING) -
673689
raise TypeError('groups cannot have more than 25 commands')
674690

675691
if name is MISSING:
676-
cls.__discord_app_commands_group_name__ = _to_kebab_case(cls.__name__)
692+
cls.__discord_app_commands_group_name__ = validate_name(_to_kebab_case(cls.__name__))
677693
else:
678-
cls.__discord_app_commands_group_name__ = name
694+
cls.__discord_app_commands_group_name__ = validate_name(name)
679695

680696
if description is MISSING:
681697
if cls.__doc__ is None:
@@ -694,7 +710,7 @@ def __init__(
694710
guild_ids: Optional[List[int]] = None,
695711
):
696712
cls = self.__class__
697-
self.name: str = name if name is not MISSING else cls.__discord_app_commands_group_name__
713+
self.name: str = validate_name(name) if name is not MISSING else cls.__discord_app_commands_group_name__
698714
self.description: str = description or cls.__discord_app_commands_group_description__
699715
self._attr: Optional[str] = None
700716
self._guild_ids: Optional[List[int]] = guild_ids

0 commit comments

Comments
 (0)