55 lines
No EOL
2.5 KiB
C++
55 lines
No EOL
2.5 KiB
C++
#pragma once
|
||
#include <unordered_map>
|
||
#include <vector>
|
||
#include <mutex>
|
||
#include <optional>
|
||
|
||
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 BotUserContext {
|
||
private:
|
||
mutable std::mutex mtx;
|
||
std::unordered_map<int64_t, UserContext> userContexts;
|
||
|
||
public:
|
||
// Получить копию контекста пользователя (или std::nullopt, если не найден)
|
||
std::optional<UserContext> 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<NavigationStep>& history);
|
||
|
||
// Получить текущий шаг (последний в истории) или std::nullopt, если нет истории
|
||
std::optional<NavigationStep> getCurrentStep(int64_t userId) const;
|
||
|
||
// Удалить контекст пользователя (например, при логауте)
|
||
void removeContext(int64_t userId);
|
||
}; |