3838 SlashCommand ,
3939 SlashCommandGroup ,
4040 SlashCommandOptionType ,
41- Member
4241)
4342
4443from ...utils import MISSING , find , get , warn_deprecated
5453 GuildChannelConverter ,
5554 RoleConverter ,
5655 UserConverter ,
57- MemberConverter
56+ MemberConverter ,
5857)
5958from ..commands .converter import _convert_to_bool , run_converters
6059
@@ -582,15 +581,22 @@ def predicate(func: Callable | ApplicationCommand):
582581
583582
584583class MentionableConverter (Converter ):
585- """A converter that can convert a mention to a user or a role."""
584+ """A converter that can convert a mention to a member or a role, preferring Member in guilds ."""
586585
587586 async def convert (self , ctx , argument ):
588587 try :
589588 return await RoleConverter ().convert (ctx , argument )
590589 except BadArgument :
591- return await UserConverter (). convert ( ctx , argument )
590+ pass
592591
592+ if ctx .guild :
593+ try :
594+ return await MemberConverter ().convert (ctx , argument )
595+ except BadArgument :
596+ pass
593597
598+ return await UserConverter ().convert (ctx , argument )
599+
594600class AttachmentConverter (Converter ):
595601 async def convert (self , ctx : Context , arg : str ):
596602 try :
@@ -616,6 +622,7 @@ async def convert(self, ctx, arg: bool):
616622 SlashCommandOptionType .mentionable : MentionableConverter ,
617623 SlashCommandOptionType .number : float ,
618624 SlashCommandOptionType .attachment : AttachmentConverter ,
625+ discord .Member : MemberConverter
619626}
620627
621628
@@ -624,39 +631,30 @@ class BridgeOption(Option, Converter):
624631 command option and a prefixed command argument for bridge commands.
625632 """
626633
627- def __init__ (self , input_type , * args , ** kwargs ):
628- super ().__init__ (input_type , * args , ** kwargs )
629634
635+ def __init__ (self , input_type , * args , ** kwargs ):
630636 self .converter = kwargs .pop ("converter" , None )
637+ super ().__init__ (input_type , * args , ** kwargs )
631638
632639 if self .converter is None :
633- converter = BRIDGE_CONVERTER_MAPPING .get (input_type )
634- if input_type in (Member , SlashCommandOptionType .user ):
635- self .converter = self ._guild_aware_user_converter
636-
637- elif isinstance (converter , type ) and issubclass (converter , Converter ):
638- self .converter = converter ()
640+ if input_type == discord .Member :
641+ self .converter = MemberConverter ()
639642 else :
640- self .converter = converter
643+ self .converter = BRIDGE_CONVERTER_MAPPING . get ( input_type )
641644
642- async def _guild_aware_user_converter (self , ctx , argument ):
643- if ctx .guild :
644- try :
645- return await MemberConverter ().convert (ctx , argument )
646- except BadArgument :
647- pass
648- return await UserConverter ().convert (ctx , argument )
649-
650645 async def convert (self , ctx , argument : str ) -> Any :
651646 try :
652647 if self .converter is not None :
653648 converted = await self .converter .convert (ctx , argument )
654649 else :
655- converter = BRIDGE_CONVERTER_MAPPING [ self .input_type ]
656- if issubclass (converter , Converter ):
650+ converter = BRIDGE_CONVERTER_MAPPING . get ( self .input_type )
651+ if isinstance ( converter , type ) and issubclass (converter , Converter ):
657652 converted = await converter ().convert (ctx , argument ) # type: ignore # protocol class
658- else :
653+ elif callable ( converter ) :
659654 converted = converter (argument )
655+ else :
656+ raise TypeError (f"Invalid converter: { converter } " )
657+
660658
661659 if self .choices :
662660 choices_names : list [str | int | float ] = [
0 commit comments