J'ai les 2 écouteurs suivants dans le seul rouage de mon bot :

@Cog.listener()
async def on_command_error(self, ctx, error)  :
    if isinstance(error, CommandNotFound):
        await ctx.send_help()

@Cog.listener()
async def on_message(self, message):
    if message.author.bot:
        return
    if message.content.startswith(">--"):
        return

Le préfixe de commande est >-, et j'avais l'impression que le return pour les messages commençant par >-- signifierait que le message ne va pas plus loin que on_message, mais quand je donnez la commande >--halp, on_command_error se déclenche avec l'erreur :

CommandNotFound('Command "-halp" is not found')

Est-ce que ma compréhension de la façon d'ignorer les messages est erronée, ou est-ce que on_command_error se déclenche même pour les messages "morts", ou qu'est-ce que je fais mal ?

1
ProfK 16 sept. 2020 à 15:33

1 réponse

Meilleure réponse

L'enregistrement d'un écouteur à l'intérieur d'un rouage ne remplace pas celui par défaut utilisé par le bot (si un défaut existe).

Dans votre cas, chaque fois qu'un message est envoyé à un canal que le bot peut voir, l'événement personnalisé on_message dans le rouage ainsi que l'événement par défaut on_message se déclencheront.

C'est pourquoi l'erreur CommandNotFound est levée, car l'événement par défaut on_message essaie toujours de traiter le message et de vérifier si une commande a été appelée.

Si vous remplacez l'événement on_message par défaut dans votre fichier principal (où votre client bot est défini), les deux événements personnalisés on_message se déclencheront toujours (le principal et le rouage).

Cela peut être vérifié avec ce qui suit. Lorsque le bot voit un message, bot.py et cog.py seront imprimés, indiquant que les deux événements on_message sont déclenchés.

bot.py

from discord.ext import commands

client = commands.Bot(command_prefix='>-')

client.load_extension('cog')

@client.event
async def on_message(message):
    print('bot.py')
    await client.process_commands(message)

client.run('TOKEN')

cog.py

from discord.ext import commands

class TestCog(commands.Cog):
    
    def __init__(self, bot):
        self.bot = bot

    @commands.Cog.listener()
    async def on_message(self, message):
        print('cog.py')

def setup(bot):
    bot.add_cog(TestCog(bot))

Si vous souhaitez que le bot ignore complètement certains messages, vous devez le faire dans un événement on_message personnalisé dans le fichier où le client bot est défini.

0
Benjin 16 sept. 2020 à 13:30