1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-03-31 22:05:10 +02:00

WIP: Implemented joining public rooms

This commit is contained in:
Ivan Savenko 2024-01-28 00:04:54 +02:00
parent 6d2ca070ea
commit bed05eb52d
4 changed files with 39 additions and 15 deletions

View File

@ -51,23 +51,20 @@ void GlobalLobbyWindow::doSendChatMessage()
void GlobalLobbyWindow::doCreateGameRoom() void GlobalLobbyWindow::doCreateGameRoom()
{ {
GH.windows().createAndPushWindow<GlobalLobbyServerSetup>(); GH.windows().createAndPushWindow<GlobalLobbyServerSetup>();
// TODO:
// start local server and supply our UUID / client credentials to it
// server logs into lobby ( uuid = client, mode = server ). This creates 'room' in mode 'empty'
// server starts accepting connections from players (including host)
// client connects to local server
// client sends createGameRoom query to lobby with own / server UUID and mode 'direct' (non-proxy)
// client requests to change room status to private or public
} }
void GlobalLobbyWindow::doInviteAccount(const std::string & accountID) void GlobalLobbyWindow::doInviteAccount(const std::string & accountID)
{ {
assert(0); // TODO
} }
void GlobalLobbyWindow::doJoinRoom(const std::string & roomID) void GlobalLobbyWindow::doJoinRoom(const std::string & roomID)
{ {
JsonNode toSend;
toSend["type"].String() = "joinGameRoom";
toSend["gameRoomID"].String() = roomID;
CSH->getGlobalLobby().sendMessage(toSend);
} }
void GlobalLobbyWindow::onGameChatMessage(const std::string & sender, const std::string & message, const std::string & when) void GlobalLobbyWindow::onGameChatMessage(const std::string & sender, const std::string & message, const std::string & when)

View File

@ -176,12 +176,18 @@ void LobbyDatabase::prepareStatements()
WHERE status = 1 WHERE status = 1
)"; )";
static const std::string countAccountsInRoomText = R"( static const std::string countRoomUsedSlotsText = R"(
SELECT COUNT(accountID) SELECT COUNT(accountID)
FROM gameRoomPlayers FROM gameRoomPlayers
WHERE roomID = ? WHERE roomID = ?
)"; )";
static const std::string countRoomTotalSlotsText = R"(
SELECT playerLimit
FROM gameRooms
WHERE roomID = ?
)";
static const std::string getAccountDisplayNameText = R"( static const std::string getAccountDisplayNameText = R"(
SELECT displayName SELECT displayName
FROM accounts FROM accounts
@ -245,7 +251,8 @@ void LobbyDatabase::prepareStatements()
getActiveAccountsStatement = database->prepare(getActiveAccountsText); getActiveAccountsStatement = database->prepare(getActiveAccountsText);
getActiveGameRoomsStatement = database->prepare(getActiveGameRoomsText); getActiveGameRoomsStatement = database->prepare(getActiveGameRoomsText);
getAccountDisplayNameStatement = database->prepare(getAccountDisplayNameText); getAccountDisplayNameStatement = database->prepare(getAccountDisplayNameText);
countAccountsInRoomStatement = database->prepare(countAccountsInRoomText); countRoomUsedSlotsStatement = database->prepare(countRoomUsedSlotsText);
countRoomTotalSlotsStatement = database->prepare(countRoomTotalSlotsText);
isAccountCookieValidStatement = database->prepare(isAccountCookieValidText); isAccountCookieValidStatement = database->prepare(isAccountCookieValidText);
isPlayerInGameRoomStatement = database->prepare(isPlayerInGameRoomText); isPlayerInGameRoomStatement = database->prepare(isPlayerInGameRoomText);
@ -404,6 +411,22 @@ LobbyRoomState LobbyDatabase::getGameRoomStatus(const std::string & roomID)
uint32_t LobbyDatabase::getGameRoomFreeSlots(const std::string & roomID) uint32_t LobbyDatabase::getGameRoomFreeSlots(const std::string & roomID)
{ {
uint32_t usedSlots = 0;
uint32_t totalSlots = 0;
countRoomUsedSlotsStatement->setBinds(roomID);
if(countRoomUsedSlotsStatement->execute())
countRoomUsedSlotsStatement->getColumns(usedSlots);
countRoomUsedSlotsStatement->reset();
countRoomTotalSlotsStatement->setBinds(roomID);
if(countRoomTotalSlotsStatement->execute())
countRoomTotalSlotsStatement->getColumns(totalSlots);
countRoomTotalSlotsStatement->reset();
if (totalSlots > usedSlots)
return totalSlots - usedSlots;
return 0; return 0;
} }
@ -443,10 +466,10 @@ std::vector<LobbyGameRoom> LobbyDatabase::getActiveGameRooms()
for (auto & room : result) for (auto & room : result)
{ {
countAccountsInRoomStatement->setBinds(room.roomID); countRoomUsedSlotsStatement->setBinds(room.roomID);
if(countAccountsInRoomStatement->execute()) if(countRoomUsedSlotsStatement->execute())
countAccountsInRoomStatement->getColumns(room.playersCount); countRoomUsedSlotsStatement->getColumns(room.playersCount);
countAccountsInRoomStatement->reset(); countRoomUsedSlotsStatement->reset();
} }
return result; return result;
} }

View File

@ -41,7 +41,8 @@ class LobbyDatabase
SQLiteStatementPtr getActiveAccountsStatement; SQLiteStatementPtr getActiveAccountsStatement;
SQLiteStatementPtr getAccountGameRoomStatement; SQLiteStatementPtr getAccountGameRoomStatement;
SQLiteStatementPtr getAccountDisplayNameStatement; SQLiteStatementPtr getAccountDisplayNameStatement;
SQLiteStatementPtr countAccountsInRoomStatement; SQLiteStatementPtr countRoomUsedSlotsStatement;
SQLiteStatementPtr countRoomTotalSlotsStatement;
SQLiteStatementPtr isAccountCookieValidStatement; SQLiteStatementPtr isAccountCookieValidStatement;
SQLiteStatementPtr isGameRoomCookieValidStatement; SQLiteStatementPtr isGameRoomCookieValidStatement;

View File

@ -485,6 +485,9 @@ void LobbyServer::receiveJoinGameRoom(const NetworkConnectionPtr & connection, c
auto roomStatus = database->getGameRoomStatus(gameRoomID); auto roomStatus = database->getGameRoomStatus(gameRoomID);
if(roomStatus != LobbyRoomState::PRIVATE && roomStatus != LobbyRoomState::PUBLIC)
return;
if(roomStatus == LobbyRoomState::PRIVATE) if(roomStatus == LobbyRoomState::PRIVATE)
{ {
if(database->getAccountInviteStatus(accountID, gameRoomID) != LobbyInviteStatus::INVITED) if(database->getAccountInviteStatus(accountID, gameRoomID) != LobbyInviteStatus::INVITED)