Discord JDA - недействительный список пользователей - PullRequest
1 голос
/ 15 апреля 2020

Я создаю бот Discord и столкнулся со странной проблемой. Мне нужно go через каждого пользователя на сервере и выполнить условное действие. Но при получении списка всех участников он содержит только меня и самого бота.

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

Если другой человек пишет, тогда только я и бот отображаются.

1 Ответ

3 голосов
/ 15 апреля 2020

Я предполагаю, что вы используете версию для разработчиков версии 4.2.0 (4.1.1_102 и выше)

В этих версиях были введены новые фабричные методы, чтобы люди знали о новом расколе API дизайн. В будущем боты будут ограничены членами кэша, которые по умолчанию подключены к голосовым каналам.

createDefault / createLight будет кэшировать только участников, подключенных к голосовым каналам или владельцев гильдий (на первый взгляд) , Чтобы кэшировать больше участников, вам нужно включить намерение GUILD_MEMBERS как на панели инструментов приложения для вашего бота, так и в JDA.

enter image description here

Теперь вы может сделать что-то вроде этого:

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

См. также:

...