JDA Discord. Бот ожидает ответа от юзера

209
09 января 2020, 04:00

Пишу Discord бот с помощью библиотеки JDA и столкнулся с достаточно банальной проблемой.

Требуется метод, который принимал бы команду "/add_server" (без каких либо добавлений после /add_server), далее отправлял бы в тот же чат сообщение "Какой сервер вы хотите добавить?"

Бот в этот момент ожидает ответа от Юзера (при этом не мешая другим юзерам пользоваться функционалом бота в соседних TextChannels).

Возможные события:
  1. Если Юзер отправил ему правильное имя сервера (допустим, Google), то бот выводить в командной строке имя сервера (System.out.println(serverName);)

  2. Если Юзер отправил ему неправильное имя сервера (допустим, 21324), то бот повторно спрашивает название сервера или ждет команды /end

  3. Если Юзер не отвечает боту в течение X секунд - бот перестает ожидать ответа от юзера и уведомляет его о том, что бот больше не ожидает от юзера ответа

Пытался адаптировать под свой проект код из это бота, но не смог реализовать цикл

P.S Если требуется уточнение - скажите об этом мне в комментариях.

Update №1

Добавил в свой проект код из ExampleBot (ссылка на него выше). Т.к. сложно найти информацию по библиотеке JDA-Utilities, я написал пример кода для multiple questions:

public class TestLoop extends Command {
    private EventWaiter waiter;
    private Database database;
    public TestLoop(Database database, EventWaiter waiter) {
        this.waiter = waiter;
        this.name = "addperson";
        this.help = "add person to server";
        this.database = database;
    }
    @Override
    protected void execute(CommandEvent event)
    {
        // ask what the user's name is
        event.reply("What is your name?");
        // wait for a response
        waiter.waitForEvent(MessageReceivedEvent.class,
                e -> e.getAuthor().equals(event.getAuthor()) && e.getChannel().equals(event.getChannel()),
                e -> {
                    e.getChannel().sendMessage("Thank you, `" + e.getMessage().getContentRaw() + "`. What is your age?").queue();
                    waiter.waitForEvent(MessageReceivedEvent.class,
                            w -> w.getAuthor().equals(e.getAuthor()) && w.getChannel().equals(e.getChannel()),
                            w -> w.getChannel().sendMessage("So, you,re `" + e.getMessage().getContentRaw() + "` and your age is `" + w.getMessage().getContentRaw() + "`").queue());
                },
            // if the user takes more than a minute, time out
            10, TimeUnit.SECONDS, () -> event.reply("Sorry, you took too long."));
    }
}

Код не идеален, но зато это моя попытка решить мою же проблему.

READ ALSO
Как проверить существование видео youtube?

Как проверить существование видео youtube?

Например, есть поле ввода для ссылки, пользователь вводит и нажимает добавить, и если видео существует, то возврощает true

180
Не получается создать SSL подключение к Bitstamp на java с помощью протокола Fix

Не получается создать SSL подключение к Bitstamp на java с помощью протокола Fix

Всем привет! Возникла проблема при подключении к Bitstamp для получения мгновенной информации с биржиДелаю простенькое sslsocket соединение, но выдает...

239
Книги и учебные ресурсы по Java

Книги и учебные ресурсы по Java

Собираем подборку качественной литературы по Java

245
Как вытащить id видео ссылки YouTube?

Как вытащить id видео ссылки YouTube?

Как ссылки, например https://youtube/KYukvjnHxo и https://youtube

211