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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:08:25