discord.py框架on_message事件运行命令及ctx使用相关问题咨询
discord.py开发问题解答
1. 是否可以在on_message()事件中使用ctx参数?
on_message()事件默认仅接收message作为入参,没有内置的ctx参数。如果需要使用ctx,可以调用bot实例的get_context()方法,从message对象手动生成ctx实例,生成后的ctx和命令函数中传入的ctx功能完全一致。
示例代码:
async def on_message(self, message): # 手动生成ctx ctx = await self.get_context(message)
2. 若无法直接使用ctx,是否可以让自定义命令在on_message事件中正常运行?
可以,有两种常用实现方式:
方式一:触发内置命令处理逻辑
如果是用@commands.command装饰器注册的标准命令,只需要在on_message自定义逻辑的末尾调用await self.process_commands(message),所有符合前缀规则的命令就会自动触发运行。
*注意:重写on_message事件后如果不调用process_commands,所有注册的标准命令都会默认失效。
示例代码:
async def on_message(self, message): # 你的自定义on_message逻辑 if message.author.bot: return # 触发命令处理 await self.process_commands(message)
方式二:手动调用自定义方法
针对你示例中的自定义类方法a(),可以在手动生成ctx后直接传入调用即可,适配你给出的代码结构的完整写法如下:
# func.py class Function: # 类定义括号内为父类,不需要传self async def a(self, ctx): # 你的方法逻辑 await ctx.send("调用成功") # bot.py from discord.ext import commands class Bot(commands.Bot): def __init__(self, *args, **kwargs): super().__init__(command_prefix="!", *args, **kwargs) self.func = Function() # 初始化自定义功能类实例 async def on_message(self, message): if message.author.bot: return # 生成ctx ctx = await self.get_context(message) # 调用自定义方法 await self.func.a(ctx) # 如果还要运行标准命令,保留这行 await self.process_commands(message)
内容的提问来源于stack exchange,提问作者김동동
相关产品推荐
相关产品推荐

