Discord.js开发邀请日志工具时如何查询新成员的邀请人
实现逻辑说明
Discord 原生的 guildMemberAdd 事件不会直接返回邀请人信息,你需要通过缓存邀请使用次数对比的方式实现获取邀请人功能,具体实现步骤如下:
前置要求
- 开启机器人的
Server Members Intent(在 Discord 开发者后台的机器人设置页开启) - 给机器人授予
Manage Guild权限,否则无法拉取服务器的邀请列表
完整实现代码
首先初始化全局缓存存储邀请数据:
// 全局缓存,结构为 Map<guildId, Map<inviteCode, useCount>> const invites = new Map();
在机器人 ready 事件中预加载所有服务器的邀请数据:
client.on('ready', async () => { // 遍历机器人加入的所有服务器 for (const guild of client.guilds.cache.values()) { try { // 拉取服务器所有邀请 const guildInvites = await guild.invites.fetch(); // 存入缓存 invites.set(guild.id, new Map(guildInvites.map(invite => [invite.code, invite.uses]))); } catch (err) { // 无权限拉取邀请的服务器跳过 console.log(`无法拉取服务器 ${guild.name} 的邀请列表:`, err); } } console.log('机器人启动完成,邀请缓存已初始化'); });
监听邀请新增、删除事件,实时更新缓存:
// 有新邀请创建时更新缓存 client.on('inviteCreate', async (invite) => { const guildInvites = invites.get(invite.guild.id) || new Map(); guildInvites.set(invite.code, invite.uses); invites.set(invite.guild.id, guildInvites); }); // 有邀请被删除时更新缓存 client.on('inviteDelete', async (invite) => { const guildInvites = invites.get(invite.guild.id); if (guildInvites) { guildInvites.delete(invite.code); invites.set(invite.guild.id, guildInvites); } });
修改你的 guildMemberAdd 事件逻辑,对比缓存找到使用的邀请:
client.on('guildMemberAdd', async (member) => { const channel = member.guild.channels.cache.get('CHANNEL_ID'); if (!channel) return; try { // 拉取当前服务器最新的邀请列表 const newInvites = await member.guild.invites.fetch(); // 取缓存里的旧邀请数据 const oldInvites = invites.get(member.guild.id); // 找到使用次数+1的邀请 const usedInvite = newInvites.find(invite => oldInvites?.get(invite.code) === invite.uses - 1); // 更新缓存 invites.set(member.guild.id, new Map(newInvites.map(invite => [invite.code, invite.uses]))); let inviteInfo = '未知邀请链接'; if (usedInvite) { if (usedInvite.inviter) { inviteInfo = `${usedInvite.inviter.tag} (邀请码:${usedInvite.code})`; } else { inviteInfo = `服务器自定义 vanity 链接 (${usedInvite.code})`; } } channel.send(`欢迎 ${member.user.tag} ,邀请人:${inviteInfo}`); } catch (err) { console.log('获取邀请信息失败:', err); channel.send(`欢迎 ${member.user.tag} ,未查询到邀请人信息`); } });
异常场景说明
- 如果新成员是通过服务器发现页、或者过期一次性邀请加入,可能无法匹配到邀请记录
- 如果机器人没有
Manage Guild权限,会拉取邀请列表失败,需要提前授权
内容的提问来源于stack exchange,提问作者Glitchy Brick
相关产品推荐
相关产品推荐

