如何让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
相关产品推荐
相关产品推荐

