新成员角色添加日志功能开发问题求助
Discord角色变更日志代码错误分析
代码中的核心错误:
- 未定义变量:事件回调里没有
message和guild对象,应该通过newMember.guild获取服务器实例,而非凭空调用message.guild或guild。 - 角色对象直接转字符串无效:
oldMember.roles和newMember.roles是RoleManager对象,直接用${oldroles}会输出[object Object],需要提取角色名称列表。 - 审计日志空值未处理:
audit.entries.first()可能返回undefined(比如无审计日志记录),直接解构executor会抛出错误。 - 异步逻辑混乱:混合使用
.then()和async/await,导致代码可读性差且易出现异步问题,建议统一用async/await。 - 频道存在性未校验:
channels.cache.get(channelID)可能返回undefined(比如频道不存在或机器人无权限访问),直接调用send会报错。 - 依赖未确认导入:未确保导入
Events、AuditLogEvent、EmbedBuilder这些Discord.js核心模块,缺少导入会导致变量未定义。 - Intents权限缺失:如果是Discord.js v14+,客户端初始化时必须启用
GuildMembers和Guilds意图,否则无法触发GuildMemberUpdate事件。
修正后的代码:
// 确保导入所需模块(根据你的Discord.js版本调整) const { Client, Events, AuditLogEvent, EmbedBuilder, GatewayIntentBits } = require('discord.js'); // 客户端初始化时必须启用对应意图 const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers ] }); client.on(Events.GuildMemberUpdate, async (oldMember, newMember) => { const guild = newMember.guild; try { // 获取角色变更对应的审计日志 const auditLogs = await guild.fetchAuditLogs({ type: AuditLogEvent.MemberRoleUpdate, limit: 1 }); const auditEntry = auditLogs.entries.first(); if (!auditEntry) return; // 无日志记录则退出 const { executor } = auditEntry; // 转换角色为可读的名称列表 const oldRolesList = oldMember.roles.cache.map(role => role.name).join(', ') || '无角色'; const newRolesList = newMember.roles.cache.map(role => role.name).join(', ') || '无角色'; const channelID = '1164406572932415518'; const logChannel = guild.channels.cache.get(channelID); if (!logChannel) { console.log('日志频道不存在或无法访问'); return; } // 构建嵌入消息 const embed = new EmbedBuilder() .setColor(0xFF0000) .setTitle('成员角色变更') .addFields( { name: '用户', value: `${newMember.user.tag} (${newMember.id})`, inline: false }, { name: '操作人', value: executor ? `${executor.tag} (${executor.id})` : '未知', inline: false }, { name: '旧角色', value: oldRolesList, inline: false }, { name: '新角色', value: newRolesList, inline: false } ) .setTimestamp() .setFooter({ text: 'Mod Logging System' }); await logChannel.send({ embeds: [embed] }); } catch (error) { console.error('记录角色变更时出错:', error); } }); client.login('你的机器人Token');
额外注意事项:
- 确保机器人拥有
ViewAuditLog权限,否则无法获取审计日志。 - 角色变更的审计日志类型是
AuditLogEvent.MemberRoleUpdate,而非GuildMemberUpdate,后者对应更宽泛的成员信息变更。 - 若使用Discord.js v13,部分枚举值和API会有差异,比如
GatewayIntentBits对应Intents.FLAGS。
内容的提问来源于stack exchange,提问作者Tom Andriunas
相关产品推荐
相关产品推荐

