1#ifndef CAVOKE_GAME_SESSION_H
2#define CAVOKE_GAME_SESSION_H
4#include <drogon/HttpAppFramework.h>
5#include <drogon/utils/Utilities.h>
6#include <boost/bimap.hpp>
13#include "cavoke_base_exception.h"
14#include "model/games/game.h"
15#include "sql-models/Players.h"
16#include "sql-models/Sessions.h"
17#include "sql-models/Statuses.h"
18#include "sql-models/Users.h"
20namespace cavoke::server::model {
32 enum SessionStatus { NOT_STARTED = 0, RUNNING = 1, FINISHED = 2 };
34 drogon::orm::DbClientPtr dbClient = drogon::app().getDbClient())
35 : dbClient(std::move(dbClient)) {
38 std::string session_id,
40 drogon::orm::DbClientPtr dbClient = drogon::app().getDbClient())
41 : id(std::move(session_id)),
42 m_game_config(std::move(game_config)),
43 dbClient(std::move(dbClient)) {
47 void add_user(
const std::string &user_id,
48 std::optional<int> player_id = {});
54 void set_role(
const std::string &user_id,
int new_role);
63 void start(
const json &game_settings);
71 [[nodiscard]]
int get_player_id(
const std::string &user_id)
const;
73 [[nodiscard]] std::string get_host()
const;
75 [[nodiscard]]
bool is_player(
const std::string &user_id)
const;
77 [[nodiscard]]
bool is_host(
const std::string &user_id)
const;
79 [[nodiscard]] std::string
get_user_id(
int player_id)
const;
83 std::string display_name;
85 static UserInfo from_user(
const drogon_model::cavoke_orm::Users &user) {
86 return {user.getValueOfId(), user.getValueOfDisplayName()};
98 std::string session_id;
101 SessionStatus status;
102 std::vector<PlayerInfo> players;
107 [[nodiscard]] std::vector<int> get_occupied_positions()
const;
109 [[nodiscard]] std::vector<PlayerInfo> get_players()
const;
116 const std::string &session_id);
120 const drogon_model::cavoke_orm::Sessions &session,
121 const drogon_model::cavoke_orm::Statuses &status,
122 std::vector<PlayerInfo> players);
128 drogon::orm::DbClientPtr dbClient;
130 mutable drogon::orm::Mapper<drogon_model::cavoke_orm::Sessions>
131 default_mp_sessions{dbClient};
132 mutable drogon::orm::Mapper<drogon_model::cavoke_orm::Statuses>
133 default_mp_statuses{dbClient};
134 mutable drogon::orm::Mapper<drogon_model::cavoke_orm::Players>
135 default_mp_players{dbClient};
137 drogon_model::cavoke_orm::Sessions get_snapshot()
const;
138 drogon_model::cavoke_orm::Statuses get_actual_status()
const;
139 void set_status(SessionStatus status);
142NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(GameSessionAccessObject::UserInfo,
146NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(GameSessionAccessObject::PlayerInfo,
150NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(GameSessionAccessObject::GameSessionInfo,
Base exception for errors thrown in server.
Serializable representation of session for client.
Serializable representation of participant for client.
void update_status(bool is_terminal)
static GameSessionInfo make_session_info(const drogon_model::cavoke_orm::Sessions &session, const drogon_model::cavoke_orm::Statuses &status, std::vector< PlayerInfo > players)
Builds a session info from a session.
int get_player_id(const std::string &user_id) const
void remove_user(const std::string &user_id)
Removes given user.
void leave_session(const std::string &user_id)
Leave current session (and transfer host/delete session)
GameSessionInfo get_session_info() const
Generates an info object (representation for client)
void delete_session()
Delete current session.
void add_user(const std::string &user_id, std::optional< int > player_id={})
Adds given user to the session into given or minimal available position.
void set_role(const std::string &user_id, int new_role)
Changes game role for given user.
static drogon_model::cavoke_orm::Sessions get_snapshot(const std::string &session_id)
Fetches current session information from the DB.
void start(const json &game_settings)
Marks session as starts.
std::string get_user_id(int player_id) const
exception for errors thrown during actions with sessions