Лобби: комнаты на сервере (C++) и UI на клиенте

Сервер: Lobby/Room/Player — create/join/leave/list_rooms, broadcast обновлений,
проверка авторизации (hello) и состояния комнаты (waiting/full/in_progress).
Клиент: полноценный UI лобби (создание, список, вход в комнату, выход),
блокировка кнопок до установки WS-соединения.
nginx: no-cache для JS/CSS (нет хеширования имён файлов).
This commit is contained in:
2026-07-26 21:22:20 +05:00
parent 238d3d5d26
commit 864868de49
9 changed files with 538 additions and 42 deletions
+64
View File
@@ -0,0 +1,64 @@
#pragma once
#include <App.h>
#include <nlohmann/json.hpp>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using json = nlohmann::json;
struct PerSocketData {
std::string player_id;
std::string nickname;
std::string room_id; // пусто, если игрок в лобби, а не в комнате
};
using WS = uWS::WebSocket<false, true, PerSocketData>;
struct RoomPlayer {
std::string player_id;
std::string nickname;
WS *ws;
};
struct Room {
std::string id;
std::string mode; // "coop" | "pvp"
std::string state = "waiting"; // waiting | playing | finished
std::vector<RoomPlayer> players;
};
// Лобби и реестр комнат (этап 3 из TZ.md). Игровая логика — этапы 4-5.
class Lobby {
public:
void onOpen(WS *ws);
void onMessage(WS *ws, std::string_view message);
void onClose(WS *ws);
private:
static constexpr size_t kMaxPlayersPerRoom = 2;
std::unordered_map<std::string, Room> rooms_;
std::unordered_set<WS *> sockets_;
int next_player_id_ = 1;
int next_room_id_ = 1;
void handleHello(WS *ws, const json &payload);
void handleListRooms(WS *ws);
void handleCreateRoom(WS *ws, const json &payload);
void handleJoinRoom(WS *ws, const json &payload);
void handleLeaveRoom(WS *ws);
void removePlayerFromRoom(WS *ws);
void broadcastRoomsToLobby();
void broadcastRoomUpdated(const Room &room, WS *exclude = nullptr);
json roomsSummary() const;
json roomPlayers(const Room &room) const;
std::string generateRoomId();
static void send(WS *ws, const std::string &type, json payload);
static void sendError(WS *ws, const std::string &code, const std::string &message);
};