1.0v - working version
Read Command working Readme.md for use
Первоначальная настройка проекта состоит из:
- добавить переменные окружения в application.yml
- зарегистрировать команды по инструкции ниже
- для более развернутого функционала с сесиями пользователей переопределить метод в каталоге workWithText() класса MainListenerService
Эта документация описывает новую систему команд для Telegram бота, которая позволяет легко создавать новые команды и автоматически регистрировать их в боте.
Аннотация @BotCommand используется для пометки классов команд, которые должны быть автоматически зарегистрированы в боте. Она имеет один обязательный параметр command, который указывает имя команды (с префиксом /).
@BotCommand(command = "/start")
public class MyCommand extends MessageCommand {
// ...
}Для упрощения создания новых команд предоставляются следующие абстрактные классы:
Базовый абстрактный класс для всех команд. Реализует интерфейс Command и предоставляет методы для обработки как текстовых сообщений, так и callback-запросов. Используйте этот класс, если ваша команда должна обрабатывать оба типа обновлений.
public abstract class AbstractCommand implements Command {
// ...
protected abstract void handleMessage(Update update);
protected abstract void handleCallback(Update update);
}Абстрактный класс для команд, которые обрабатывают только текстовые сообщения. Наследуется от AbstractCommand и предоставляет удобные методы для работы с текстовыми сообщениями.
public abstract class MessageCommand extends AbstractCommand {
// ...
protected abstract void handleMessage(Update update);
// handleCallback() уже реализован и ничего не делает
}Абстрактный класс для команд, которые обрабатывают только callback-запросы. Наследуется от AbstractCommand и предоставляет удобные методы для работы с callback-запросами.
public abstract class CallbackCommand extends AbstractCommand {
// ...
protected abstract void handleCallback(Update update);
// handleMessage() уже реализован и ничего не делает
}Класс CommandRegistrar автоматически находит все бины с аннотацией @BotCommand и регистрирует их в CommandContainer. Вам не нужно вручную добавлять команды в контейнер.
@BotCommand(command = "/mycommand")
public class MyCommand extends MessageCommand {
public MyCommand(TelegramBot telegramBot) {
super(telegramBot);
}
@Override
protected void handleMessage(Update update) {
long chatId = getChatId(update);
String text = getMessageText(update);
// Ваша логика обработки сообщения
sendTextMessage(chatId, "Вы отправили: " + text);
}
}@BotCommand(command = "/mycallback")
public class MyCallbackCommand extends CallbackCommand {
public MyCallbackCommand(TelegramBot telegramBot) {
super(telegramBot);
}
@Override
protected void handleCallback(Update update) {
long chatId = getChatId(update);
String callbackData = getCallbackData(update);
// Ваша логика обработки callback-запроса
sendTextMessage(chatId, "Вы нажали кнопку с данными: " + callbackData);
}
}@BotCommand(command = "/universal")
public class UniversalCommand extends AbstractCommand {
public UniversalCommand(TelegramBot telegramBot) {
super(telegramBot);
}
@Override
protected void handleMessage(Update update) {
// Логика обработки текстового сообщения
}
@Override
protected void handleCallback(Update update) {
// Логика обработки callback-запроса
}
}Все абстрактные классы команд предоставляют полезные методы для работы с обновлениями:
getTelegramBot()- получение экземпляра TelegramBot
getChatId(Update update)- получение ID чата из текстового сообщенияgetMessageText(Update update)- получение текста сообщенияsendTextMessage(long chatId, String text)- отправка текстового сообщения
getChatId(Update update)- получение ID чата из callback-запросаgetCallbackData(Update update)- получение данных callback-запросаsendTextMessage(long chatId, String text)- отправка текстового сообщения
- Создайте новый класс команды, наследующийся от одного из абстрактных классов.
- Добавьте аннотацию
@BotCommandс указанием имени команды. - Реализуйте необходимые методы.
- Готово! Команда будет автоматически зарегистрирована в боте.
@BotCommand(command = "/hello")
public class HelloCommand extends MessageCommand {
public HelloCommand(TelegramBot telegramBot) {
super(telegramBot);
}
@Override
protected void handleMessage(Update update) {
long chatId = getChatId(update);
sendTextMessage(chatId, "Привет, мир!");
}
}Новая система команд позволяет легко создавать новые команды для Telegram бота без необходимости вручную регистрировать их в контейнере. Она также упрощает обработку различных типов обновлений (текстовых сообщений и callback-запросов) благодаря абстрактным классам, которые предоставляют удобные методы для работы с обновлениями.