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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 06:45:04