在保留命令的同时监听 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 中的消息的主要内容,如果未能解决你的问题,请参考以下文章