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

如何实现Discord圣诞机器人检测昵称Emoji并自动管理角色

Discord圣诞机器人功能完善方案

原代码存在的核心问题

  • 未正确处理members.fetch()的异步特性,直接赋值会得到Promise而非成员数组
  • 变量作用域错误,userKip在forEach循环外部引用会导致报错
  • 角色操作API调用路径错误,未使用成员对象的角色操作方法
  • 未处理用户无昵称(使用用户名)的场景,会触发undefined错误
  • 缺少昵称变化实时监听逻辑,无法满足"立即移除角色"的需求
  • 定时任务间隔设为10秒,不符合"每小时检查"的要求
  • 配置文件仅启动时读取一次,无法动态开关功能

完善后的完整代码

const fs = require('fs');
const { Client, GatewayIntentBits } = require('discord.js');

// 初始化客户端,开启必要网关意图
const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMembers
  ]
});

// 核心配置项,请根据实际情况替换
const GUILD_ID = '你的服务器ID';
const CHRISTMAS_ROLE_ID = '1042423440264663160';
const CHECK_INTERVAL = 3600000; // 每小时检查一次(单位:毫秒)
const ROLE_CONFIG_PATH = './database/role.txt';

// 通用函数:检查用户昵称并更新圣诞角色
async function updateChristmasRole(member) {
  // 获取用户显示名称:优先取昵称,无昵称则用用户名
  const displayName = member.nickname || member.user.username;
  const hasChristmasEmoji = displayName.includes('🎄') || displayName.includes('🎅');
  const targetRole = member.guild.roles.cache.get(CHRISTMAS_ROLE_ID);

  if (!targetRole) {
    console.error('错误:未找到指定的圣诞角色,请检查角色ID');
    return;
  }

  try {
    // 判断是否需要添加/移除角色
    if (hasChristmasEmoji && !member.roles.cache.has(CHRISTMAS_ROLE_ID)) {
      await member.roles.add(targetRole);
      console.log(`已为用户 ${member.user.tag} 添加圣诞角色`);
    } else if (!hasChristmasEmoji && member.roles.cache.has(CHRISTMAS_ROLE_ID)) {
      await member.roles.remove(targetRole);
      console.log(`已为用户 ${member.user.tag} 移除圣诞角色`);
    }
  } catch (error) {
    console.error(`处理用户 ${member.user.tag} 角色时出错:`, error);
  }
}

// 批量检查服务器所有用户的定时任务
async function checkAllMembers() {
  try {
    // 每次检查前重新读取配置,支持动态开关功能
    const roleConfig = fs.readFileSync(ROLE_CONFIG_PATH, 'utf8').trim();
    if (roleConfig !== 'aan') {
      console.log('圣诞角色功能已关闭,跳过本次批量检查');
      return;
    }

    const targetGuild = client.guilds.cache.get(GUILD_ID);
    if (!targetGuild) {
      console.error('错误:无法找到目标服务器,请检查服务器ID');
      return;
    }

    // 异步获取服务器所有成员
    const members = await targetGuild.members.fetch();
    console.log(`开始批量检查服务器内 ${members.size} 名用户`);

    // 逐个处理成员,跳过机器人用户
    for (const [_, member] of members) {
      if (member.user.bot) continue;
      await updateChristmasRole(member);
    }
    console.log('批量检查完成');
  } catch (error) {
    console.error('批量检查用户时发生错误:', error);
  }
}

client.once('ready', () => {
  console.log('圣诞机器人已成功上线');
  // 机器人启动时立即执行一次批量检查
  checkAllMembers();
  // 设置定时任务,每小时执行一次批量检查
  setInterval(checkAllMembers, CHECK_INTERVAL);
});

// 监听用户昵称变化事件,实时更新角色
client.on('guildMemberUpdate', async (oldMember, newMember) => {
  // 仅当用户显示名称发生变化时触发
  const oldDisplayName = oldMember.nickname || oldMember.user.username;
  const newDisplayName = newMember.nickname || newMember.user.username;
  if (oldDisplayName === newDisplayName) return;

  // 检查功能是否开启
  const roleConfig = fs.readFileSync(ROLE_CONFIG_PATH, 'utf8').trim();
  if (roleConfig !== 'aan') return;

  // 实时更新用户角色
  await updateChristmasRole(newMember);
});

// 登录机器人
client.login('你的机器人Token');

关键改进说明

  • 异步处理优化:使用await正确获取成员列表,避免Promise相关错误
  • 逻辑复用:提取updateChristmasRole通用函数,同时支持批量检查和实时监听场景
  • 边界情况处理:兼容用户无昵称的场景,跳过机器人用户减少无效操作
  • 实时响应:通过guildMemberUpdate事件监听昵称变化,实现角色的即时调整
  • 动态配置:每次执行任务时重新读取配置文件,无需重启机器人即可开关功能
  • 错误防护:添加异常捕获逻辑,避免单个用户处理失败导致整个任务中断
  • 配置清晰:将核心配置项集中管理,便于后续修改维护

内容的提问来源于stack exchange,提问作者LijmPistool

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:42:10