discord.js v12 如何检查用户是否拥有admin或owner角色
discord.js v12 多角色权限判断解决方案
你当前重复注册了两次message事件属于冗余代码,可直接合并为一个监听事件,要检测用户是否持有admin或owner任意一个角色,直接使用角色缓存的some()方法即可,优化后完整代码如下:
client.on('message', message => { // 过滤非!ban指令的消息 if (!message.content.startsWith('!ban')) return; // 校验发起者是否持有admin或owner任意一个角色 const hasPermission = message.member.roles.cache.some(r => r.name === 'owner' || r.name === 'admin'); // 无权限直接终止执行 if (!hasPermission) return; // 原有业务逻辑,无需重复编写两次 message.delete(); const targetMember = message.mentions.members.first(); if (!targetMember) { return message.channel.send("You need to mention the @user!").then(declineMsg => { declineMsg.delete({ timeout: 5000 }); }) } const bannedRole = message.guild.roles.cache.find(role => role.name === "banned"); // 给目标用户添加禁言角色 targetMember.roles.add(bannedRole).then(() => { message.channel.send('Succesfully banned user!').then(successMsg => successMsg.delete({ timeout: 5000 })); }) });
逻辑说明
some()方法会遍历用户的所有角色,只要存在任意一个符合名称要求的角色就会返回true,刚好满足你需要的「满足任意一个权限就生效」的需求- 合并重复的事件监听逻辑后,避免了同个指令被两次处理的潜在异常
- 补充了角色添加成功的回调逻辑,避免异步操作未完成就返回成功提示的问题
- 后续如果需要新增其他可使用该指令的角色,直接在
some()的判断条件里追加|| r.name === '新角色名'即可
内容的提问来源于stack exchange,提问作者Latepate
相关产品推荐
相关产品推荐

