#ifndef HIVE_MIND_CORE_SESSION_H_ #define HIVE_MIND_CORE_SESSION_H_ #include #include #include #include #include #include #include "core/card.h" #include "core/user.h" #include "core/user_state.h" #include "util/common.h" enum class SessionState { pending, ongoing, finished }; class Session { public: static Arc create_session(Arc creator, std::vector> &card_list, int player_num); static Arc get_session(const std::string &session_id); void add_user(Arc user); void kick_user(Arc kicking_user, Arc kicked_user); void select_card(Arc user, Arc card); void start(Arc starting_user); mstch::map get_user_session_view(Arc user); std::string get_card_str(Arc user); int64_t get_user_timestamp(Arc user); const std::string &get_session_id() {return session_id;} private: Arc get_user_state(Arc user); Arc get_creator(); void sanitize_state(); bool need_new_pack(); bool should_finish(); void validate_user(Arc user); void validate_user_is_new(Arc user); void validate_creator(Arc user); void validate_session_state(SessionState state); std::string session_id; int player_num; SessionState session_state = SessionState::pending; std::vector> users; std::queue> remained_cards; std::chrono::time_point time_created; int round_num = 0; std::mutex lock; }; #endif