Discord reaction role指令运行时Bot收到反应后未分配角色问题求助
问题修复方案
- 自定义emoji匹配逻辑错误
代码中定义的yellowTeamEmoji、blueTeamEmoji是带ID的完整自定义emoji格式串,但触发判断时使用的reaction.emoji.name仅会返回emoji的纯名称(wings/crowshine),二者永远匹配失败,导致身份组分配逻辑不执行。
修复可改为匹配emoji ID,示例修改如下:
// 以add事件的判断为例,remove事件做相同修改即可 if (reaction.emoji.id === '851814106146144326') { await reaction.message.guild.members.cache.get(user.id).roles.add(yellowTeamRole); } if (reaction.emoji.id === '851814012290203680') { await reaction.message.guild.members.cache.get(user.id).roles.add(blueTeamRole); }
- 事件监听器重复注册问题
messageReactionAdd、messageReactionRemove的监听器注册逻辑放在了指令的execute函数内部,每次执行reactionrole指令都会新增一组监听器,多次执行后会出现单次反应触发多次身份组操作的问题,还会引发内存泄漏。
修复方案:将两个事件的监听逻辑移到Bot客户端初始化的全局事件注册代码中,不要放在单次指令的执行逻辑里。 - 权限配置校验
需确认Bot满足两个权限要求:
- 服务器权限中已开启「管理角色」权限
- Bot自身的身份组在服务器身份组排序中的位置,高于需要分配的
2D simp、3D simp两个身份组,否则没有权限调整这两个身份组的归属
- 可选优化:增加空值校验
当前代码未对身份组查找结果做判断,如果服务器内不存在对应名称的身份组,后续调用roles.add/remove会抛出异常,可增加如下判断:
const yellowTeamRole = message.guild.roles.cache.find(role => role.name === "2D simp"); const blueTeamRole = message.guild.roles.cache.find(role => role.name === "3D simp"); if (!yellowTeamRole || !blueTeamRole) { return message.channel.send('未找到对应身份组,请检查名称配置是否正确'); }
内容的提问来源于stack exchange,提问作者Amy Lent
相关产品推荐
相关产品推荐

