提问者:小点点

Discord JDA-成员列表无效


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

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));
        }
    }
}

如果另一个人写,那么仍然显示的只有我和bot。


共1个答案

匿名用户

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

在这些版本中,引入了新的工厂方法,使人们意识到新的discord API设计。在未来,机器人将被限制为缓存默认连接到语音通道的成员。

CreateDefault/CreateLight将只缓存连接到语音频道的成员或公会的所有者(第一眼看到)。要缓存更多成员,必须在bot的应用程序仪表板和JDA中启用guild_members意图。

现在您可以做如下操作:

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

需要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();

你也可以使用guild#loadmembers或guild#findmembers为各个公会加载它们。

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