如何让guildMemberUpdate事件区分角色变更与昵称变更两类触发场景
问题修复方案
根因分析
你当前代码的核心问题有两个:
oldMember.roles和newMember.roles都是GuildRoleManager类的实例,属于引用类型数据,直接用!==对比的是对象的内存地址,两个不同实例永远不相等,所以第一个判断分支永远会触发,和角色是否真的变更无关。- 你使用了
else if互斥判断逻辑,如果遇到角色和昵称同时变更的场景,只会执行排在前面的操作,无法同时处理两类变更。
修复后的代码示例
module.exports = new Event("guildMemberUpdate", (oldMember, newMember)=>{ // 取出新旧角色ID排序后对比,避免引用类型比对错误 const oldRoleIds = oldMember.roles.cache.map(role => role.id).sort(); const newRoleIds = newMember.roles.cache.map(role => role.id).sort(); const isRoleChanged = oldRoleIds.join(',') !== newRoleIds.join(','); const isNicknameChanged = oldMember.nickname !== newMember.nickname; // 角色变更逻辑 if (isRoleChanged) { // DO ACTION 1 } // 昵称变更逻辑,拆成独立if,支持同时变更时两类逻辑都执行 if (isNicknameChanged) { // DO ACTION 2 } })
注意事项
- 请确保你的机器人已经在Discord开发者后台开启了
Server Members Intent权限,否则guildMemberUpdate事件无法正常触发。 - 如果你确实需要两类变更互斥执行(仅当角色未变更时才判断昵称变更),可以把第二个
if改回else if。
内容的提问来源于stack exchange,提问作者Zenxy
相关产品推荐
相关产品推荐

