121121
122122
123123VALID_SLASH_COMMAND_NAME = re .compile (r'^[\w-]{1,32}$' )
124+ VALID_CONTEXT_MENU_NAME = re .compile (r'^[\w\s-]{1,32}$' )
124125CAMEL_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+
139155def _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