Обработка входящих сообщений Telegram API

136
30 октября 2019, 13:50

Пишу телеграмм бота для регистрации задач. Использую библиотеку от rubenlagus. Возникла проблема с обработкой входящих сообщений. Метод: public void onUpdateReceived(Update update){}, позволяет обрабатывать каждое отдельное сообщение, вызывать другие методы после получения сообщения к примеру "/newtask", но как сделать так, чтобы после отправки команды боту - бот ожидал следующее сообщение и записывал этот текст например в переменную. Пример диалога: User: /newtask Bot: Введите название задачи User: Записаться к врачу. Фразу: "Записаться к врачу", нужно записать в переменную.

Answer 1

В простейшей реализации, можете завести список с идентификаторами пользователей, для которых актива команда /newtask (ожидается ввод текста).

from scratch (в классе бота):

    private List<Integer> processingUsers = new ArrayList<>();
    private void handleNewTaskCommand(Update update) {
        processingUsers.add(update.getMessage().getFrom().getId());
        sendPromtToChat(update);
    }
    private void handleSimpleMessage(Update update) {
        Integer userId = update.getMessage().getFrom().getId();
        if (processingUsers.contains(userId)) {
            doSomeWithTextForUser(update);
            processingUsers.remove(userId);
        }
    }

Если в методе onUpdateReceived() определяете, что пришла команда /newtask, то предаете в handleNewTaskCommand(), где id пользователя добавится в список активных (processingUsers);

Если в методе onUpdateReceived() определяете, что пришел обычный текст, то передаете update в handleSimpleMessage(), где проверяется, не ожидется ли в данный момент для данного пользователя ввода данных. Если ожидается, удаляете пользователя из спика и производите необходимые вам действия с текстом.

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

Так же обратите внимание, что в пришедшем Update может не оказаться "обычного" сообщения (см. в Update поля editedMessage, channelPost и т.д.), тогда вызов
getFrom() выбросит NPE. Поэтому прежде чем процессить Update, желательно сначала проверить что он из себя представляет и что в нем в принципе содержится.

READ ALSO
При использовании @EnableAspectJAutoProxy не работает Autowired

При использовании @EnableAspectJAutoProxy не работает Autowired

начал разбираться со Spring и AOP, хочу сделать логирование, но столкнулся с проблемойВот классы мои классы Application:

139
Разные view для списка

Разные view для списка

Решил сделать в списке групировку по датам, что то подобное такому:

150
Закрыть listening порт

Закрыть listening порт

Мне нужно закрывать listening порт(например, 12000, который создается java методом serversocketaccept) в определённый момент(неизвестно когда он наступит)

154
&ldquo;Failed to instantiate java.util.List using constructor NO_CONSTRUCTOR with arguments &rdquo;

“Failed to instantiate java.util.List using constructor NO_CONSTRUCTOR with arguments ”

Вызов данного контроллера выдает ошибку:

260