Discord JDA - 无效的成员列表

Discord JDA - Invalid Member List

我在创建 Discord 机器人时遇到了一个奇怪的问题。我需要遍历服务器上的每个用户并执行条件操作。但是当收到所有成员的列表时,它只包含我和机器人本身。

public class Bot extends ListenerAdapter {
    public void onGuildMessageReceived(GuildMessageReceivedEvent Event) {
        String Message = Event.getMessage().getContentRaw();

        if(Message.charAt(0) == Globals.BOT_PREFIX) {
            String[] Args = Message.split("\s+");

        if(Args[0].equalsIgnoreCase(CommandType.COMMAND_DEV_TEST)) {
            List<Member> MemberList = Event.getGuild().getMembers();
            for(int i = 0; i < MemberList.size(); i++)
                System.out.println(MemberList.get(i));
        }
    }
}

如果其他人写,那么只显示我和机器人。

我假设您使用的是 4.2.0 版本的开发版本(4.1.1_102 及更高版本)

在这些版本中,引入了新的工厂方法,让人们了解新的 discord API 设计。以后bot默认只限连接语音通道的缓存成员

如果你只需要成员数,你可以使用Guild#getMemberCount!否则:

createDefault/createLight只会缓存连接到语音频道的成员或公会所有者(第一眼)。要缓存更多成员,您必须在机器人的应用程序仪表板和 JDA 中启用 GUILD_MEMBERS 意图。

现在你可以这样做:

JDA api = JDABuilder.createDefault(token)
                    .setMemberCachePolicy(MemberCachePolicy.ALL)
                    .enableIntents(GatewayIntent.GUILD_MEMBERS)
                    .build();

GUILD_MEMBERS 意图是必需的,因为它启用 GUILD_MEMBER_REMOVE 分派以告诉库在 kicked/banned/leave.

时从缓存中删除成员

此设置将执行延迟加载,这意味着它将仅从语音成员开始,并在它们变得活跃后将更多成员添加到缓存中。

要在启动时加载所有成员,您必须另外启用 成员分块:

JDABuilder.createDefault(token)
          .setChunkingFilter(ChunkingFilter.ALL) // enable member chunking for all guilds
          .setMemberCachePolicy(MemberCachePolicy.ALL) // ignored if chunking enabled
          .enableIntents(GatewayIntent.GUILD_MEMBERS)
          .build();

您也可以使用 Guild#loadMembers or Guild#findMembers.

为单个公会加载它们

我还建议阅读这篇 JDA 维基文章:Gateway Intents and Member Cache Policy