J'essaie de créer un robot de modération avec des commandes telles que kick, ban, prune, etc., et j'ai toutes les commandes, mais je ne peux pas comprendre comment gérer l'erreur que vous obtenez lorsque l'expéditeur n'a pas la permission . C'est mon code pour l'instant:
@commands.command(name='kick') @commands.guild_only() @commands.has_permissions(kick_members=True) async def kick(self, ctx, member : discord.Member, *, reason=None): await member.kick(reason=reason) await ctx.send(f'User {member.mention} has been kicked for: "{reason}".') @kick.error async def kick_error(self, error, ctx): if isinstance(error, error.MissingPermissions): await ctx.send(":redTick: You don't have permission to kick members.")
Aucune erreur n'apparaît dans la console, mais le message n'est pas envoyé.
3 Réponses :
Le problème est que lorsqu'un utilisateur avec des autorisations non valides essaie d'utiliser cette commande, l'exception est interceptée par error
, cependant, l' error
n'est que l'exception qui est interceptée par discord.py
car l'utilisateur n'a pas l'autorisation. Par conséquent, la fonction détecte l'erreur, aucun problème, mais votre instruction if échoue car error.MissingPermissions
n'est pas une instance d'erreur. Cela n'existe même pas car l' error
est exactement ce que l'exception levée par discord.py que votre fonction a interceptée. Il n'y a pas de MissingPermissions
dans le cadre de cela. Par conséquent, il n'y a pas de MissingPermissions
partir de l'erreur que vous avez détectée, car ce n'est qu'une erreur. Vous devez voir si error
est une instance de MissingPermissions
de la classe d'autorisations manquantes discord.py
(ce qui est le cas). Ainsi, pour résoudre ce problème, importez les MissingPermissions
et vous serez MissingPermissions
à partir. J'ai corrigé le code pour vous ci-dessous.
from discord.ext.commands import MissingPermissions # Code @kick.error async def kick_error(self, ctx, error): if isinstance(error, MissingPermissions): await ctx.send(":redTick: You don't have permission to kick members.")
Désolé si l'explication n'est pas claire. Je peux essayer de l'expliquer à nouveau si vous le souhaitez ou si quelqu'un peut le modifier pour le rendre plus clair et plus précis.
J'ai édité le code. Je me rends compte que lorsque vous travaillez avec n'importe quelle commande dans le contexte discord.py
doit être le premier argument qui est passé, vous pouvez alors transmettre n'importe quelle erreur ou des arguments supplémentaires que vous souhaitez passer. Essayez-le maintenant. J'ai également testé votre code sur mon serveur. J'ai eu une exception dans la console avec votre code, il est donc possible que quelque chose d'autre interfère avec votre code, c'est pourquoi vous n'obtenez aucune erreur. Cependant, quand je l'ai réparé, cela a fonctionné sans qu'aucune exception ne soit lancée dans la console. Alors, essayez ma modification et voyez si cela fonctionne.
commands.MissingPermissions
pas d' error.MissingPermissions
Non, ça ne l'a pas fait.
ajoutez raise(error)
à la fin du gestionnaire d'erreurs et voyez quelle est l'erreur qui est déclenchée
Rien n'est apparu dans la console. J'ai même essayé de supprimer complètement le gestionnaire et il n'y a plus d'erreur?
également si vous avez rencontré une exception: ctx is a required attribute that is missing
c'est parce que votre bot n'est pas dans une classe. La solution:
from discord.ext.commands import MissingPermissions # Code @kick.error async def kick_error(ctx, error): if isinstance(error, MissingPermissions): await ctx.send(":redTick: You don't have permission to kick members.")
en bref, supprimez l'attribut self. Cette réponse peut sembler idiote, mais uniquement pour les experts. J'espère que les débutants trouveront cela aussi utile! :)