#pragma once #include #include #include #include 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 history; // Текущее состояние пользователя + история предыдущих состояний }; class BotUserContext { private: mutable std::mutex mtx; std::unordered_map userContexts; public: // Получить копию контекста пользователя (или std::nullopt, если не найден) std::optional getContext(int64_t userId) const; // Установить/обновить контекст пользователя void setContext(int64_t userId, const UserContext& context); // Добавить шаг навигации к существующему контексту пользователя // Если пользователя нет — создаётся новый контекст void pushNavigationStep(int64_t userId, const NavigationStep& step); // Заменить текущую историю (полезно, например, при сбросе состояния) void setNavigationHistory(int64_t userId, const std::vector& history); // Получить текущий шаг (последний в истории) или std::nullopt, если нет истории std::optional getCurrentStep(int64_t userId) const; // Удалить контекст пользователя (например, при логауте) void removeContext(int64_t userId); };