discord.py自定义on_message事件导致join指令无法运行问题
问题根因
自定义on_message事件会覆盖discord.py框架内置的默认消息处理逻辑,框架默认的指令前缀匹配、上下文构造、指令分发流程都会失效,因此@client.command装饰的所有指令都无法被触发。
默认状态下commands.Bot实例会在自带的on_message逻辑中完成指令解析全流程,重写该事件后默认逻辑不会自动执行。
修复方法
在自定义on_message函数的末尾添加await client.process_commands(message),将消息对象交还给框架的指令处理器即可恢复指令功能。
修复后的on_message代码参考:
@client.event async def on_message(message): # 过滤机器人自身消息,避免触发无限响应循环 if message.author.bot: return if message.content.lower() == "!poisson": await message.delete() with open('myimage.png', 'rb') as f: picture = discord.File(f) await message.channel.send(file=picture) # 交还消息给指令处理器,必须添加 await client.process_commands(message)
补充说明
pass_context=True是discord.py 1.0版本之前的旧参数,1.0及之后版本会默认向指令回调传入上下文对象,不需要额外配置该参数- 必须保留机器人自身消息过滤逻辑,否则机器人发送的消息会再次触发
on_message,造成死循环占用资源
内容的提问来源于stack exchange,提问作者Arbaks
相关产品推荐
相关产品推荐

