refactor(tgbot-front): replaced the context usage with a new thread-safe one

This commit is contained in:
Kirill 2025-12-06 05:02:34 +03:00
parent b1c035ae35
commit a6848bb4d7
5 changed files with 55 additions and 56 deletions

View file

@ -4,6 +4,7 @@
#include <structs.hpp>
#include <unordered_map>
#include "BotToServer.hpp"
#include "BotUserContext.hpp"
/// @brief Структура возвращаемого значения класса BotHandlers для изменения текущего сообщения
struct HandlerResult {
@ -11,30 +12,6 @@ struct HandlerResult {
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 {
int64_t userId;
std::vector<NavigationStep> history; // Текущее состояние пользователя + история предыдущих состояний
};
class BotHandlers {
public:
BotHandlers(TgBot::Api api) : botApi(api) {;}
@ -51,19 +28,16 @@ public:
/// в боте.
/// @param message обрабатываемое сообщение
void handleMessage(TgBot::Message::Ptr message);
/// @brief Создает контекст начального меню для пользователя
/// @param chatId id чата пользователя
void createInitContext(int64_t chatId);
void initUser(int64_t userId);
private:
TgBot::Api botApi;
std::unordered_map<int64_t, UserContext> userContexts;
BotUserContext contextManager;
BotToServer server_;
void handleNavigation(TgBot::CallbackQuery::Ptr query, UserContext& ctx);
void handleNavigation(TgBot::CallbackQuery::Ptr query);
void handleError(TgBot::CallbackQuery::Ptr query, UserContext& ctx);
void handleError(TgBot::CallbackQuery::Ptr query);
void processCallbackImpl(TgBot::CallbackQuery::Ptr query);
@ -73,17 +47,6 @@ private:
/// @return HandlerResult
/// static HandlerResult returnMyTitles(int64_t userId, int64_t payload);
/// @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 Текущее состояние
@ -105,7 +68,7 @@ private:
/// @brief Отрисовка текущего экрана (соотв. контексту)
/// @param ctx - текущий контекст
void renderCurrent(TgBot::CallbackQuery::Ptr query, const UserContext& ctx);
void renderCurrent(TgBot::CallbackQuery::Ptr query);
/// @brief Логика переходов между контекстами (навигация на следующий шаг)
/// @param query - запрос