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

Discord.js邀请统计机器人重复执行与命令触发异常问题求助

修复Discord.js邀请统计机器人的问题

我来帮你搞定这个邀请统计机器人的问题,先梳理下你当前代码里的几个核心问题,再给你修复后的完整代码和详细说明:

原代码的主要问题

  • 命令触发完全失效:没有判断消息是否是-invite命令,导致任何输入都会触发这段逻辑
  • 重复API请求:嵌套了两次message.guild.fetchInvites(),纯粹是冗余操作,浪费服务器资源
  • 邀请数统计错误:userInviteCount一直是0,根本没累加实际的邀请使用次数
  • 语法与变量混乱:if(message.content === '-invite')缺少大括号,还重复声明targetUser变量,逻辑很容易出错

修复后的完整代码

const Discord = require('discord.js');
const client = new Discord.Client();
const prefix = "-";

client.on('ready', () => {
  client.user.setStatus('available');
  client.user.setPresence({ 
    game: { 
      name: 'ᴛʜᴇ ᴏꜰꜰɪᴄɪᴀʟ ʙᴄ', 
      type: "STREAMING", 
      url: "https://www.youtube.com/watch?v=-mTkE8YJEPU" 
    } 
  });
  console.log('机器人已正常上线!');
});

client.on('message', async message => {
  // 忽略机器人自己发的消息,避免循环触发
  if (message.author.bot) return;
  
  // 只处理以指定前缀开头的-invite命令
  if (!message.content.startsWith(prefix) || message.content.slice(prefix.length) !== 'invite') return;

  let targetUser;
  const isAnotherUserLookup = message.mentions.members.first() !== null;

  // 确定查询目标:@了成员就查该成员,否则查消息发送者
  if (isAnotherUserLookup) {
    targetUser = message.mentions.members.first().user;
  } else {
    targetUser = message.author;
  }

  try {
    // 仅执行一次邀请数据获取
    const invites = await message.guild.fetchInvites();
    // 筛选目标用户创建的所有邀请,累加使用次数
    const userInvites = invites.filter(invite => invite.inviter?.id === targetUser.id);
    let userInviteCount = 0;
    userInvites.forEach(invite => {
      userInviteCount += invite.uses;
    });

    // 根据查询对象发送对应回复
    if (isAnotherUserLookup) {
      message.channel.send(`用户 **${targetUser.username}** 已邀请 ${userInviteCount} 位用户加入服务器。`);
    } else {
      message.reply(`你已邀请 ${userInviteCount} 位用户加入服务器,继续加油!`);
    }
  } catch (error) {
    // 处理权限不足等异常情况
    message.channel.send('获取邀请数据失败,请确保机器人拥有「管理服务器」权限!');
    console.error(error);
  }
});

client.login(process.env.token);

关键修复点说明

  1. 精准触发命令:
    • 先过滤机器人自身消息,避免循环
    • 严格检查消息格式,只有-invite或者-invite @成员才会执行逻辑
  2. 优化API请求:
    • 用async/await替代嵌套.then(),代码更清晰,且只请求一次邀请数据
  3. 正确统计邀请数:
    • 筛选目标用户创建的所有邀请,累加每个邀请的uses(实际被使用的次数),得到真实邀请人数
  4. 增强鲁棒性:
    • 添加错误捕获,处理机器人权限不足等意外情况
    • 统一变量声明,避免重复定义导致的逻辑混乱

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:51:26