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

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);
  }
});

为什么你之前的尝试会报错?

你提供的代码片段有两个问题:

  1. 语法不完整:缺少闭合的},导致JavaScript解析失败。
  2. 权限名称可能大小写错误:如果用了小写的manage_permissions,Discord.js会识别不到这个权限。

按照上面的方案修改后,只有拥有管理员或权限管理权限的用户才能发起赛马,其他用户会收到明确的提示信息,不会再出现语法错误啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 04:32:47