Discord.js v12 如何移除原有持有者的指定身份组并分配给新触发用户
解决方案
你可以在当前模块的顶层声明一个变量存储上一位身份组持有者的用户ID,每次触发命令时先执行移除旧持有者身份组的逻辑,再给当前用户分配身份组即可,修改后的代码如下:
// 存储上一位身份组持有者的用户ID let lastRoleHolderId = null; // 目标身份组ID,可根据需求修改 const TARGET_ROLE_ID = '886996311117795429'; module.exports = { name: 'what', description: 'Responds with You are stuck with it and adds role!', async execute(message, args) { // 先回复触发消息 message.channel.send('You are stuck with it!'); // 存在上一位持有者时,先移除其对应身份组 if (lastRoleHolderId) { try { const lastMember = await message.guild.members.fetch(lastRoleHolderId); await lastMember.roles.remove(TARGET_ROLE_ID); } catch (err) { // 若上一位用户已离开服务器、身份组已被移除等异常情况,直接跳过 console.error('移除旧身份组失败:', err); } } // 给当前触发命令的用户添加身份组 try { await message.member.roles.add(TARGET_ROLE_ID); // 更新上一位持有者ID为当前触发用户 lastRoleHolderId = message.member.id; } catch (err) { console.error('添加身份组失败:', err); } } }
注意事项
- 要确保你的机器人拥有管理身份组权限,且目标身份组的层级低于机器人本身的身份组层级,否则会出现权限不足导致添加/移除失败的情况
- 上述写法在机器人重启后会清空历史持有者记录,如果你需要重启后仍能保留上一位持有者的记录,可以将
lastRoleHolderId写入本地文件或数据库中持久化存储
内容的提问来源于stack exchange,提问作者Nicholas Osborne
相关产品推荐
相关产品推荐

