15
15
from ..enums import ApplicationCommandType , Locale , OptionType , PermissionType
16
16
17
17
if TYPE_CHECKING :
18
+ from ...api .dispatch import Listener
18
19
from ..bot import Extension
19
20
from ..context import CommandContext
20
21
@@ -396,7 +397,8 @@ class Command(DictSerializerMixin):
396
397
:ivar Dict[str, Union[Callable[..., Awaitable], str]] autocompletions: The dictionary of autocompletions for the command.
397
398
:ivar Optional[str] recent_group: The name of the group most recently utilized.
398
399
:ivar bool resolved: Whether the command is synced. Defaults to ``False``.
399
- :ivar Extension extension: The extension that the command belongs to, if any.
400
+ :ivar Optional[Extension] extension: The extension that the command belongs to, if any.
401
+ :ivar Optional[Listener] listener: The listener, used for dispatching command errors.
400
402
"""
401
403
402
404
coro : Callable [..., Awaitable ] = field ()
@@ -419,7 +421,8 @@ class Command(DictSerializerMixin):
419
421
recent_group : Optional [str ] = field (default = None , init = False )
420
422
error_callback : Optional [Callable [..., Awaitable ]] = field (default = None , init = False )
421
423
resolved : bool = field (default = False , init = False )
422
- extension : "Extension" = field (default = None , init = False )
424
+ extension : Optional ["Extension" ] = field (default = None , init = False )
425
+ listener : Optional ["Listener" ] = field (default = None , init = False )
423
426
424
427
def __attrs_post_init__ (self ) -> None :
425
428
if self .name is MISSING :
@@ -837,17 +840,19 @@ async def __call(
837
840
except CancelledError :
838
841
pass
839
842
except Exception as e :
840
- if not self .error_callback :
841
- raise e
842
-
843
- num_params = len (signature (self .error_callback ).parameters )
843
+ if self .error_callback :
844
+ num_params = len (signature (self .error_callback ).parameters )
844
845
845
- if num_params == (3 if self .extension else 2 ):
846
- await self .error_callback (ctx , e )
847
- elif num_params == (4 if self .extension else 3 ):
848
- await self .error_callback (ctx , e , _res )
846
+ if num_params == (3 if self .extension else 2 ):
847
+ await self .error_callback (ctx , e )
848
+ elif num_params == (4 if self .extension else 3 ):
849
+ await self .error_callback (ctx , e , _res )
850
+ else :
851
+ await self .error_callback (ctx , e , _res , * args , ** kwargs )
852
+ elif self .listener and "on_command_error" in self .listener .events :
853
+ self .listener .dispatch ("on_command_error" , ctx , e )
849
854
else :
850
- await self . error_callback ( ctx , e , _res , * args , ** kwargs )
855
+ raise e
851
856
852
857
return StopCommand
853
858
@@ -888,15 +893,17 @@ async def wrapper(ctx: "CommandContext", *args, **kwargs):
888
893
except CancelledError :
889
894
pass
890
895
except Exception as e :
891
- if self .has_subcommands or not self .error_callback :
892
- raise e
893
-
894
- num_params = len (signature (self .error_callback ).parameters )
895
-
896
- if num_params == (3 if self .extension else 2 ):
897
- await self .error_callback (ctx , e )
896
+ if self .error_callback :
897
+ num_params = len (signature (self .error_callback ).parameters )
898
+
899
+ if num_params == (3 if self .extension else 2 ):
900
+ await self .error_callback (ctx , e )
901
+ else :
902
+ await self .error_callback (ctx , e , * args , ** kwargs )
903
+ elif self .listener and "on_command_error" in self .listener .events :
904
+ self .listener .dispatch ("on_command_error" , ctx , e )
898
905
else :
899
- await self . error_callback ( ctx , e , * args , ** kwargs )
906
+ raise e
900
907
901
908
return StopCommand
902
909
0 commit comments