我的目标是让我的机器人始终在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
答案 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)
您可以将它们放在单独的文件中。或者你可以让他们使用相同的前缀'!'