on_message()和@ bot.command问题 [英] on_message() and @bot.command issue

查看:111
本文介绍了on_message()和@ bot.command问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我的代码中包含 on_message()时,它将停止其他所有 @ bot.command 命令的运行。我试图等待bot.process_commands(消息),但这也不起作用。这是我的代码:

When I have on_message() in my code, it stops every other @bot.command commands from working. I've tried to await bot.process_commands(message), but that doesn't work either. Here is my code that I have:

@bot.event
@commands.has_role("Owner")
async def on_message(message):
    if message.content.startswith('/lockdown'):
        await bot.process_commands(message)
        embed = discord.Embed(title=":warning: Do you want to activate Lock Down?", description="Type 'confirm' to activate Lock Down mode", color=0xFFFF00)
        embed.add_field(name="\u200b", value="Lock Down mode is still in early development, expect some issues")
        channel = message.channel
        await bot.send_message(message.channel, embed=embed)
        msg = await bot.wait_for_message(author=message.author, content='confirm')
        embed = discord.Embed(title=":white_check_mark: Lock Down mode successfully activated", description="To deactivate type '/lockdownstop'", color=0x00ff00)
        embed.add_field(name="\u200b", value="Lock Down mode is still in early development, expect some issues")
        await bot.send_message(message.channel, embed=embed)


推荐答案

您必须将 await bot.process_commands(message)放在 if 语句范围之外,<$无论消息是否以 / lockdown开头,都应运行c $ c> process_command 。

You have to place await bot.process_commands(message) outside of the if statement scope, process_command should be run regardless if the message startswith "/lockdown".

@bot.event
async def on_message(message):
    if message.content.startswith('/lockdown'):
       ...
    await bot.process_commands(message)

顺便说一下, @ commands.has_role(...)无法应用于 on_message 。尽管没有任何错误(因为已经进行了检查),但 has_role 实际上并没有按照您的预期工作。

By the way, @commands.has_role(...) cannot be applied to on_message. Although there aren't any errors (because there’s checking in place), has_role wouldn't actually work as you would've expected.

@has_role 装饰器的替代方法是:

An alternative to the @has_role decorator would be:

@bot.event
async def on_message(message):
    if message.channel.is_private or discord.utils.get(message.author.roles, name="Admin") is None:
        return False

    if message.content.startswith('/lockdown'):
       ...
    await bot.process_commands(message)

这篇关于on_message()和@ bot.command问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆