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

Discord.js技术问题:检测用户角色及命令权限控制

嘿,我来帮你搞定这两个Discord.js的角色检测问题,结合你提供的代码片段来一步步拆解说明:

问题1:检测被提及的用户是否拥有指定角色

要实现这个功能,核心是先拿到被提及的服务器成员对象(注意是member不是user,因为user是全局用户信息,member包含了该用户在当前服务器的角色、权限等关键数据),再通过其roles.cache属性检查角色是否存在。

给你两种常用的实现方式:

  • 推荐:通过角色ID检测(角色名可能被修改,ID是唯一且稳定的)
if (cmd == 'aerial') {
  message.delete({ timeout: 10 });
  
  // 先获取被提及的第一个成员
  const mentionedMember = message.mentions.members.first();
  if (!mentionedMember) {
    return func.Loi(message, '请先提及一个用户!');
  }

  // 替换成你要检测的角色ID
  const targetRoleId = 'xxx';
  // 检查该成员是否拥有目标角色
  if (mentionedMember.roles.cache.has(targetRoleId)) {
    // 这里写拥有角色后的逻辑
    message.channel.send(`${mentionedMember.user.tag} 拥有指定角色!`);
  } else {
    message.channel.send(`${mentionedMember.user.tag} 没有该角色哦。`);
  }

  // 你原来的其他命令逻辑...
}
  • 备选:通过角色名检测(仅当服务器内角色名唯一时使用)
if (cmd == 'aerial') {
  message.delete({ timeout: 10 });
  
  const mentionedMember = message.mentions.members.first();
  if (!mentionedMember) {
    return func.Loi(message, '请先提及一个用户!');
  }

  // 获取目标角色
  const targetRole = message.guild.roles.cache.find(role => role.name === '你要检测的角色名');
  if (!targetRole) {
    return func.Loi(message, '目标角色不存在!');
  }

  // 检查成员是否拥有该角色
  if (mentionedMember.roles.cache.has(targetRole.id)) {
    // 逻辑代码
  }

  // 你原来的其他命令逻辑...
}
问题2:禁止拥有「System Control Authority - 50」角色的发送者使用命令

这个需求很简单:先获取目标角色,然后在命令开头检查消息发送者(message.member)是否拥有该角色,如果有就直接返回错误提示,终止命令执行。

结合你的代码结构,修改后的示例如下:

// 可以把角色获取放在命令外面,避免每次触发命令都重复查询(提升性能)
const sys50Role = message.guild.roles.cache.find(role => role.name === 'System Control Authority - 50');

if (cmd == 'aerial') {
  message.delete({ timeout: 10 });

  // 先检查发送者是否拥有sys50角色,有则禁止使用
  if (sys50Role && message.member.roles.cache.has(sys50Role.id)) {
    return func.Loi(message, '你拥有System Control Authority - 50角色,禁止使用该命令!');
  }

  // 你原来的权限检查逻辑...
  if (!sys10 && !devRole && !adminRole && !qgRole && !qgtsRole) {
    return func.Loi(
      'You cannot use this command.\nRequire role: **System Control Authority - 10**'
    );
  }

  // 你原来的其他命令逻辑...
}

小提示:如果怕角色名被修改导致逻辑失效,最好把find(role => role.name === xxx)改成用角色ID获取,比如message.guild.roles.cache.get('角色ID'),这样更稳定。

内容的提问来源于stack exchange,提问作者ĐomĐómmmm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 07:42:34