Discord机器人Kick系统如何添加使用权限校验
Discord机器人踢人功能权限管控实现
你现有的代码未做任何权限拦截,所有用户只要触发+kick命令就能触发踢人逻辑,在执行踢人操作前补三层校验即可实现合规的权限管控:
- 命令发起者权限校验:校验执行命令的用户是否拥有服务器的「踢出成员」权限,无权限直接拦截返回提示
- 机器人自身权限校验:校验机器人本身在当前服务器是否被授予「踢出成员」权限,避免权限不足导致接口报错
- 角色层级校验:对比被踢成员的角色层级,确保发起命令的用户、机器人的角色位置都高于被踢成员,避免出现低权限用户踢管理员、机器人无法踢高角色成员的异常情况
修改后的完整可运行代码如下:
client.on('message', message => { if (!message.guild) return; if (message.content.startsWith('+kick')) { // 校验发起命令用户的踢人权限 if (!message.member.permissions.has('KICK_MEMBERS')) { return message.channel.send('你没有踢出成员的管理权限,无法执行该操作'); } // 校验机器人自身的踢人权限 if (!message.guild.me.permissions.has('KICK_MEMBERS')) { return message.channel.send('我当前没有被授予踢出成员的权限,无法执行操作'); } const user = message.mentions.users.first(); if (!user) { return message.channel.send("你没有@需要踢出的目标用户"); } const member = message.guild.members.resolve(user); if (!member) { return message.channel.send("该用户不在当前服务器内"); } // 校验角色层级,禁止踢角色层级高于/等于操作者、机器人的成员 if ( member.roles.highest.position >= message.member.roles.highest.position || member.roles.highest.position >= message.guild.me.roles.highest.position ) { return message.channel.send("目标成员角色层级不低于你或我,无法执行踢出操作"); } member .kick({ reason: 'They were bad!', }) .then(() => { message.channel.send(`已成功踢出用户 ${user.tag}`); }) .catch(err => { message.channel.send('踢出成员时出现未知错误'); console.error(err); }); } });
补充说明:如果需要自定义踢人原因,可以扩展命令参数解析逻辑,把
+kick @用户 自定义原因里的原因字段提取后,传入kick方法的reason参数即可。
内容的提问来源于stack exchange,提问作者Almis
相关产品推荐
相关产品推荐

