使用discord.js 12开发Discord机器人时ban指令对所有用户开放求助
修复方案
你只需要在$ban指令的逻辑入口处添加权限校验逻辑即可,discord.js 12.0版本中可通过GuildMember.hasPermission()方法校验用户是否拥有服务器封禁权限:
- 首先在校验
message.content.startsWith('$ban')为真后,第一行添加权限判断:如果触发指令的用户没有BAN_MEMBERS权限,直接终止逻辑返回提示 - 你还可以额外添加校验逻辑,避免用户封禁权限/角色等级高于自身的对象,也可以补充校验机器人自身是否拥有封禁权限避免报错
修改后的$ban指令代码片段
if (!message.guild) return; // 匹配$ban指令 if (message.content.startsWith('$ban')) { // 核心校验:仅拥有封禁成员权限的用户可触发指令 if (!message.member.hasPermission("BAN_MEMBERS")) { return message.channel.send("你没有权限使用封禁指令"); } // 可选补充:校验机器人自身是否拥有封禁权限 if (!message.guild.me.hasPermission("BAN_MEMBERS")) { return message.channel.send("机器人没有封禁成员的权限,请先配置服务器权限"); } // 可选补充:禁止封禁服务器所有者 if (member.id === message.guild.ownerID) { return message.channel.send("无法封禁服务器所有者"); } // 可选补充:禁止封禁角色等级高于自己的用户 if (member.roles.highest.position >= message.member.roles.highest.position && message.member.id !== message.guild.ownerID) { return message.channel.send("你无法封禁角色等级高于或等于你的用户"); } // 原有业务逻辑保持不变 const user = message.mentions.users.first(); if (user) { const member = message.guild.members.resolve(user); if (member) { member .ban({ reason: 'They were bad!', }) .then(() => { message.channel.send(`Successfully banned ${user.tag}`); }) .catch(err => { message.channel.send('I was unable to ban the member'); console.error(err); }); } else { message.channel.send("That user isn't in this guild!"); } } else { message.channel.send("You didn't mention the user to ban!"); } }
额外注意事项
- 现有代码中的
~mute指令逻辑存在复制错误:当前逻辑为拥有KICK_MEMBERS权限的用户触发~mute指令时,会收到将被封禁的提示,你可以根据实际需求调整该部分逻辑 - 你当前配置的普通指令前缀为
~,封禁指令前缀为$,如果需要统一前缀可自行调整匹配规则
内容的提问来源于stack exchange,提问作者CaptainBeast123
相关产品推荐
相关产品推荐

