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

如何让Discord机器人的管理员校验函数直接终止上层命令函数执行?

实现Discord机器人的管理员命令校验装饰器

你其实可以用装饰器优雅实现这个需求,discord.py 提供了commands.check工具来完成命令的前置校验,完全可以获取到ctx参数。下面是简化后的单一装饰器实现:

from discord.ext import commands

# 管理员用户ID列表
admins = [1234567890, 9876543210]  # 替换为实际的管理员ID

def is_admin():
    async def predicate(ctx):
        # 校验发送者是否在管理员列表中
        if ctx.author.id not in admins:
            await ctx.send('You are not an admin.')
            return False  # 返回False会终止后续命令执行
        return True
    # 用discord.py的check包装校验逻辑
    return commands.check(predicate)

使用方式

给需要管理员权限的命令添加装饰器即可,无需在命令内部重复写判断逻辑:

@bot.command()
@is_admin()
async def say_hi(ctx, *text):
    await ctx.send('Greetings, my Lord.')

方案优势

  • 代码复用:所有需要管理员校验的命令只需添加一行装饰器,避免重复代码
  • 逻辑集中:校验逻辑全部封装在is_admin装饰器中,后续修改(比如切换成服务器角色校验)更方便
  • 规范适配:利用官方提供的commands.check机制,稳定性更高

另外需要注意:你之前的示例代码中ctx.send()是异步方法,必须加上await关键字才能正确执行。

内容的提问来源于stack exchange,提问作者Romromius

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 05:42:33