Discord JDA — Иногда работает, иногда нет

#discord #bots #discord-jda

#Discord #боты #раздор-jda

Вопрос:

То, что я пытаюсь сделать, это :

Когда парень покидает определенный голосовой канал, и этот канал теперь пуст, бот :

  • удалите все сообщения, кроме 1, в определенном текстовом канале
  • удалите голосовой канал, который он только что покинул

Проблема :

  • голосовой канал успешно удален, но сообщения в текстовом канале не удаляются ботом

Код :

 @Override public void onGuildVoiceUpdate(GuildVoiceUpdateEvent event) {      VoiceChannel channelLeft = event.getChannelLeft();    if (channelLeft.getName().startsWith("🎒 Coaching de")) {     if (channelLeft.getMembers().isEmpty()) {     channelLeft.delete().queue(); //The bot delete de channel successfully    Listlt;Messagegt; messagesCoaching = event.getChannelLeft().getGuild().getTextChannelById("489420943991635988").getHistory().retrievePast(20).complete(); // Using a list to store the retrieved messages    messagesCoaching.removeIf(m -gt; m.getId().equals("490567304971812885")); // Removing from the list the message i want to keep     event.getChannelLeft().getGuild().getTextChannelById("489420943991635988").deleteMessages(messagesCoaching).complete(); // Deleting all the messages (not working)    }       }  

Ответ №1:

Я не уверен на 100%, в чем заключается ваша ошибка, но я заверяю, что вы пытаетесь удалить все сообщения, отправленные в текстовом канале.

В настоящее время ваш код получает последние 20 сообщений из текстового канала, которые вы получили по идентификатору. Если у вас более 20 сообщений, бот их не удалит. И если сообщения старше 2 недель, он также не удалит их. Кроме того, не используйте complete (), так как это остановит основной поток бота. Я бы предложил использовать такой код:

 @Override  public void onGuildVoiceUpdate(GuildVoiceUpdateEvent event) {  VoiceChannel channelLeft = event.getChannelLeft();   if (channelLeft.getName().startsWith("🎒 Coaching de")) {   if (channelLeft.getMembers().isEmpty()) {  channelLeft.delete().queue(); // Telling the bot to delete the channel.  MessageHistory history = event.getGuild().getTextChannelById("489420943991635988").getHistory(); // Pulling up the history from a text channel   history.retrievePast(100).queue(messages -gt; { // Putting the past 100 messages in a queue, and using a lamba to do something with the returned messages  messages.removeIf(m -gt; m.getId().equals("490567304971812885")); // If a message contains the same ID as told here, it removes it.  event.getGuild().getTextChannelById("489420943991635988").deleteMessages(messages).queue(); // And now, delete all messages.  });  }  }  }  

Комментарии:

1. Это немного лучше, потому что он использует механизм очереди, чтобы предотвратить остановку всего бота до тех пор, пока ему не удастся выполнить вышеуказанные задачи