在保留命令的同时监听 Discord.py 中的消息

Posted

技术标签:

【中文标题】在保留命令的同时监听 Discord.py 中的消息【英文标题】:Listening for messages in Discord.py while retaining commands 【发布时间】:2017-09-29 20:34:33 【问题描述】:

我的目标是让我的机器人始终监听 discord.py 中的特定消息。在示例中,它应该监听的消息是 $greet,它应该通过在 Text To Speech 中大声朗读“Say hello”来响应它。

这很好用,但是它会禁用我设置的常规命令,例如 !play 和 !help。有没有办法绕过这个限制?

示例代码:

@my_bot.event
async def on_message(message, timeout=10,):
    if message.content.startswith('$greet'):
        await my_bot.send_message(message.channel, 'Say hello', tts=True)
        msg = await my_bot.wait_for_message(author=message.author, content='hello')
        await my_bot.send_message(message.channel, 'Hello.')

预期输出:

User: !play
Bot: Now playing...
User: $greet
Bot: Say hello

实际输出:

User: !play
User: $greet
Bot: Say hello

【问题讨论】:

您正在做的是覆盖处理命令运行的机器人中的默认 on_message 事件。由于您确实希望在此事件中出现特殊行为,这是正确的,但您需要调用处理随后运行的命令的方法。你也许可以在模块源中找到这个(搜索 on_message),我回家后会用它发布答案 非常欣赏这个 Blimmo,会赞成,因为这似乎确实是问题,但我不经常使用 Stack Overflow,所以我不知道如何。我会自己搜索并期待回音。 【参考方案1】:

您可以将它们放在单独的文件中。或者你可以让他们使用相同的前缀'!'

【讨论】:

示例代码中的前缀被用作占位符。在实践中,它应该响应以特定措辞开头的特定短语。例如,如果用户要专门用“Hello bot”来启动一个短语,它会回复。转换前缀无济于事,因为它仍然需要查找前缀。根据我对 API 的理解,我的代码应该可以工作,尽管显然我犯了一个错误。你能举个例子说明“将它们放在单独的文件中”是什么意思吗?【参考方案2】:

在使用 discord.py 模块的命令部分时,您依赖 Bot 的实例调用您的命令以使其中任何一个发生。这是由机器人的协程方法process_commands 以复杂的方式完成的,我不会解释。

来自the source:

# command processing

@asyncio.coroutine
def process_commands(self, message):
    ...

这是由on_message 事件调用的回合。

@asyncio.coroutine
def on_message(self, message):
    yield from self.process_commands(message)

当您覆盖 on_message 事件以实现您的自定义行为时,您将替换此默认行为,因此您需要在特殊处理后自己调用 process_commands

来自the docstring 的process_commands 协程:

默认情况下,这个协程在 :func:on_message 内部调用 事件。如果您选择覆盖 :func:on_message 事件,则 你也应该调用这个协程。

您可以使用 put this 来做到这一点:

await bot.process_commands(message)

在您的on_message 活动结束时

我做了这样的事情:

if message.channel.is_private:
    # Handle commands
    await bot.process_commands(message)
    await bot.delete_message(message)

只允许私人消息中的命令并删除之后的命令消息。

【讨论】:

以上是关于在保留命令的同时监听 Discord.py 中的消息的主要内容,如果未能解决你的问题,请参考以下文章

discord.py,同时使用斜杠命令和前缀

命令中的 Discord.py 命令?

频道中的 Discord.py 禁用命令

如何访问discord.py中的哪个语音通道用户写入命令?

命令 discord.py 中的客户端事件

Discord bot 运行命令两次 discord.py