Discord JDA. Как удалять сообщения в Discord?

110
19 января 2020, 14:30

Столкнулся с такой проблемой: нужно удалить N сообщений на канале в дискорде. Как это сделать?

Answer 1

Данная проблема частая и выход в ней не всегда очевиден.

Пообщавшись с разработчиками, они предлогают использовать purgeMessages. С данным методом я еще лично не разобрался до конца, но знаю разные вариант удаления сообщений.

Примеры ниже показывают удаление всей истории сообщений на канале. Удаление N сообщений будет основана на данных примерах кода:

1 вариант

Данный вариант является самым примитивным (и где-то надежным):

for (Message mes : event.getChannel().getIterableHistory()) {
    try {
           event.getChannel().deleteMessageById(mes.getId()).queue();
   } catch (Exception e) {
         e.printStackTrace();
   }
}

Плюсы:

  • Работал с этой функцией полгода - ни разу не подвела
  • Удаляет сообщения отправленые в любой период времени

Минусы:

  • Удаляет 1.5-2 сообщения в секунду... Не трудно посчитать, что длинная история сообщений будет удаляться долго.
  • Не особо приветствуется разрабами.

2 Вариант:

Данный вариант является немного продвинутым и его можно часто увидеть на просторах Youtube-уроков по Discord JDA, но у него есть огромные НО:

event.getChannel().getHistory().retrievePast(100).queue(
   m -> data.getGuild()
       .getTextChannelById(event.getChannel().getId())
       .deleteMessages(m).queue()
);

Плюсы:

  • Быстро удаляет сообщения
  • Предыдущий пункт был первым и последним плюсом

Минусы:

  • Максимально можно удалить за раз 100 сообщений
  • Нельзя удалять сообщения, которые превышают 2 недельной давности (даже если оно из 99 всретится 100 - Discord не позволит его удалить)

3 Вариант

Данный вариант еще не обкатан мною, но совмещает в себе плюсы двух предыдущих вариантов:

P.S. честно, я ничего не понял в этом коде, но знаю одно - оно удаляет достаточно быстро 500 сообщений.

event.getChannel().getIterableHistory().takeAsync(500).thenAccept(event.getChannel()::purgeMessages);

Плюсы:

  • Удаляет сообщений любой давности (проверено на 3+ месячных сообщениях)
  • Удаляет быстро сообщения друг за другом (3-6 сообщений в секунду, но могу ошибаться)
  • Мало кода. В одну строчку как-никак)
  • Даже если у вас на канале сообщений 10, а вы пытаетесь удалить 500 - программа это выполнит без труда)

Минусы:

  • "I'd better delete the whole channel and create a copy of it" (Перевод: "Лучше удалить целый канал и создать копию его") (c) Один из разрабов
  • Фиксированное кол-во сообщений (надо писать сколько хочешь удалить сообещний... Способ нахождения длины всей истории переписок еще не нашел.)
  • Может работать не стабильно.
READ ALSO
Группировка изображений

Группировка изображений

какой алгоритм кластеризации и меру похожести для изображений подскажите или порекомендуете? какие этапы для этого нужно сделатьбуду благодарен...

125
Что быстрей String или UUID?

Что быстрей String или UUID?

Хотелось бы раз и навсегда выяснить, что лучше и целесообразнее использовать в виде ключа в хэш-коллекциях String или UUID?

143
Технология protocol buffer format в Java

Технология protocol buffer format в Java

Разбираюсь с технологией protocol buffer formatЕсть файл

132
Java JUnit публичные и приватные методы

Java JUnit публичные и приватные методы

У меня есть два метода

142