В этом посте хочется разобрать создание ботов в телеграмме, ведь их очень интересно писать (по крайней мере, для новичков).Мы попробуем : написать расширяемого бота использовать спринг Для начала нам нужно создать приложение на спринге. Но я думаю, каждый уже умеет это делать.Затем добавим зависимости, многие пользуются telegrambots-spring-boot-starter, но мне как-то не довелось увидеться с ним, поэтому используем самый обычный API. Теперь создадим файл application.yaml в папке resources. В нём напишем токен бота.Telegram-bots ещё требует имя, но вводить настоящее - не обязательно. Создадим наш первый и основной компонент. В нём мы будем регистрировать бота и обрабатывать сообщения. Теперь начинаем работать с косяками api телеграмма и как-то их обрабатывать.Самая главная проблема - у api телеграмма отсутствует один общий интерфейс, который бы объединял все возможные виды апдейта (за исключением BotApiMethod). Обычное сообщение и SendPhoto разделены и у них нет ничего общего, а нам нужно выдавить абстракции для того, чтобы всё легко расширялось, поэтому нам придётся поговнокодить. (Возможно реализация этого может выглядеть лучше).В том числе, нам нужно определить тип сообщения, для дальнейшего правильного использования.Для этого создадим класс ClassifiedUpdate. Я использую Lombok, если вас это испугало, то почитайте, что это такое. Это выглядит ужасно и некрасиво, обязательно как-то отрефакторим это, но не сегодня.Хотел бы объяснить, зачем я разделил @username и Имя Фамилия.Дело в том, что некоторые пользователи не имеют имя и фамилию в настройках профиля, а некоторые имеют только это. В общем, мы предусмотрели этот момент. И теперь если мы захотим написать: Привет, Илья! У нас никогда не будет: Привет, null!. Мы ведь не хотим отставать от глаза бога.Тем, кому лень писать код, держите TelegramType: Двигаемся дальше, мы обработали их апдейт и теперь нам пора обработать свой апдейт, но перед этим нам нужно создать ещё свой ответ. Выглядит он не так ужасно, но ужасно :)Это нам очень сильно поможет в будущем, нужно только верить. На самом деле, всё можно сделать и без этого класса, если вы собираетесь отвечать пользователю только сообщениями или коллбэками. Потому что в будущем этот класс ещё и увеличит немного кода. Я лишь стараюсь увеличить расширяемость, чтобы внедрение новой фичи делалось быстро и легко.Теперь нам как-то нужно работать с пользователями, поэтому с помощью Spring JPA создадим сущность пользователя. Как вы можете заметить, у пользователя есть состояние, это поможет нам для проведения интерактивов и т.д. Также я использую у permissions тип Long, потому что обычно это: 0 - Default User 1 - Какой-нибудь VIP 2 - Moderator 3 - Admin Это просто и удобно и лениво, но если кто-то хочет, то может заморочиться.Вернёмся к состоянию, напишем простую сущность для состояния : Для чего нам нужно состояние?К примеру, пользователь захотел пополнить баланс, и мы просим его ввести сумму пополнения. Если мы не узнаем, что прямо сейчас он вводит сумму пополнения, то будем обрабатывать его команду: 100, как обычную. В общем, нам нужно состояние. Дальше нам нужно создать обработчик сообщений, в нашем случае они будут разные и их будет много, поэтому создадим интерфейс Handler. Обработчик выполняет функцию хранения комманд. Теперь нам нужно создать команды для обработчика. Создадим интерфейс Command. Теперь как-то надо найти команды для обработчика, поэтому создадим класс AbstractHandler. Это конечно всё хорошо, но нам нужно собрать все обработчики в одном месте. И отправить наш ClassifiedUpdate в эту бездонную бочку. Назовём эту штуку HandlersMap, просто потому что я снова распихиваю обработчики по хэшмапе :) Теперь нам нужна ещё прослойка в виде ClassifiedUpdateHandler'a. Там мы будем доставать пользователя из базы данных и может что-то ещё. Просто добавим его.Класс ClassifiedUpdateHandler: Тут ничего особенного, пропустим объяснения. Намного интереснее в классе UserService.До этого, благо, мы успели всё обработать и на 100% достать id пользователя и его имя. Всё готово, теперь пора создать наш первый Handler и Command для примера. Но для начала напишем Builder для сообщений. Вот теперь можем написать Handler и Command. КонецЯ постарался сделать практическое пособие. Тут нужно много чего дорабатывать.Код я писал очень давно, поэтому что-то возможно уже нужно обновить, просто решил опубликовать свои наработки в открытый доступ.В итоге должен получиться простой и расширяемый бот.Если эта статья вам понравиться, то можно всё допилить и получить невероятно мощную штуку для написания телеграмм ботов, к примеру, выкатить свои аннотации и т.д.Спасибо за внимание! Пишу код и пью коффе