如何解决Discord机器人在成员角色变动时误报昵称更新的问题
问题原因及修复方案
问题根因
- 代码存在拼写错误:
oldMember.nickame少写了1个字母n,正确属性名为nickname。该错误会导致旧昵称永远返回undefined,只要成员的任何属性变动触发了guildMemberUpdate事件(包括角色变更、头像变更、超时状态变更等),判断逻辑都会误认为昵称发生了修改,进而触发推送。 - 空值处理逻辑不够严谨:直接用
String()转换null值会得到字符串"null",如果有成员的昵称就是字面量的"null",会出现判断误差。
修复后代码
// 统一处理昵称获取逻辑,null代表未设置自定义昵称 function getMemberNick(member) { return member.nickname ?? null; } const oldNick = getMemberNick(oldMember); const newNick = getMemberNick(newMember); // 仅当昵称真实发生变更时才推送日志 if (oldNick !== newNick) { gwebhook.send({ embeds: [new Discord.MessageEmbed() .setAuthor(newMember.guild.name, newMember.guild.iconURL({dynamic: true})) .setTitle('Member Nickname Update') .setColor("YELLOW") .addField('Before', oldNick ?? "无自定义昵称", true) .addField('After', newNick ?? "无自定义昵称", true)] }); }
补充说明
如果你使用的是Discord.js v14及以上版本,需要将Discord.MessageEmbed替换为Discord.EmbedBuilder,对应构造方法写法同步调整即可。
内容的提问来源于stack exchange,提问作者AHQ Secret
相关产品推荐
相关产品推荐

