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
相关产品推荐
相关产品推荐

