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

时间:2017-05-02 10:40:04

标签: python python-3.x discord

我的目标是让我的机器人始终在discord.py中监听特定的消息。在这个例子中,它应该监听的消息是$ greet,它应该响应" 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

2 个答案:

答案 0 :(得分:2)

在使用discord.py模块的命令部分时,您依赖于Bot的实例调用您的命令来执行任何操作。这是通过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协程:

  

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

你可以这样做:

await bot.process_commands(message)

on_message活动结束时

我做了类似的事情:

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

仅允许私人消息中的命令并删除命令消息。

答案 1 :(得分:1)

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