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

Discord JDA调用getMembers()始终返回0,无法正确获取语音频道成员数如何解决?

JDA getMembers()返回0的修复方案

核心原因与对应修复步骤

1. 未开启必要的网关意图与权限

JDA 4.x及以上版本默认禁用了成员、语音状态相关的敏感权限,需要两处配置:

  • 先进入Discord开发者后台的Bot设置页,开启SERVER MEMBERS INTENT和GUILD_VOICE_STATES开关
  • 构建JDA实例时显式启用对应意图:
JDA jda = JDABuilder.createDefault("你的Bot令牌")
        // 启用成员、语音状态意图
        .enableIntents(GatewayIntent.GUILD_MEMBERS, GatewayIntent.GUILD_VOICE_STATES)
        .build();
  • 确认Bot拥有目标语音频道的查看频道权限,无权限也无法读取成员列表。

2. 成员缓存策略配置错误

JDA默认不会全量缓存服务器成员,你需要配置针对语音频道成员的缓存策略:

JDA jda = JDABuilder.createDefault("你的Bot令牌")
        .enableIntents(GatewayIntent.GUILD_MEMBERS, GatewayIntent.GUILD_VOICE_STATES)
        // 配置缓存所有加入语音频道的成员,完全满足你的需求
        .setMemberCachePolicy(MemberCachePolicy.VOICE)
        .build();

非必要不要使用MemberCachePolicy.ALL,会大幅提升内存占用。

3. 现有代码逻辑错误

你在事件回调中写的while(true)死循环会直接阻塞JDA的事件处理线程,后续所有的语音状态更新、成员变动事件都无法被JDA接收,缓存永远不会更新,自然拿到的成员数一直是0,需要改成异步定时任务实现3秒推送的需求:

public void onGuildVoiceJoin(GuildVoiceJoinEvent event) {
    String channelId = event.getChannelJoined().getId();
    if (channelId.equals("904375329764814870")) {
        Member member = event.getMember();
        String memberName = event.getMember().getEffectiveName();
        Category category = event.getGuild().getCategoryById("904364634507706468");
        event.getGuild().createVoiceChannel("Coaching " + memberName).setParent(category).complete();
        List<VoiceChannel> channelList = event.getGuild().getVoiceChannelsByName("Coaching " + memberName, true);
        VoiceChannel channel = channelList.get(0);
        // 等待成员移动完成后再启动定时任务
        event.getGuild().moveVoiceMember(member, channel).queue(unused -> {
            // 用线程池做定时任务,不阻塞事件线程
            ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
            scheduler.scheduleAtFixedRate(() -> {
                // 额外判断频道是否还存在,避免频道删除后报错
                if (!channel.getGuild().getVoiceChannels().contains(channel)) {
                    scheduler.shutdown();
                    return;
                }
                event.getGuild().getTextChannelById("904364671467929610")
                     .sendMessage("Number of people currently on the channel : " + channel.getMembers().size())
                     .queue();
            }, 0, 3, TimeUnit.SECONDS);
            // 你可以额外监听语音离开事件,频道没人时关闭scheduler释放资源
        });
    }
}

完成以上配置和代码修改后,getMembers()就能正常返回语音频道的实时成员数量。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:06:02