ConnectX 3.0
ConnectX Game Suite
Loading...
Searching...
No Matches
client.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <string>
4#include <functional>
5#include <thread>
6#include <atomic>
7#include <mutex>
8#include <optional>
9#include <future>
10#include <sockpp/tcp_connector.h>
11
12#include "protocol/protocol.hpp"
13
18class Client
19{
20public:
21 // Callback types
22 using DisconnectedCallback = std::function<void()>;
23 using GameStateUpdateCallback = std::function<void(const GameStateUpdate &)>;
24 using MoveResultCallback = std::function<void(bool success, const std::string &message)>;
25 using ErrorCallback = std::function<void(uint16_t error_code, const std::string &message)>;
26
27 Client();
28 ~Client();
29
30 // ========================================================================
31 // Connection Management
32 // ========================================================================
33
40 bool connect(const std::string &host, uint16_t port);
41
45 void disconnect();
46
50 bool isConnected() const { return connected_; }
51
55 bool isRunning() const { return running_; }
56
61 void run();
62
66 void stop();
67
68 // ========================================================================
69 // Game Actions
70 // ========================================================================
71
76 bool sendConnectRequest(const std::string &player_name);
77
81 bool sendCreateGame(const GameConfig &config, const std::string &name = "");
82
86 bool sendListGames();
87
91 bool sendJoinGame(uint32_t game_id);
92
97 bool sendMove(uint8_t column);
98
102 bool sendDisconnect(const std::string &reason = "Client disconnecting");
103
104 // ===========================================================================
105 // Synchronous Requests
106 // ===========================================================================
107 std::optional<ConnectResponse> requestConnect(const std::string &player_name, int timeout_ms = 3000);
108 std::optional<CreateGameResponse> requestCreateGame(const GameConfig &config, const std::string &name = "", int timeout_ms = 3000);
109 std::optional<ListGamesResponse> requestGamesList(int timeout_ms = 3000);
110 std::optional<JoinGameResponse> requestJoinGame(uint32_t game_id, int timeout_ms = 3000);
111
112 // ========================================================================
113 // Callbacks (set these to handle events)
114 // ========================================================================
115
117 {
118 disconnected_callback_ = callback;
119 }
120
122 {
123 game_state_callback_ = callback;
124 }
125
127 {
128 move_result_callback_ = callback;
129 }
130
131 void onError(ErrorCallback callback)
132 {
133 error_callback_ = callback;
134 }
135
136 // ========================================================================
137 // State Accessors
138 // ========================================================================
139
143 const std::string &getSessionToken() const { return session_token_; }
144
148 uint8_t getPlayerId() const { return player_id_; }
149
150 std::optional<uint8_t> getPlayerIndex(const GameStateUpdate &state, uint8_t player_id)
151 {
152 auto it = std::find(state.players.begin(), state.players.end(), player_id);
153 if (it != state.players.end())
154 {
155 return std::distance(state.players.begin(), it);
156 }
157 return std::nullopt;
158 }
159
163 const std::optional<GameInfo> &getGameInfo() const { return game_info_; }
164
168 uint32_t getGameId() const { return game_info_.has_value() ? game_info_->game_id : 0; }
169
173 std::string getGameName() const { return game_info_.has_value() ? game_info_->game_name : std::string(); }
174
178 const std::optional<GameStateUpdate> &getCurrentState() const
179 {
180 return current_state_;
181 }
182
186 bool isMyTurn() const
187 {
188 if (!current_state_.has_value() || current_state_->status != ProtocolGameStatus::IN_PROGRESS)
189 return false;
190 return current_state_->current_player == player_id_;
191 }
192
193private:
194 // Network
195 sockpp::tcp_connector socket_;
196 std::atomic<bool> connected_;
197 std::atomic<bool> running_;
198
199 // Session state
200 std::string session_token_;
201 uint8_t player_id_;
202 std::optional<GameInfo> game_info_;
203 std::optional<GameStateUpdate> current_state_;
204 std::mutex state_mutex_;
205
206 // Promise management for responses
207 std::mutex promise_mutex_;
208 std::unordered_map<MessageType, std::promise<std::string>> pending_promises_;
209
210 // Callbacks
211 DisconnectedCallback disconnected_callback_;
212 GameStateUpdateCallback game_state_callback_;
213 MoveResultCallback move_result_callback_;
214 ErrorCallback error_callback_;
215
216 // Internal methods
217 bool sendMessage(MessageType type, const std::string &payload);
218 std::optional<std::string> waitForResponse(MessageType type, std::chrono::milliseconds timeout);
219 std::string readMessage();
220 bool writeMessage(const std::string &message);
221 void processMessage(const std::string &data);
222
223 // Message handlers
224 void handleGameStateUpdate(const std::string &payload);
225 void handleMoveResult(const std::string &payload);
226 void handleError(const std::string &payload);
227};
Definition client.hpp:19
bool sendListGames()
Definition client.cpp:170
const std::string & getSessionToken() const
Definition client.hpp:143
bool connect(const std::string &host, uint16_t port)
Definition client.cpp:23
void onMoveResult(MoveResultCallback callback)
Definition client.hpp:126
uint32_t getGameId() const
Definition client.hpp:168
std::string getGameName() const
Definition client.hpp:173
std::optional< ListGamesResponse > requestGamesList(int timeout_ms=3000)
Definition client.cpp:235
std::optional< ConnectResponse > requestConnect(const std::string &player_name, int timeout_ms=3000)
Definition client.cpp:191
bool sendConnectRequest(const std::string &player_name)
Definition client.cpp:127
bool sendMove(uint8_t column)
Definition client.cpp:136
const std::optional< GameInfo > & getGameInfo() const
Definition client.hpp:163
~Client()
Definition client.cpp:14
bool isMyTurn() const
Definition client.hpp:186
uint8_t getPlayerId() const
Definition client.hpp:148
std::optional< uint8_t > getPlayerIndex(const GameStateUpdate &state, uint8_t player_id)
Definition client.hpp:150
void disconnect()
Definition client.cpp:49
std::optional< JoinGameResponse > requestJoinGame(uint32_t game_id, int timeout_ms=3000)
Definition client.cpp:251
void stop()
Definition client.cpp:114
std::optional< CreateGameResponse > requestCreateGame(const GameConfig &config, const std::string &name="", int timeout_ms=3000)
Definition client.cpp:213
std::function< void(bool success, const std::string &message)> MoveResultCallback
Definition client.hpp:24
std::function< void(const GameStateUpdate &)> GameStateUpdateCallback
Definition client.hpp:23
bool isConnected() const
Definition client.hpp:50
std::function< void(uint16_t error_code, const std::string &message)> ErrorCallback
Definition client.hpp:25
void onGameStateUpdate(GameStateUpdateCallback callback)
Definition client.hpp:121
void run()
Definition client.cpp:75
bool sendCreateGame(const GameConfig &config, const std::string &name="")
Definition client.cpp:145
Client()
Definition client.cpp:7
void onError(ErrorCallback callback)
Definition client.hpp:131
const std::optional< GameStateUpdate > & getCurrentState() const
Definition client.hpp:178
std::function< void()> DisconnectedCallback
Definition client.hpp:22
bool sendJoinGame(uint32_t game_id)
Definition client.cpp:161
bool sendDisconnect(const std::string &reason="Client disconnecting")
Definition client.cpp:179
bool isRunning() const
Definition client.hpp:55
void onDisconnected(DisconnectedCallback callback)
Definition client.hpp:116
MessageType
Definition messagetype.hpp:14
Definition messages.hpp:113
Definition messages.hpp:83
std::vector< uint8_t > players
Definition messages.hpp:91