0
votes

Gestion des erreurs dans discord.py (pas d'autorisation)

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é.


0 commentaires

3 Réponses :


0
votes

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.


1 commentaires

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.



1
votes

commands.MissingPermissions pas d' error.MissingPermissions


3 commentaires

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?



0
votes

é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! :)


0 commentaires