如何在Discord.js V14中阻止用户授予高于自身的角色?
解决Discord Bot中Moderator越权授予高等级角色的问题
问题描述
拥有Manage Roles权限的Moderator角色用户,给其他成员添加角色时,可授予比自身等级更高的角色(如Admin,自身并无该角色)。现有代码仅能阻止用户给自己加角色,无法限制这种越权操作。
当前代码
const target = interaction.options.getMember('target'); const rolee = interaction.options.getRole('role'); if (target.roles.cache.some(role => role.name === rolee.name)) { await interaction.reply({ content: "Error: User already has this role", ephemeral: true }) } if (target.user.id === interaction.member.user.id) { await interaction.reply({ content: "You cannot give yourself roles.", ephemeral: true }) } else { await interaction.reply({ embeds: [{ title: 'Role was given', description: `<@${target.user.id}> was given <@&${rolee.id}>`, color: '15844367', thumbnail: { url: 'https://cdn.discordapp.com/attachments/1141734104543539220/1141750239984898190/TEST_BOT.jpg' }, fields: [ { name: 'Responsible Awarder', value: `<@${interaction.user.id}>`, }, ], footer: { text: 'Current version: 0.0.1', icon_url: 'https://cdn.discordapp.com/attachments/1141734104543539220/1141750630763987015/pooperson.jpg', }, }], }); target.roles.add(rolee) }
问题根源
当前代码缺少两个关键校验:
- 未检查操作用户的最高角色层级是否高于目标角色的层级
- 未确保Bot自身的角色层级足够高,导致可能无法执行添加角色的操作
- 原条件判断未使用
return,可能触发多次interaction.reply报错
解决方案
添加角色层级校验逻辑,同时优化条件判断的执行流程:
- 校验操作用户的最高角色层级必须高于目标角色
- 校验Bot的最高角色层级必须高于目标角色(避免Bot无权限添加)
- 用角色ID替代角色名称校验(名称可能重复,ID唯一)
- 每个校验通过
return终止后续流程,避免重复回复
修改后的完整代码
const target = interaction.options.getMember('target'); const rolee = interaction.options.getRole('role'); // 1. 校验用户是否已拥有该角色(用ID更可靠) if (target.roles.cache.has(rolee.id)) { return await interaction.reply({ content: "错误:用户已拥有该角色", ephemeral: true }); } // 2. 校验是否给自己加角色 if (target.user.id === interaction.user.id) { return await interaction.reply({ content: "你不能给自己添加角色。", ephemeral: true }); } // 3. 校验操作用户的最高角色层级是否高于目标角色 const userHighestRole = interaction.member.roles.highest; if (userHighestRole.position <= rolee.position) { return await interaction.reply({ content: "你无法授予比自己最高角色等级更高的角色。", ephemeral: true }); } // 4. 校验Bot的角色层级是否足够添加目标角色 const botHighestRole = interaction.guild.members.me.roles.highest; if (botHighestRole.position <= rolee.position) { return await interaction.reply({ content: "我的角色等级不足,无法添加该角色。", ephemeral: true }); } // 所有校验通过,执行添加角色操作 await interaction.reply({ embeds: [{ title: '角色已授予', description: `<@${target.user.id}> 已获得角色 <@&${rolee.id}>`, color: '15844367', thumbnail: { url: 'https://cdn.discordapp.com/attachments/1141734104543539220/1141750239984898190/TEST_BOT.jpg' }, fields: [ { name: '授予人', value: `<@${interaction.user.id}>`, }, ], footer: { text: '当前版本: 0.0.1', icon_url: 'https://cdn.discordapp.com/attachments/1141734104543539220/1141750630763987015/pooperson.jpg', }, }], }); await target.roles.add(rolee);
关键说明
- 角色层级(
position):Discord服务器中角色列表的位置越靠上,层级越高,权限优先级也越高 - 使用角色ID校验:避免因角色名称重复导致的误判
- 提前终止流程:每个校验通过
return结束,确保只有所有条件满足时才执行添加操作
内容的提问来源于stack exchange,提问作者average discord bot maker
相关产品推荐
相关产品推荐

