discord.py或discord-py-slash-command是否有斜杠命令事件监听器
原生支持情况
1. discord-py-slash-command(即discord_slash包,v3.x版本)
原生就提供了你设想的斜杠命令全局监听事件,直接使用on_slash_command即可,触发时机为任意斜杠命令执行前:
@slash.event async def on_slash_command(ctx): # 此处编写你的通用逻辑,例如日志记录、全局权限校验、响应预defer等 print(f"用户 {ctx.author} 在频道 {ctx.channel} 触发了斜杠命令 {ctx.name}")
如果你的通用逻辑判断需要中断后续命令执行,直接return即可停止向下传递。
2. discord.py v2.0及以上内置应用命令
目前discord.py官方已经内置了斜杠命令(属于应用命令分类),对应的全局监听事件为on_application_command,所有斜杠命令、上下文菜单命令触发前都会执行该事件内的逻辑:
@bot.event async def on_application_command(ctx): # 通用逻辑示例:全局校验管理员权限 if not ctx.author.guild_permissions.administrator: await ctx.respond("你没有权限使用所有 bot 命令", ephemeral=True) # 中断后续命令执行 return # 通用逻辑示例:提前defer避免3秒响应超时 await ctx.defer()
除此之外还配套有on_application_command_completion(命令执行完成后触发)、on_application_command_error(命令执行报错时触发)事件可以按需使用。
无原生支持的替代方案
如果你使用的版本没有提供上述原生事件,可以通过全局装饰器的方式实现相同效果,不需要修改原有命令的核心逻辑:
- 先定义通用钩子装饰器
def global_slash_hook(func): async def wrapper(ctx, *args, **kwargs): # 此处编写通用执行逻辑 print(f"触发命令:{ctx.command.name},触发用户:{ctx.author.id}") # 校验不通过时直接返回,中断原命令执行 if 校验逻辑不成立: await ctx.respond("操作被拦截", ephemeral=True) return # 校验通过则执行原命令逻辑 return await func(ctx, *args, **kwargs) return wrapper
- 所有斜杠命令注册时加上该装饰器即可
@slash.slash( name='hello', description='Say hello.' ) @global_slash_hook async def _hello(ctx): await ctx.send('Hi!')
如果你的命令都基于Cog编写,也可以给Cog设置before_invoke钩子,该Cog下的所有命令触发前都会自动执行钩子内的逻辑,全局生效只需要让所有Cog继承带钩子的基类即可。
内容的提问来源于stack exchange,提问作者Aveluntara
相关产品推荐
相关产品推荐

