Discord.js Node.js机器人等级系统实现等级达标自动授予对应角色
Discord等级系统自动发放身份角色实现
原有手动领取代码失效原因
- 逻辑语法错误:判断等级时用了单等号赋值,且没有正确关联用户ID对应的等级数据,变量未提前定义就直接使用
- 异步逻辑缺失:
guild.roles.fetch()是异步请求,没有添加await等待结果,就直接引用未定义的role变量执行加角色操作 - 成员获取逻辑偏差:硬编码要求@用户才能操作,没有默认取发指令的当前用户
自动发放功能实现思路
不需要额外设计手动领取流程,直接把发角色的逻辑嵌入到现有等级升级的判断分支里,实现升级即自动到账:
- 提前维护一份「等级-角色ID」映射配置表,和预期的"达到5级发Level 5角色"规则一一对应
- 触发条件完全复用现有的XP满值、等级+1的判断逻辑,不需要额外加触发指令
- 加角色前先校验机器人的权限层级,避免出现无权限加角色的报错
适配现有代码的修改内容
- 在代码顶部添加等级角色映射配置,按需替换成自己服务器的角色ID:
const levelRoleMap = { 2: '816587197868015646', 5: '你的Level 5角色ID', 10: '你的Level 10角色ID' } - 把原有消息事件的回调函数改成async异步函数,支持await异步操作:
将bot.on("message", function(message){修改为bot.on("message", async function(message){ - 在等级升级的判断块中,替换原有仅发送升级提示的代码,加入自动发角色逻辑:
if(xpfile[message.author.id].xp > xpfile[message.author.id].reqxp){ // 原有XP计算、等级提升逻辑完全保留 xpfile[message.author.id].xp -= xpfile[message.author.id].reqxp xpfile[message.author.id].reqxp *= 1.5 xpfile[message.author.id].reqxp = Math.floor(xpfile[message.author.id].reqxp) const newLevel = xpfile[message.author.id].level + 1 xpfile[message.author.id].level = newLevel // 新增自动发角色逻辑 if(levelRoleMap[newLevel]) { const targetRoleId = levelRoleMap[newLevel] try { await message.member.roles.add(targetRoleId) message.reply(`恭喜升到${newLevel}级!已自动发放对应等级角色 🎉`) } catch (err) { console.error('角色发放失败:', err) message.reply('升级成功,但角色发放失败,请联系管理员检查权限配置') } } else { message.reply(`Is now Level **${newLevel}**! :tada:`) } }
必要的配置检查
- 在Discord开发者后台为机器人开启
Server Members Intent和Message Content Intent权限,否则无法正常读取消息、获取服务器成员数据 - 将机器人本身的角色拖到服务器角色列表的最上方,位置必须高于所有要发放的等级角色,否则机器人没有权限给成员添加低层级角色
- 移除原有的失效
/reward手动领取代码块即可,自动发角色的逻辑不需要额外指令触发
内容的提问来源于stack exchange,提问作者Pukima
相关产品推荐
相关产品推荐

