如何实现多个Discord.py on_message事件同时生效?
解决Discord.py多个on_message事件仅最后一个生效的问题
这是个很常见的Discord.py新手坑——我来给你理清问题根源和解决办法:
问题根源
在Discord.py中,当你多次用@client.event装饰on_message函数时,每一次定义都会覆盖之前注册的事件处理函数。客户端只会保留最后一个被注册的on_message逻辑,这就是为什么你现在只有test对应的回复能正常工作。
解决方案
这里有两种靠谱的解决思路,你可以根据代码复杂度选择:
方案1:合并所有逻辑到同一个on_message函数
这是最直接的方式,把所有消息触发的逻辑都放到同一个on_message里,依次检查条件即可:
@client.event async def on_message(message): # 处理"hey"触发的回复 if message.content.startswith("hey"): await message.reply('こんにちは', mention_author=True) # 处理"test"触发的回复 if message.content.startswith("test"): await message.reply('123', mention_author=True) # 必须保留这一行,确保bot的命令系统正常运行 await client.process_commands(message)
方案2:使用add_listener注册多个独立的监听器
如果你的逻辑越来越复杂,想拆分到不同函数里保持整洁,可以用client.add_listener()方法注册多个消息处理函数:
# 单独处理"hey"的函数 async def handle_hey_message(message): if message.content.startswith("hey"): await message.reply('こんにちは', mention_author=True) # 单独处理"test"的函数 async def handle_test_message(message): if message.content.startswith("test"): await message.reply('123', mention_author=True) # 把两个函数注册为on_message事件的监听器 client.add_listener(handle_hey_message, "on_message") client.add_listener(handle_test_message, "on_message") # 别忘了保留一个on_message来处理命令(也可以把process_commands放到任意一个监听器里) @client.event async def on_message(message): await client.process_commands(message)
重要提醒
不管用哪种方案,必须确保await client.process_commands(message)被调用——这行代码是让bot的命令系统(比如用@client.command()定义的命令)正常工作的关键,千万别漏掉。
内容的提问来源于stack exchange,提问作者Azula
相关产品推荐
相关产品推荐

