86 lines
3.9 KiB
C++
86 lines
3.9 KiB
C++
#pragma once
|
||
#include <tgbot/tgbot.h>
|
||
#include <string>
|
||
#include <structs.hpp>
|
||
#include <unordered_map>
|
||
|
||
/// @brief Структура возвращаемого значения класса BotHandlers для изменения текущего сообщения
|
||
struct HandlerResult {
|
||
std::string message;
|
||
TgBot::InlineKeyboardMarkup::Ptr keyboard;
|
||
};
|
||
|
||
enum class UserState {
|
||
MAIN_MENU, // Главное меню
|
||
VIEWING_MY_TITLES, // Список моих тайтлов
|
||
AWAITING_TITLE_NAME, // Жду название тайтла для поиска
|
||
VIEWING_FOUND_TITLES, // Смотрю найденные тайтлы
|
||
VIEWING_TITLE_PAGE, // Смотрю страничку тайтла
|
||
AWAITING_REVIEW, // Жду ревью на тайтл
|
||
VIEWING_REVIEW_LIST, // Смотрю список ревью на тайтл
|
||
VIEWING_REVIEW, // Смотрю (конкретное) ревью на тайтл
|
||
VIEWING_DESCRIPTION, // Смотрю описание тайтла
|
||
ERROR, // Ошибка состояния
|
||
};
|
||
|
||
struct NavigationStep {
|
||
UserState state;
|
||
int64_t payload; // ID тайтла, ревью и т.д.
|
||
};
|
||
|
||
|
||
struct UserContext {
|
||
std::vector<NavigationStep> history; // Текущее состояние пользователя + история предыдущих состояний
|
||
};
|
||
|
||
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<int64_t, UserContext> userContexts;
|
||
|
||
void handleNavigation(TgBot::CallbackQuery::Ptr query);
|
||
|
||
void processCallbackImpl(TgBot::CallbackQuery::Ptr query);
|
||
|
||
/// @brief Получить очередную страницу тайтлов из списка пользователя
|
||
/// @param userId Идентификатор пользователя
|
||
/// @return HandlerResult
|
||
static HandlerResult returnMyTitles(int64_t userId);
|
||
|
||
/// @brief Вход в новое состояние
|
||
/// @param ctx текущий контекст
|
||
/// @param newState новое состояние, добавляемое в стек
|
||
/// @param payload полезная нагрузка этого состояния
|
||
void pushState(UserContext& ctx, UserState newState, int64_t payload);
|
||
|
||
/// @brief Возврат в предыдущее состояние
|
||
/// @param ctx Текущий контекст
|
||
/// @return true в случае успеха
|
||
bool popState(UserContext& ctx);
|
||
|
||
/// @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);
|
||
};
|