Вы сказали, что уже получили это, но я хотел бы объяснить больше о том, как это на самом деле работает, и уточнить ваш ответ.
ListenerAdapter
методы вызываются для каждого события, которое происходит во всей области бота, например, если у вас есть
class Adapter extends ListenerAdapter {
@Override
public void onMessageReceived(MessageReceivedEvent event){
/*This will be called for every message, everywhere, including the bot's private channel*/
}
}
Итак, вам нужно отфильтровать эти события внутри тела метода, то, что вы сделали в своем ответе, было проверено, есть ли у отправителя сообщения разрешения на управление сообщениями, что это не тот, который вам действительно нужен для удаления каналов, это Permission.MANAGE_CHANNELS
, вы можете найти его на вкладке ролей на вашем сервере.
Затем вы вызываете createCopy()
, который в основном создает мелкую копию информации о канале
Я не думаю, что вы действительно хотели этого.
Затем вы ставите это действие в очередь (это то, что на самом деле его выполняет), оно помещается в очереди для асинхронной обработки потоками JDA, которые впоследствии будут отправлены в Discord через соединение с веб-сокетом.
Этот метод очереди может принимать Consumer<TextChannel>
в качестве параметра, что это значит?
В основном потребитель представляет собой операцию, которая принимает один параметр в качестве входных данных (в данном случае TextChannel
) и ничего не возвращает. Подробнее об этом здесь: https://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html
Потребитель, который вы указываете в своем ответе, делает то, что вы на самом деле хотите, отправляя сообщение, на канале, который использовался предыдущей очередью. , что означает, что createCopy()
совершенно бесполезен, оба объекта TextChannel
одинаковы, подходящим будет:
event.getChannel().sendMessage(":warning:Nuked channel:warning:\nhttps://imgur.com/a/93vq9R8").queue();
После этого вы сразу удалите канал, что не так уж много смысл, так как, скорее всего, никто даже не сможет увидеть сообщение с ядерной бомбой. Для этого JDA предоставляет другой метод постановки задач в очередь, на этот раз с задержкой: queueAfter()
Требуется long
в качестве значения и объект TimeUnit
, чтобы указать, какова единица времени указанного значения, например:
event.getChannel().delete().queueAfter(10, TimeUnit.SECONDS);
Это поставит задачу в очередь на выполнение в течение 10 секунд и НЕ останавливает выполнение вашего кода, в отличие от метода complete()
.
В качестве альтернативы вы можно просто использовать Thread.sleep()
, который принимает в качестве входных данных длинное значение: Thread.sleep(10000)
в течение 10 секунд (10000 миллисекунд).
Вы можете найти гораздо больше информации о JDA и советах по запуску здесь: https://github.com/DV8FromTheWorld/JDA#creating объект-jda