Cavoke  1.1.0
A Platform for creating and hosting multiplayer turn-based board games
Loading...
Searching...
No Matches
game_session.h
1#ifndef CAVOKE_GAME_SESSION_H
2#define CAVOKE_GAME_SESSION_H
3
4#include <drogon/HttpAppFramework.h>
5#include <drogon/utils/Utilities.h>
6#include <boost/bimap.hpp>
7#include <map>
8#include <random>
9#include <shared_mutex>
10#include <string>
11#include <utility>
12#include "cavoke.h"
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"
19
20namespace cavoke::server::model {
21
24 explicit game_session_error(std::string message);
25};
26
32 enum SessionStatus { NOT_STARTED = 0, RUNNING = 1, FINISHED = 2 };
34 drogon::orm::DbClientPtr dbClient = drogon::app().getDbClient())
35 : dbClient(std::move(dbClient)) {
36 }
38 std::string session_id,
39 GameConfig game_config,
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)) {
44 }
45
47 void add_user(const std::string &user_id,
48 std::optional<int> player_id = {});
49
51 void remove_user(const std::string &user_id);
52
54 void set_role(const std::string &user_id, int new_role);
55
57 void delete_session();
58
60 void leave_session(const std::string &user_id);
61
63 void start(const json &game_settings);
64
69 void update_status(bool is_terminal);
70
71 [[nodiscard]] int get_player_id(const std::string &user_id) const;
72
73 [[nodiscard]] std::string get_host() const;
74
75 [[nodiscard]] bool is_player(const std::string &user_id) const;
76
77 [[nodiscard]] bool is_host(const std::string &user_id) const;
78
79 [[nodiscard]] std::string get_user_id(int player_id) const;
80
81 struct UserInfo {
82 std::string user_id;
83 std::string display_name;
84
85 static UserInfo from_user(const drogon_model::cavoke_orm::Users &user) {
86 return {user.getValueOfId(), user.getValueOfDisplayName()};
87 }
88 };
89
91 struct PlayerInfo {
92 UserInfo user;
93 int player_id;
94 };
95
98 std::string session_id;
99 std::string game_id;
100 std::string host_id;
101 SessionStatus status;
102 std::vector<PlayerInfo> players;
103 };
104
105 [[nodiscard]] GameSessionInfo get_session_info() const;
106
107 [[nodiscard]] std::vector<int> get_occupied_positions() const;
108
109 [[nodiscard]] std::vector<PlayerInfo> get_players() const;
110
111 // [[nodiscard]] std::optional<json> &get_game_settings() const; //
112 // unused, was non-trivial to implement.
113
115 static drogon_model::cavoke_orm::Sessions get_snapshot(
116 const std::string &session_id);
117
120 const drogon_model::cavoke_orm::Sessions &session,
121 const drogon_model::cavoke_orm::Statuses &status,
122 std::vector<PlayerInfo> players);
123
124private:
125 std::string id;
126 GameConfig m_game_config{};
127
128 drogon::orm::DbClientPtr dbClient;
129
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};
136
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);
140};
141
142NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(GameSessionAccessObject::UserInfo,
143 user_id,
144 display_name);
145
146NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(GameSessionAccessObject::PlayerInfo,
147 user,
148 player_id);
149
150NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(GameSessionAccessObject::GameSessionInfo,
151 session_id,
152 game_id,
153 host_id,
154 status,
155 players);
156} // namespace cavoke::server::model
157
158#endif // CAVOKE_GAME_SESSION_H
Base exception for errors thrown in server.
Serializable representation of session for client.
Definition: game_session.h:97
Serializable representation of participant for client.
Definition: game_session.h:91
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
Definition: game_session.h:23