Discord JDA - 无效的成员列表

Sha*_*571 3 java bots discord discord-jda

我正在创建一个 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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果另一个人写,那么仍然只显示我和机器人。

Min*_*inn 12

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

在这些版本中,引入了新的工厂方法,让人们了解新的 discord API 设计。将来,机器人将仅限于默认连接到语音通道的缓存成员。

如果您只需要成员数量,您可以使用Guild#getMemberCount!除此以外:

createDefault/createLight将只超高速缓存部件连接到语音信道或行会所有者(在第一视线)。要缓存更多成员,您必须GUILD_MEMBERS在机器人的应用程序仪表板和 JDA 中启用该意图。

在此处输入图片说明

现在你可以做这样的事情:

JDA api = JDABuilder.createDefault(token)
                    .setMemberCachePolicy(MemberCachePolicy.ALL)
                    .enableIntents(GatewayIntent.GUILD_MEMBERS)
                    .build();
Run Code Online (Sandbox Code Playgroud)

这个GUILD_MEMBERS意图是必需的,因为它使GUILD_MEMBER_REMOVE调度能够告诉库在成员被踢/禁止/离开时从缓存中删除成员。

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

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

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

您还可以使用Guild#loadMembersGuild#findMembers为单个公会加载它们。

我建议您也阅读这篇 JDA wiki 文章:网关意图和成员缓存策略