refactor(tgbot-front): replaced the context usage with a new thread-safe one
This commit is contained in:
parent
b1c035ae35
commit
a6848bb4d7
5 changed files with 55 additions and 56 deletions
|
|
@ -3,6 +3,7 @@
|
|||
#include <vector>
|
||||
#include <mutex>
|
||||
#include <optional>
|
||||
#include "constants.hpp"
|
||||
|
||||
enum class UserState {
|
||||
MAIN_MENU, // Главное меню
|
||||
|
|
@ -50,6 +51,13 @@ public:
|
|||
// Получить текущий шаг (последний в истории) или std::nullopt, если нет истории
|
||||
std::optional<NavigationStep> getCurrentStep(int64_t userId) const;
|
||||
|
||||
// pop последнего состояния. true в случае удачи
|
||||
bool popStep(int64_t userId);
|
||||
|
||||
// Удалить контекст пользователя (например, при логауте)
|
||||
void removeContext(int64_t userId);
|
||||
|
||||
/// @brief Создает контекст начального меню для пользователя
|
||||
/// @param userId
|
||||
void createInitContext(int64_t userId);
|
||||
};
|
||||
|
|
@ -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 - запрос
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue