You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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(命令执行报错时触发)事件可以按需使用。

无原生支持的替代方案

如果你使用的版本没有提供上述原生事件,可以通过全局装饰器的方式实现相同效果,不需要修改原有命令的核心逻辑:

  1. 先定义通用钩子装饰器
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
  1. 所有斜杠命令注册时加上该装饰器即可
@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:45:08