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

JDA 3.8.3_462无法给群组所有用户发送私信通知的问题排查

问题分析

你的代码里有两个核心问题,导致只有给bot发私信的用户能收到通知:

  1. 异步操作的时序错误:openPrivateChannel().queue()是异步执行的——调用它之后,JDA会在后台去创建私信频道,但你紧接着就调用getPrivateChannels()遍历现有频道,这时候新创建的频道还没被缓存下来,所以只会给之前已经和bot有过私信往来的用户(也就是触发事件的这个用户)发消息。
  2. 没有利用异步回调发送消息:你没有在成功打开私信频道的第一时间发送通知,而是依赖后续遍历缓存频道的操作,完全错过了那些刚创建的新频道。
修正后的代码
@Override 
public void onPrivateMessageReceived(final PrivateMessageReceivedEvent event) {
    if (event.getAuthor().isBot()) {
        return;
    }
    // 获取目标群组(这里取第一个群组,你可以根据需求调整为指定ID或名称)
    Guild targetGuild = event.getJDA().getGuilds().get(0);
    // 遍历群组内所有成员
    targetGuild.getMembers().forEach(member -> {
        User user = member.getUser();
        // 跳过bot用户,避免无效发送
        if (user.isBot()) {
            return;
        }
        // 打开私信频道,并在成功回调中直接发送消息
        user.openPrivateChannel()
           .queue(
               // 成功打开频道时执行:发送通知消息
               privateChannel -> privateChannel.sendMessage("ZDAROVA").queue(
                   // 消息发送成功的日志(可选)
                   success -> System.out.println("已发送消息给 " + user.getAsTag()),
                   // 消息发送失败的异常处理(比如用户拒收私信)
                   error -> System.err.println("无法给 " + user.getAsTag() + " 发消息: " + error.getMessage())
               ),
               // 打开频道失败的异常处理(比如用户设置了隐私权限)
               error -> System.err.println("无法打开和 " + user.getAsTag() + " 的私信频道: " + error.getMessage())
           );
    });
}
关键改进说明
  • 异步回调直接发送:在openPrivateChannel()的成功回调里立即发送消息,确保只要频道创建成功,就会立刻推送通知,不再依赖缓存的频道列表。
  • 过滤bot用户:避免给其他bot发送无效消息,也防止bot给自己发消息造成循环。
  • 异常捕获:添加了失败回调,方便你排查哪些用户无法接收消息(比如用户关闭了允许bot发起私信的权限)。
额外提示

如果你的群组人数较多,注意Discord的速率限制——JDA会自动处理大部分限流,但如果一次性发送几百条消息,可能需要考虑添加简单的延迟逻辑,避免触发更严格的限制。

内容的提问来源于stack exchange,提问作者Almas Abdrazak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:36:05