Очистка чата с помощью Discord JDA - PullRequest
1 голос
/ 05 мая 2020

Я кодирую бота Discord в java, я использую Discord JDA и зависимость утилит, я пробовал использовать одну утилиту, но у меня не получилось заставить ее работать, поэтому я попытался использовать только обычный JDA, это это то, что я сделал, но мне нужен способ сказать боту не отправлять сообщение в новый канал, если команда не была запущена.

public class NukeCommand extends ListenerAdapter {

    @Override
    public void onGuildMessageReceived(GuildMessageReceivedEvent event){
        if (event.getMessage().getContentRaw().equalsIgnoreCase(".nuke")){
            event.getChannel().createCopy().queue();
            event.getChannel().delete().queue();
        }
    }
    @Override
    public void onTextChannelCreate(TextChannelCreateEvent createEvent){
        createEvent.getChannel().sendMessage(":warning:Nuked channel:warning:\nhttps://imgur.com/a/93vq9R8").queue();
    }

Я открыт для ответов в обеих зависимостях. это тот эффект, который я хочу: https://gyazo.com/e549fd8dda0ded62db19fb84e31d3a61 У меня такой же эффект, но он отправляет сообщение каждый раз, когда я создаю текстовый канал. Я хочу, чтобы он отправлял сообщение, только если была запущена команда .nuke.

Ответы [ 2 ]

0 голосов
/ 15 мая 2020

Вы сказали, что уже получили это, но я хотел бы объяснить больше о том, как это на самом деле работает, и уточнить ваш ответ.

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(), который в основном создает мелкую копию информации о канале enter image description here

Я не думаю, что вы действительно хотели этого.

Затем вы ставите это действие в очередь (это то, что на самом деле его выполняет), оно помещается в очереди для асинхронной обработки потоками 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

0 голосов
/ 06 мая 2020

Я нашел решение: вы можете передать расходный материал или что-то еще, что он вызвал, в метод .queue, этот код запускается всякий раз, когда создается канал. что я сделал:


    @Override
    public void onGuildMessageReceived(GuildMessageReceivedEvent event){
        if (event.getMember().hasPermission(Permission.MESSAGE_MANAGE)){
            if (event.getMessage().getContentRaw().equalsIgnoreCase(".nuke")){
                event.getChannel().createCopy().queue(channel->channel.sendMessage(":warning:Nuked channel:warning:\nhttps://imgur.com/a/93vq9R8").queue());
                event.getChannel().delete().queue();
            }
        }
    }
...