You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

新成员角色添加日志功能开发问题求助

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:48:22