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);
关键修复点说明
- 精准触发命令:
- 先过滤机器人自身消息,避免循环
- 严格检查消息格式,只有
-invite或者-invite @成员才会执行逻辑
- 优化API请求:
- 用
async/await替代嵌套.then(),代码更清晰,且只请求一次邀请数据
- 用
- 正确统计邀请数:
- 筛选目标用户创建的所有邀请,累加每个邀请的
uses(实际被使用的次数),得到真实邀请人数
- 筛选目标用户创建的所有邀请,累加每个邀请的
- 增强鲁棒性:
- 添加错误捕获,处理机器人权限不足等意外情况
- 统一变量声明,避免重复定义导致的逻辑混乱
内容的提问来源于stack exchange,提问作者SKITTER
相关产品推荐
相关产品推荐

