90 lines
4.6 KiB
C++
90 lines
4.6 KiB
C++
#pragma once
|
||
#include <tgbot/tgbot.h>
|
||
#include <string>
|
||
#include <structs.hpp>
|
||
#include <unordered_map>
|
||
#include "BotToServer.hpp"
|
||
#include "BotUserContext.hpp"
|
||
|
||
/// @brief Структура возвращаемого значения класса BotHandlers для изменения текущего сообщения
|
||
struct HandlerResult {
|
||
std::string message;
|
||
TgBot::InlineKeyboardMarkup::Ptr keyboard;
|
||
};
|
||
|
||
class BotHandlers {
|
||
public:
|
||
BotHandlers(TgBot::Api api) : botApi(api) {;}
|
||
|
||
/// @brief Обработка callback'ов из кнопок интерфейса
|
||
/// @param query запрос callback
|
||
void handleCallback(TgBot::CallbackQuery::Ptr query);
|
||
|
||
/// @brief Обработка сообщений боту
|
||
/// @details
|
||
/// Функция для обработки сообщений, которые юзер отправляет
|
||
/// боту. Необходима для обработки ревью и названий искомого
|
||
/// аниме. Внутри себя проверяет текущий state пользователя
|
||
/// в боте.
|
||
/// @param message обрабатываемое сообщение
|
||
void handleMessage(TgBot::Message::Ptr message);
|
||
|
||
void initUser(int64_t userId);
|
||
private:
|
||
TgBot::Api botApi;
|
||
BotUserContext contextManager;
|
||
BotToServer server_;
|
||
|
||
void handleNavigation(TgBot::CallbackQuery::Ptr query);
|
||
|
||
void handleError(TgBot::CallbackQuery::Ptr query);
|
||
|
||
void processCallbackImpl(TgBot::CallbackQuery::Ptr query);
|
||
|
||
/// @brief Получить очередную страницу тайтлов из списка пользователя
|
||
/// @param userId Идентификатор пользователя
|
||
/// @param payload Полезная нагрузка
|
||
/// @return HandlerResult
|
||
/// static HandlerResult returnMyTitles(int64_t userId, int64_t payload);
|
||
|
||
/// @brief Уменьшает значение нагрузки с учетом текущего состояния
|
||
/// @param payload Изменяемое значение нагрузки
|
||
/// @param curState Текущее состояние
|
||
void reducePayload(int64_t& payload, const UserState curState);
|
||
|
||
/// @brief Увеличивает значение нагрузки с учетом текущего состояния
|
||
/// @param payload Изменяемое значение нагрузки
|
||
/// @param curState Текущее состояние
|
||
void increasePayload(int64_t& payload, const UserState curState);
|
||
|
||
/// @brief Редактирует текущее сообщение в диалоге с пользователем
|
||
/// @details Меняет текст сообщения и клавиатуру на те, что передаются
|
||
/// в аргументе response. Информацию об id чата и изменяемого сообщения
|
||
/// забирает из query, который возвращается с callback'ом после нажатия
|
||
/// кнопки в интерфейсе
|
||
/// @param query Callback запрос
|
||
/// @param response Параметры ответа: клавиатура и текст
|
||
void editMessage(int64_t chatId, int64_t messageId, HandlerResult response);
|
||
|
||
/// @brief Отрисовка текущего экрана (соотв. контексту)
|
||
/// @param ctx - текущий контекст
|
||
void renderCurrent(TgBot::CallbackQuery::Ptr query);
|
||
|
||
/// @brief Логика переходов между контекстами (навигация на следующий шаг)
|
||
/// @param query - запрос
|
||
/// @param current - текущий шаг навигации
|
||
/// @return следующий NavigationStep при успехе (std::nullopt в случае ошибки)
|
||
std::optional<NavigationStep> computeNextStep(const TgBot::CallbackQuery::Ptr& query,
|
||
const NavigationStep& current);
|
||
|
||
/// @brief Получить состояние страницы главного меню
|
||
/// @return HandlerResult с параметрами главного меню
|
||
HandlerResult showMainMenu();
|
||
|
||
/// @brief Посылает интерфейс обработки ошибки на callback запрос
|
||
/// @param query запрос
|
||
void sendError(int64_t chatId, int64_t messageId, const std::string& errText);
|
||
|
||
// Форматирование для отображения в сообщении
|
||
std::string formatTitlesList(const std::vector<BotStructs::Title>& titles);
|
||
};
|