#pragma once #include #include #include #include /// @brief Структура возвращаемого значения класса BotHandlers для изменения текущего сообщения struct HandlerResult { std::string message; TgBot::InlineKeyboardMarkup::Ptr keyboard; }; enum class UserState { MAIN_MENU, // Главное меню VIEWING_MY_TITLES, // Список моих тайтлов AWAITING_TITLE_NAME, // Жду название тайтла для поиска VIEWING_TITLE_PAGE, // Смотрю страничку тайтла AWAITING_REVIEW, // Жду ревью на тайтл VIEWING_REVIEW_LIST, // Смотрю список ревью на тайтл VIEWING_REVIEW, // Смотрю (конкретное) ревью на тайтл VIEWING_DESCRIPTION, // Смотрю описание тайтла }; struct UserContext { UserState state; // Текущее состояние пользователя int64_t cursor; // Текущий курсор пользователя (id тайтла) }; 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); private: TgBot::Api botApi; std::unordered_map userContexts; void handleNavigation(TgBot::CallbackQuery::Ptr query); void processCallbackImpl(TgBot::CallbackQuery::Ptr query); /// @brief Получить очередную страницу тайтлов из списка пользователя /// @param userId Идентификатор пользователя /// @return HandlerResult static HandlerResult returnMyTitles(int64_t userId); };