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

如何使用Discord.js阻止用户封禁拥有特定角色的成员?

解决Discord.js中阻止用户封禁特定角色成员的问题

你的代码存在几个关键问题,导致无法正确阻止封禁特定角色的成员,以下是修正方案和说明:

原代码的问题点

  • 获取目标成员的方式错误:client.members.cache.get(target)应改为message.guild.members.cache.get(target),全局成员缓存无法准确读取当前服务器内的成员角色信息。
  • 检测到保护角色后未终止命令:即使提示了禁止封禁的消息,代码仍会继续执行后续的ban操作,必须添加return终止流程。
  • 未处理目标不在服务器内的情况:hackban命令可能针对不在服务器的用户,这类用户无法获取角色信息,需要提前判断避免报错。

修正后的完整代码

const { MessageEmbed, User } = require("discord.js");

exports.run = async (client, message, args) => { 
  const logs = await client.channels.fetch('993755247652634716');
  const target = args[0];
  const protectedRoleId = "950383380334260285"; // 需保护的角色ID

  // 权限检查
  if (!message.guild.me.hasPermission('BAN_MEMBERS')) {
    return message.reply('我没有封禁成员的权限!', { allowedMentions: { repliedUser: false } });
  }
  if (!message.member.hasPermission('BAN_MEMBERS')) {
    return message.reply('你没有封禁成员的权限!', { allowedMentions: { repliedUser: false } });
  }
  // 目标ID格式校验
  if (isNaN(target)) {
    return message.reply('请指定有效的用户ID!');
  }
  // 阻止封禁自身
  if (target === message.author.id) {
    return message.reply('为什么要封禁自己呢?!', { allowedMentions: { repliedUser: false } });
  }

  // 检查目标是否在服务器内
  const targetMember = message.guild.members.cache.get(target);
  if (targetMember) {
    // 目标在服务器内时,检查是否拥有受保护角色
    if (targetMember.roles.cache.has(protectedRoleId)) {
      return message.reply("禁止封禁试用版管理员!", { allowedMentions: { repliedUser: false } });
    }
  }

  // 处理封禁理由
  let reason = "未提供理由。";
  if (args[1]) {
    reason = args.splice(1).join(" ");
  }
    
  try {
    await message.guild.members.ban(target, { 
      reason: reason.length < 1 ? '未提供理由。' : reason 
    });            
    await message.delete();
    // 可选:发送封禁日志到指定频道
    const banEmbed = new MessageEmbed()
      .setTitle('成员被封禁')
      .addField('执行者', message.author.tag, true)
      .addField('目标ID', target, true)
      .addField('理由', reason)
      .setTimestamp();
    logs.send({ embeds: [banEmbed] });
  } catch (error) { 
    console.error('封禁出错:', error);
    message.reply('封禁操作失败,请检查目标ID是否有效或我的权限是否足够!', { allowedMentions: { repliedUser: false } });
  }
}

module.exports.config = {
  name: "hackban",
  aliases: ['forceban', 'softban'],
  usage: "[hackban || forceban] <用户ID> [理由]"
}

关键修正说明

  1. 成员获取逻辑修正:改用message.guild.members.cache.get(target)获取当前服务器内的成员,确保能正确读取角色信息。
  2. 流程终止优化:在检测到受保护角色后添加return,直接终止命令,避免后续ban操作执行。
  3. 异常处理增强:在try-catch中补充错误提示,让执行者明确封禁失败的原因,同时增加了日志发送示例(可选)。
  4. 代码可读性提升:将保护角色ID单独提取为变量,调整代码缩进和结构,方便后续维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:18:24