Discord API无法在公会中检索正确数量的成员

时间:2020-09-05 18:09:32

标签: java discord discord-jda

我尝试检索公会或频道中的所有用户。我尝试了不同的方法,但没有任何预期的结果。

方法1。

public static List<Member> getMembers() {
    return Arrays.stream(WebClient.builder().build()
        .get()
        .uri(URL)
        .header("Authorization", "Bot " + Credentials.TOKEN)
        .retrieve()
        .bodyToMono(Member[].class)
        .block()).collect(Collectors.toList());
}

这仅检索加入服务器的最后一个用户。

方法2

Guild guild = event.getJDA().getGuildById(GUILD_ID);

event.getChannel().sendMessage("Users: " + guild.getMembers().size()).queue();

这仅检索2个用户。调试时,我发现它正在检索机器人本身和我。

方法3

public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
    String messageSent = event.getMessage().getContentRaw();
    
    if (messageSent.equalsIgnoreCase("members")) {
        Guild guild = event.getJDA().getGuildById(GUILD_ID);

        event.getChannel().sendMessage("Users: " +
            guild.getMembers().size()).queue();            
    
        event.getChannel().sendMessage("Thats all for now").queue();
    }
}

与#2相同。

方法4

public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
    String messageSent = event.getMessage().getContentRaw();
        
    event.getChannel().getMembers().forEach(member -> {
        event.getChannel().sendMessage("[Channel - " + event.getChannel().getName() + " ]").queue();
        
        event.getChannel().sendMessage("---- Members -> " + member.getUser().getName()).queue();
    });
}

与#2和#3相同

调试时,我发现像#3和#4中的#2一样,它只检索机器人和我。

有时,如果另一个用户执行该命令,则机器人会检索该用户和机器人本身。

根据文档GuildChannel.getMembers()返回所有 拥有{@link net.dv8tion.jda.api.Permission#MESSAGE_READ}的成员 权限

因此,我已授予所有用户读取我的测试服务器中邮件的权限。

文档还说Guild.getMembers()将仅检查 缓存的成员!

我在做什么错? 我应该怎么做才能使所有用户进入公会或频道?

谢谢。

1 个答案:

答案 0 :(得分:1)

TL; DR

event.getJDA().getGuildById(GUILD_ID).getMemberCount();

this answer中所述,您可以启用特权服务器成员端点并缓存所有成员。但是,如果没有经过验证,您的漫游器就不能加入100台以上的服务器。

这个数字是准确的,但是将所有公会中的所有成员缓存起来也会占用大量RAM。

一种更好的解决方案是使用the guild endpoint中的计数。您可以将GET请求发送到/guilds/<id>?with_counts=true并使用approximate_member_count

JDA甚至使用此端点。 Guild的方法getMemberCount为您提供了该行会中(大约)成员的数量。