discord.js跨分片向指定用户发送DM避免重复发送问题咨询
问题根因
你当前的实现通过全分片广播执行发送逻辑,只要对应分片能拉取到目标用户就会触发发送操作。当目标用户同时加入了归属不同分片的多个服务器时,多个分片都会命中判定条件,最终导致重复发送。
可行解决方案
方案1:去掉全分片广播,单分片直接执行(最推荐)
发送DM不需要依赖用户所在服务器的分片归属,任意分片都可以直接通过Discord API拉取用户信息并发送私信,不需要全分片广播执行。
修改后代码如下:
// 直接在当前分片执行即可,无需广播到所有分片 const user = await client.users.fetch(userid).catch(() => null) if (user) { await user.send({ embeds: [embed] }).catch(() => { // 可在此处添加私信发送失败的降级逻辑,比如用户关闭了私信权限 }) }
方案2:保留广播逻辑,新增分片唯一判定条件
如果确实有业务场景需要全分片广播校验,可以增加判定逻辑,保证只有1个分片会执行发送操作:
client.shard.broadcastEval(async (c, { userid, embed }) => { const user = await c.users.fetch(userid).catch(() => null) if (!user) return false // 取用户加入的所有公会对应的分片ID,仅当当前分片是最小ID时才执行发送 const guildShardIds = user.mutualGuilds.map(guild => Math.floor(Number(BigInt(guild.id) >> 22n) % c.shard.count)) if (Math.min(...guildShardIds) === c.shard.ids[0]) { await user.send({ embeds: [embed] }).catch(() => {}) return true } return false }, { context: { userid, embed } })
注:方案2需要你的Bot开启GUILDS(服务器)意图,否则无法正确获取用户和Bot共有的服务器列表
内容的提问来源于stack exchange,提问作者Altpapier
相关产品推荐
相关产品推荐

