@@ -386,6 +386,7 @@ def __init__(
386386 self ._component_callbacks : Dict [str , Callable [..., Coroutine ]] = {}
387387 self ._regex_component_callbacks : Dict [re .Pattern , Callable [..., Coroutine ]] = {}
388388 self ._modal_callbacks : Dict [str , Callable [..., Coroutine ]] = {}
389+ self ._regex_modal_callbacks : Dict [re .Pattern , Callable [..., Coroutine ]] = {}
389390 self ._global_autocompletes : Dict [str , GlobalAutoComplete ] = {}
390391 self .processors : Dict [str , Callable [..., Coroutine ]] = {}
391392 self .__modules = {}
@@ -1305,9 +1306,14 @@ def add_modal_callback(self, command: ModalCommand) -> None:
13051306 command: The command to add
13061307 """
13071308 for listener in command .listeners :
1308- if listener in self ._modal_callbacks .keys ():
1309- raise ValueError (f"Duplicate Component! Multiple modal callbacks for `{ listener } `" )
1310- self ._modal_callbacks [listener ] = command
1309+ if isinstance (listener , re .Pattern ):
1310+ if listener in self ._regex_component_callbacks .keys ():
1311+ raise ValueError (f"Duplicate Component! Multiple modal callbacks for `{ listener } `" )
1312+ self ._regex_modal_callbacks [listener ] = command
1313+ else :
1314+ if listener in self ._modal_callbacks .keys ():
1315+ raise ValueError (f"Duplicate Component! Multiple modal callbacks for `{ listener } `" )
1316+ self ._modal_callbacks [listener ] = command
13111317 continue
13121318
13131319 def add_global_autocomplete (self , callback : GlobalAutoComplete ) -> None :
@@ -1791,8 +1797,18 @@ async def _dispatch_interaction(self, event: RawGatewayEvent) -> None: # noqa:
17911797 ctx = await self .get_context (interaction_data )
17921798 self .dispatch (events .ModalCompletion (ctx = ctx ))
17931799
1794- if callback := self ._modal_callbacks .get (ctx .custom_id ):
1795- await self .__dispatch_interaction (ctx = ctx , callback = callback (ctx ), error_callback = events .ModalError )
1800+ modal_callback = self ._modal_callbacks .get (ctx .custom_id )
1801+ if not modal_callback :
1802+ # evaluate regex component callbacks
1803+ for regex , callback in self ._regex_modal_callbacks .items ():
1804+ if regex .match (ctx .custom_id ):
1805+ modal_callback = callback
1806+ break
1807+
1808+ if modal_callback :
1809+ await self .__dispatch_interaction (
1810+ ctx = ctx , callback = modal_callback (ctx ), error_callback = events .ModalError
1811+ )
17961812
17971813 else :
17981814 raise NotImplementedError (f"Unknown Interaction Received: { interaction_data ['type' ]} " )
0 commit comments