Discord.js 如何查询退服用户的邀请人并更新MongoDB计数
问题根因与修复方案
核心逻辑错误
你当前的对比逻辑完全不适用于退服场景:Discord 邀请码的uses计数仅在用户加入服务器时上涨,用户退服时不会回调减少,因此invite.uses != client.invites[invite.code]判断在guildMemberRemove事件中永远不会触发,这是无响应的最主要原因。
必要逻辑改造
你需要在用户加入服务器时就提前存储该用户对应的邀请人信息,退服时直接查询已存储的关联数据即可,无需再对比邀请码计数。
第一步:新增用户邀请关联存储(示例Schema)
// 新增UsedInvite Schema,存储用户和邀请人的关联关系 const usedInviteSchema = new mongoose.Schema({ GuildID: String, UserID: String, InviterID: String }) const UsedInvite = mongoose.model('UsedInvite', usedInviteSchema)
第二步:补全加入事件的存储逻辑
client.on('guildMemberAdd', async (member) => { if (member.user.bot) return const newInvites = await member.guild.fetchInvites() const oldInvites = client.invites.get(member.guild.id) // 找到使用次数上涨的邀请码 const usedInvite = newInvites.find(inv => oldInvites.get(inv.code)?.uses < inv.uses) // 更新本地存储的邀请码计数 client.invites.set(member.guild.id, newInvites) if (!usedInvite?.inviter) return // 存储用户和邀请人的关联 await UsedInvite.create({ GuildID: member.guild.id, UserID: member.id, InviterID: usedInvite.inviter.id }) // 原有加入统计逻辑可以写在这里... })
第三步:重写退服事件逻辑
client.on('guildMemberRemove', async (member) => { if (member.user.bot) return const channel = member.guild.channels.cache.get('843465196827967498') // 直接查询提前存储的邀请人关联 const inviteRecord = await UsedInvite.findOne({ GuildID: member.guild.id, UserID: member.id }) if (!inviteRecord) return const inviter = await member.guild.members.fetch(inviteRecord.InviterID).catch(() => null) if (inviter) { channel.send(`${member.user.tag} 退出,邀请人为 ${inviter.user.tag}`) // 更新邀请人退服计数 await InviteLogger.findOneAndUpdate( { ServerID: member.guild.id, UserID: inviter.id }, { $inc: { Leave: 1 } }, { new: true, upsert: true } ) } // 可选:删除已退服用户的关联记录节省空间 await UsedInvite.deleteOne({ GuildID: member.guild.id, UserID: member.id }) })
其他需要检查的配置项
- 确认Discord开发者后台已经开启
Server Members Intent和Guilds Intent,代码初始化client时也需在intents中声明对应项 - 确认bot拥有
Manage Server权限,否则无法拉取服务器邀请码列表 - 启动bot时需要预先拉取所有加入服务器的邀请码存入
client.invites,避免加入事件首次对比无数据 - 所有涉及
inviter的操作都要做空判断,避免用户通过 vanity 链接、服务器发现页加入无邀请人的场景导致代码报错
内容的提问来源于stack exchange,提问作者Glitchy Brick
相关产品推荐
相关产品推荐

