nyanimedb/modules/bot/front/include/BotUserContext.hpp

55 lines
No EOL
2.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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);
};