Discord.js如何判断用户有MANAGE_MESSAGES权限以避免误分配禁言角色
问题原因
你当前的代码没有添加发送者的权限校验逻辑,所以无论用户持有什么权限,只要触发了违规消息规则都会被添加禁言角色。此外原代码还存在两个隐性问题:
- 首次创建Muted角色时没有做异步等待,角色创建成功后不会给本次触发规则的用户添加禁言角色
- Muted角色创建后默认没有配置频道权限覆写,可能无法生效禁言效果
解决方法
在检测到违规消息后、执行禁言操作前,添加权限校验逻辑,豁免持有MANAGE_MESSAGES权限的用户即可,修正后代码如下:
client.on('message', async (message) => { let data = await antilinks.findOne({ Guild: message.guild.id }); if (data.run === 'off') return; if (data.run === 'on') { if (links(message.content) === true) { message.delete() try { // 新增权限校验:持有管理消息权限的用户直接跳过禁言 if (message.member.permissions.has('MANAGE_MESSAGES')) return; let muterole = message.guild.roles.cache.find(ro => ro.name === 'Muted'); if (!muterole) { // 新增await等待角色创建完成 muterole = await message.guild.roles.create({ data: { name: 'Muted', color: 'RANDOM', permissions: [] } }); // 可选:给所有频道添加Muted角色的权限覆写,禁止发消息 message.guild.channels.cache.forEach(async (channel) => { await channel.permissionOverwrites.create(muterole, { SEND_MESSAGES: false, ADD_REACTIONS: false, SPEAK: false }); }); } // 把添加角色逻辑移到else外面,保证首次创建角色也能生效 await message.member.roles.add(muterole); } catch (err) { console.log(err); } } } })
注意事项
- 如果你使用的是Discord.js v14及以上版本,权限枚举值需要改为
PermissionFlagsBits.ManageMessages,同时引入对应的枚举类 - 如果你需要只豁免全局持有该权限的用户、不豁免仅在当前频道持有该权限的用户,可以把权限判断改为
message.member.permissionsIn(message.guild).has('MANAGE_MESSAGES')
内容的提问来源于stack exchange,提问作者Tiffany
相关产品推荐
相关产品推荐

