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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:15:03