如何更新Discord bot的服务器成员缓存?
解决方案
问题原因
你当前的代码仅读取执行时刻本地已有的成员缓存快照,既不会主动从Discord服务端拉取最新的全量成员数据,也不会监听成员变动事件自动同步缓存,因此只会拿到一次静态数据。
方案1:手动触发全量缓存更新
如果需要主动拉取最新的成员数据更新缓存,可以调用GuildMemberManager.fetch()方法,使用前需确保:
- 初始化Bot时已开启
GUILD_MEMBERS意图 - Discord开发者后台已给Bot开启
Server Members Intent权限
代码示例:
const list = bot.guilds.cache.get('服务器ID') // 主动拉取服务端全量成员,自动更新本地缓存 const allMembers = await list.members.fetch() const allUsers = [] allMembers.each(member => allUsers.push(member.user.id))
方案2:监听事件实现自动缓存更新
如果需要缓存随服务器成员变动自动更新,可以监听以下三个核心事件同步数据:
guildMemberAdd:新成员加入服务器时触发guildMemberRemove:成员离开服务器时触发guildMemberUpdate:成员信息(昵称、角色等)变更时触发
代码示例:
// 新成员加入自动同步 bot.on('guildMemberAdd', member => { allUsers.push(member.user.id) }) // 成员离开自动同步 bot.on('guildMemberRemove', member => { const targetIndex = allUsers.findIndex(id => id === member.user.id) if (targetIndex !== -1) { allUsers.splice(targetIndex, 1) } }) // 成员信息变更按需处理 bot.on('guildMemberUpdate', (oldMember, newMember) => { // 业务需要感知成员信息变更时在此处编写逻辑 })
注意事项
成员数超过100的服务器默认不会在Bot启动时拉取全量成员缓存,首次获取全量成员必须主动调用fetch()方法
内容的提问来源于stack exchange,提问作者Noam Vardi
相关产品推荐
相关产品推荐

