【问题标题】:Discord API not able to retrieve correct amount of members in Guild [duplicate]Discord API无法在Guild中检索正确数量的成员[重复]
【发布时间】:2020-12-24 15:57:19
【问题描述】:

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

方法#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() 只会检查 缓存成员!

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

提前致谢。

【问题讨论】:

  • @Minn 你的回答解决了我的问题 :) 我的机器人不会因为检索大量用户或因为我使用 ChunkingFilter.ALL、MemberCachePolicy.ALL、GatewayIntent.GUILD_MEMBERS 而被禁止吗?在此先感谢大家!
  • 它不会被禁止,但它会limit your bot to 100 servers unless it is verified,您需要在开发者门户中明确启用意图。

标签: java discord discord-jda


【解决方案1】:

TL;DR

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

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

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

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

JDA 甚至使用这个端点。 Guild 有一个方法 getMemberCount 可以为您提供此公会中的(大约)成员数量。

【讨论】:

  • 谢谢。如果我需要访问每个成员,可能 /guilds/?with_counts=true 对我来说没用,对吧?有点遗憾,我在文档中没有看到我需要启用特权服务器成员端点的任何地方。
  • 是的,但是如果您需要访问特定成员并且知道 id,您可以使用retrieveMemberById。这甚至不需要特权意图。
猜你喜欢
  • 2021-05-07
  • 2019-01-06
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 2021-01-22
  • 2019-05-30
相关资源
最近更新 更多