为何在guildMemberUpdate事件中无法获取角色增减操作用户的昵称?
问题原因及修复方案
你代码里存在3个核心问题导致无法正常获取对应数据:
- 变量未定义错误:审计日志条目变量命名为
memberLog,后续判断逻辑中错误使用了未声明的entry变量,会直接抛出异常中断逻辑执行 - 逻辑嵌套错误:角色移除的判断分支被放在了角色新增的判断分支内部,只有给用户新增角色时才会触发移除逻辑的判断,移除角色的场景永远无法命中对应逻辑
- 无法获取操作用户昵称的核心原因:审计日志返回的
executor是Discord User类的实例,仅存储用户全局账号信息,没有当前服务器内的昵称数据,需要手动拉取该用户在当前服务器的成员实例才能获取昵称
修复后代码
module.exports = { name: 'guildMemberUpdate', once: false, async execute(oldMember, newMember) { try { const fetchedLogs = await newMember.guild.fetchAuditLogs({ limit: 1, type: 'MEMBER_UPDATE', }); const memberLog = fetchedLogs.entries.first(); if (!memberLog) return console.log(`${newMember.displayName} 自行更新了个人信息`); const { executor, target } = memberLog; // 校验审计日志目标是否为当前更新的成员 if (target.id !== newMember.user.id) return; // 拉取操作用户在当前服务器的成员实例,获取昵称,降级逻辑处理取不到的情况 const operatorMember = await newMember.guild.members.fetch(executor.id); const operatorNickname = operatorMember?.displayName || executor.tag; const changedRole = newMember.roles.cache.difference(oldMember.roles.cache).first(); if (!changedRole) return; const logTime = new Date().toLocaleString('ru-RU', { timeZone: 'Europe/Moscow', hour12: false }); // 角色新增逻辑 if (oldMember.roles.cache.size < newMember.roles.cache.size) { console.log(`${logTime} 角色: ${changedRole.name} 授予人 - ${operatorNickname} 目标用户 - ${newMember.displayName} - <@${newMember.user.id}>`) } // 角色移除逻辑 if (oldMember.roles.cache.size > newMember.roles.cache.size) { console.log(`${logTime} 角色: ${changedRole.name} 移除人 - ${operatorNickname} 目标用户 - ${newMember.displayName} - <@${newMember.user.id}>`) } } catch (err) { return console.log(`Error: ${err.stack}`) } } };
额外注意事项
请确保你的机器人已经被授予查看审计日志权限,否则会拉取不到审计日志数据。
内容的提问来源于stack exchange,提问作者Svetlov
相关产品推荐
相关产品推荐

