Discord.js按用户名含指定标签自动分配角色功能代码失效求助
故障原因&修复方案
核心问题
你当前的代码失效主要是 Discord.js API 版本不兼容导致的,你使用的get()、addRole()、removeRole()都是 v11 版本的废弃语法,目前绝大多数运行环境使用的都是 v12 及以上版本,集合查询、角色操作的语法都有调整。
除此之外还有几个常见的配置问题会导致功能失效:
- 机器人没有在目标服务器开启「管理角色」权限
- 机器人的自身角色在服务器角色列表中的层级,低于你要分配的目标角色
- 仅监听了全局用户名修改事件,用户修改服务器专属昵称时不会触发判断逻辑
- 缺少容错判断,获取服务器、成员对象失败时会静默中断执行
修复后代码(适用 Discord.js v12/v13/v14 版本)
// 监听全局用户名修改 client.on("userUpdate", async (oldUser, newUser) => { if (oldUser.username === newUser.username) return; const tag = "⚡"; const serverId = "793143091350470708"; const roleId = "888436049620119562"; try { // 获取服务器对象 const guild = client.guilds.cache.get(serverId); if (!guild) return; // 获取服务器成员对象 const member = guild.members.cache.get(newUser.id); if (!member) return; // 检查是否有对应角色 const hasRole = member.roles.cache.has(roleId); const hasTag = newUser.username.includes(tag); if (hasTag && !hasRole) { await member.roles.add(roleId); } else if (!hasTag && hasRole) { await member.roles.remove(roleId); } } catch (err) { // 可自行打印错误排查问题 console.error("角色操作失败:", err); } }) // 可选:监听服务器昵称修改事件,实现昵称包含标签也分配角色 client.on("guildMemberUpdate", async (oldMember, newMember) => { const tag = "⚡"; const roleId = "888436049620119562"; // 只处理目标服务器的事件 if (newMember.guild.id !== "793143091350470708") return; // 昵称未修改直接跳过 if (oldMember.nickname === newMember.nickname) return; try { const hasRole = newMember.roles.cache.has(roleId); // 同时检测用户名和昵称 const hasTag = newMember.user.username.includes(tag) || (newMember.nickname && newMember.nickname.includes(tag)); if (hasTag && !hasRole) { await newMember.roles.add(roleId); } else if (!hasTag && hasRole) { await newMember.roles.remove(roleId); } } catch (err) { console.error("昵称变更角色操作失败:", err); } })
生效验证
修改代码后重启机器人,修改用户名/昵称包含对应标签,观察控制台是否有报错,如果有权限相关报错,回到服务器角色设置调整机器人角色层级和权限即可。
内容的提问来源于stack exchange,提问作者hero
相关产品推荐
相关产品推荐

