discord api无法在公会中检索到正确数量的成员

j1dl9f46  于 2021-07-04  发布在  Java
关注(0)|答案(1)|浏览(458)

这个问题在这里已经有了答案

discord jda-无效成员列表(1个答案)
4个月前关门了。
我试过检索公会或频道中的所有用户。我试过不同的方法,但没有达到预期的效果。
方法#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将检索该用户和bot本身。
根据文档guildchannel.getmembers()返回具有{@link net.dv8tion.jda.api.permission#message_read}权限的所有成员
因此,我已经授予所有用户在我的测试服务器中读取消息的权限。
文档还说guild.getmembers()将只检查缓存的成员!
我做错什么了?我应该怎么做才能得到一个公会或一个频道的所有用户?
提前谢谢。

bjp0bcyl

bjp0bcyl1#

热释光;博士

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

如本回答中所述,您可以启用特权服务器成员端点并缓存所有成员。但是,未经验证,您的bot不能加入超过100个服务器。
这个数量是准确的,但是缓存所有公会中的所有成员也会占用大量内存。
更好的解决方法是使用公会端点的计数。您可以向发送get请求 /guilds/<id>?with_counts=true 使用 approximate_member_count .
jda甚至使用这个端点。 Guild 有一个方法 getMemberCount 这会给你这个公会的成员(大概)数量。

相关问题