Discord.js赛马命令权限控制实现求助:如何限制特定权限用户调用命令
解决Discord.js赛马命令的权限限制问题
我来帮你搞定这个权限校验的问题!其实核心就是在命令执行的最开始添加权限检查逻辑,而且要注意几个容易踩坑的点,比如权限名称的大小写、是否在服务器环境中执行。
方案一:在命令模块内添加权限检查(推荐)
因为你的赛马命令是模块化导出的,直接在startRace函数开头加检查最规范,也方便维护。修改后的代码如下:
const status = require('./../util/status'); function startRace(message, args) { // 1. 先判断是否在服务器中(DM里无法使用权限相关命令) if (!message.guild) { return message.reply("这个赛马命令只能在服务器里使用哦!"); } // 2. 检查用户是否拥有指定权限:管理员 或 管理权限 const requiredPermissions = ["ADMINISTRATOR", "MANAGE_PERMISSIONS"]; const hasPermission = requiredPermissions.some(perm => message.member.permissions.has(perm)); if (!hasPermission) { return message.reply("抱歉,你没有权限发起赛马!需要拥有管理员或权限管理权限才能使用这个命令。"); } // 下面是你原来的赛马逻辑代码... const trackLength = 50; const initialHorseDistance = 100; const numberOfHorses = 6; const horseNames = ["Athemir", "Rildonis", "Hyrget", "Maldonar", "Zael", "Getha"]; status.racing.initalise(horseNames); message.channel.send("Our participants are:\n" + horseNames.map((horseName, i) => {return `${i + 1}: ${horseName}`}).join('\n') ); // ... 剩下的代码保持不变 } // 后面的函数和导出部分不变
关键细节说明
- 权限名称必须大写:Discord.js的权限常量都是大写的,比如
MANAGE_PERMISSIONS,如果你写成小写的manage_permissions会导致检查失败,这很可能是你之前出错的原因之一! - 用
some方法简化多权限检查:如果需要多个权限满足其一,用Array.some()比写多个||更简洁,后续要加新权限也方便。 - 处理DM场景:如果用户在DM里发命令,
message.member会是null,提前判断可以避免报错。
方案二:在message事件中添加检查(如果你直接用message事件处理命令)
如果你是直接在客户端的message事件里触发命令,那要把权限检查放在调用startRace之前,并且补全语法(你之前的代码片段缺少闭合的大括号):
client.on("message", (message) => { if (message.content.startsWith("^horse")) { // 检查权限 if (!message.guild) { return message.reply("这个命令只能在服务器中使用!"); } const hasPermission = message.member.permissions.has("ADMINISTRATOR") || message.member.permissions.has("MANAGE_PERMISSIONS"); if (!hasPermission) { return message.reply("你没有权限使用这个命令!"); } // 调用赛马命令 const args = message.content.slice(6).trim().split(/ +/); startRace(message, args); } });
为什么你之前的尝试会报错?
你提供的代码片段有两个问题:
- 语法不完整:缺少闭合的
},导致JavaScript解析失败。 - 权限名称可能大小写错误:如果用了小写的
manage_permissions,Discord.js会识别不到这个权限。
按照上面的方案修改后,只有拥有管理员或权限管理权限的用户才能发起赛马,其他用户会收到明确的提示信息,不会再出现语法错误啦!
内容的提问来源于stack exchange,提问作者Seamus
相关产品推荐
相关产品推荐

