#java #discord #discord-jda
#java #боты #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));
}
}
}
Если пишет другой человек, то по-прежнему отображаются только я и бот.
Ответ №1:
Я предполагаю, что вы используете версию для разработки версии 4.2.0 (4.1.1_102 и выше)
В этих версиях были введены новые фабричные методы, чтобы люди знали о новом дизайне discord API. В будущем боты будут ограничены участниками кэша, которые по умолчанию подключены к голосовым каналам.
Если все, что вам нужно, это количество участников, вы можете просто использовать Guild#getMemberCount! В противном случае:
createDefault
/ createLight
будет кэшировать только участников, подключенных к голосовым каналам или владельцам гильдий (на первый взгляд). Чтобы кэшировать больше участников, вам нужно будет включить GUILD_MEMBERS
intent как на панели управления приложениями для вашего бота, так и в JDA.
Теперь вы можете сделать что-то вроде этого:
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)
.enableIntents(GatewayIntent.GUILD_MEMBERS)
.build();
Вы также можете загрузить их для отдельных гильдий, используя Guild#loadMembers или Guild#findMembers .
Я рекомендую также прочитать эту статью JDA wiki: Намерения шлюза и политика кэша участников.
Комментарии:
1. Да, это именно то, что было нужно. Большое вам спасибо.
2. Как работают загрузчики? Из документации кажется, что это будет полезно для функции, которую я пытаюсь реализовать, но я не очень хорошо разбираюсь в Java, поэтому я не знаю, как работает задача. Это похоже на обещание чего-то? Как я могу получить окончательные списки участников после завершения обработки задачи?