有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

方法#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个用户。调试时,我发现它正在检索bot本身和我

方法#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,它只检索机器人和我

有时,如果其他用户执行该命令,则bot将检索该用户和bot本身

According to the documentation GuildChannel.getMembers() returns all Members with the {@link net.dv8tion.jda.api.Permission#MESSAGE_READ} Permission

因此,我已经授予所有用户在我的测试服务器中阅读消息的权限

The documentation also says that Guild.getMembers() will only check cached members!

我做错了什么? 我应该怎么做才能获得一个公会或渠道中的所有用户

提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    TL;博士

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

    this answer中所述,可以启用特权服务器成员端点并缓存所有成员。但是,在未经验证的情况下,您的机器人无法加入100多个服务器

    这个数量是准确的,但缓存所有公会中的所有成员也会占用大量内存

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

    JDA甚至使用这个端点。 Guild有一个方法^{}可以给你这个公会的成员(大概)数量