Store and send mod list and game version for game rooms

This commit is contained in:
Ivan Savenko
2024-04-23 17:15:59 +03:00
parent 6ba6e0d55b
commit e5f8cefa7f
12 changed files with 139 additions and 11 deletions
+34 -6
View File
@@ -33,7 +33,8 @@ void LobbyDatabase::createTables()
description TEXT NOT NULL DEFAULT '',
status INTEGER NOT NULL DEFAULT 0,
playerLimit INTEGER NOT NULL,
creationTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
creationTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
mods TEXT NOT NULL DEFAULT '[]'
);
)";
@@ -81,6 +82,32 @@ void LobbyDatabase::createTables()
database->prepare(createTableGameRoomInvites)->execute();
}
void LobbyDatabase::upgradeDatabase()
{
auto getDatabaseVersionStatement = database->prepare(R"(
PRAGMA schema.user_version
)");
auto setDatabaseVersionStatement = database->prepare(R"(
PRAGMA schema.user_version = ?
)");
int databaseVersion;
getDatabaseVersionStatement->execute();
getDatabaseVersionStatement->getColumns(databaseVersion);
if (databaseVersion < 10501)
{
database->prepare(R"(
ALTER TABLE gameRooms
ADD COLUMN version TEXT NOT NULL DEFAULT ''
ADD COLUMN mods TEXT NOT NULL DEFAULT '{}'
)")->execute();
setDatabaseVersionStatement->executeOnce(10501);
}
}
void LobbyDatabase::clearOldData()
{
static const std::string removeActiveAccounts = R"(
@@ -122,7 +149,7 @@ void LobbyDatabase::prepareStatements()
)");
insertGameRoomStatement = database->prepare(R"(
INSERT INTO gameRooms(roomID, hostAccountID, status, playerLimit) VALUES(?, ?, 0, 8);
INSERT INTO gameRooms(roomID, hostAccountID, status, playerLimit, version, mods) VALUES(?, ?, 0, 8, ?, ?);
)");
insertGameRoomPlayersStatement = database->prepare(R"(
@@ -233,7 +260,7 @@ void LobbyDatabase::prepareStatements()
)");
getActiveGameRoomsStatement = database->prepare(R"(
SELECT roomID, hostAccountID, displayName, description, status, playerLimit, strftime('%s',CURRENT_TIMESTAMP)- strftime('%s',gr.creationTime) AS secondsElapsed
SELECT roomID, hostAccountID, displayName, description, status, playerLimit, mods, strftime('%s',CURRENT_TIMESTAMP)- strftime('%s',gr.creationTime) AS secondsElapsed
FROM gameRooms gr
LEFT JOIN accounts a ON gr.hostAccountID = a.accountID
WHERE status IN (1, 2, 3)
@@ -298,6 +325,7 @@ LobbyDatabase::LobbyDatabase(const boost::filesystem::path & databasePath)
{
database = SQLiteInstance::open(databasePath, true);
createTables();
upgradeDatabase();
clearOldData();
prepareStatements();
}
@@ -393,9 +421,9 @@ void LobbyDatabase::insertGameRoomInvite(const std::string & targetAccountID, co
insertGameRoomInvitesStatement->executeOnce(roomID, targetAccountID);
}
void LobbyDatabase::insertGameRoom(const std::string & roomID, const std::string & hostAccountID)
void LobbyDatabase::insertGameRoom(const std::string & roomID, const std::string & hostAccountID, const std::string & serverVersion, const std::string & modListJson)
{
insertGameRoomStatement->executeOnce(roomID, hostAccountID);
insertGameRoomStatement->executeOnce(roomID, hostAccountID, serverVersion, modListJson);
}
void LobbyDatabase::insertAccount(const std::string & accountID, const std::string & displayName)
@@ -526,7 +554,7 @@ std::vector<LobbyGameRoom> LobbyDatabase::getActiveGameRooms()
while(getActiveGameRoomsStatement->execute())
{
LobbyGameRoom entry;
getActiveGameRoomsStatement->getColumns(entry.roomID, entry.hostAccountID, entry.hostAccountDisplayName, entry.description, entry.roomState, entry.playerLimit, entry.age);
getActiveGameRoomsStatement->getColumns(entry.roomID, entry.hostAccountID, entry.hostAccountDisplayName, entry.description, entry.roomState, entry.playerLimit, entry.version, entry.modsJson, entry.age);
result.push_back(entry);
}
getActiveGameRoomsStatement->reset();
+2 -1
View File
@@ -59,6 +59,7 @@ class LobbyDatabase
void prepareStatements();
void createTables();
void upgradeDatabase();
void clearOldData();
public:
@@ -74,7 +75,7 @@ public:
void deleteGameRoomInvite(const std::string & targetAccountID, const std::string & roomID);
void insertGameRoomInvite(const std::string & targetAccountID, const std::string & roomID);
void insertGameRoom(const std::string & roomID, const std::string & hostAccountID);
void insertGameRoom(const std::string & roomID, const std::string & hostAccountID, const std::string & serverVersion, const std::string & modListJson);
void insertAccount(const std::string & accountID, const std::string & displayName);
void insertAccessCookie(const std::string & accountID, const std::string & accessCookieUUID);
void insertChatMessage(const std::string & sender, const std::string & channelType, const std::string & roomID, const std::string & messageText);
+2
View File
@@ -44,6 +44,8 @@ struct LobbyGameRoom
std::string hostAccountID;
std::string hostAccountDisplayName;
std::string description;
std::string version;
std::string modsJson;
std::vector<LobbyAccount> participants;
LobbyRoomState roomState;
uint32_t playerLimit;
+4 -1
View File
@@ -208,9 +208,11 @@ static JsonNode loadLobbyGameRoomToJson(const LobbyGameRoom & gameRoom)
jsonEntry["hostAccountID"].String() = gameRoom.hostAccountID;
jsonEntry["hostAccountDisplayName"].String() = gameRoom.hostAccountDisplayName;
jsonEntry["description"].String() = gameRoom.description;
jsonEntry["version"].String() = gameRoom.version;
jsonEntry["status"].String() = LOBBY_ROOM_STATE_NAMES[vstd::to_underlying(gameRoom.roomState)];
jsonEntry["playerLimit"].Integer() = gameRoom.playerLimit;
jsonEntry["ageSeconds"].Integer() = gameRoom.age.count();
jsonEntry["mods"] = JsonNode(reinterpret_cast<const std::byte *>(gameRoom.modsJson.data()), gameRoom.modsJson.size());
for(const auto & account : gameRoom.participants)
jsonEntry["participants"].Vector().push_back(loadLobbyAccountToJson(account));
@@ -625,7 +627,8 @@ void LobbyServer::receiveServerLogin(const NetworkConnectionPtr & connection, co
}
else
{
database->insertGameRoom(gameRoomID, accountID);
std::string modListString = json["mods"].isNull() ? "[]" : json["mods"].toCompactString();
database->insertGameRoom(gameRoomID, accountID, version, modListString);
activeGameRooms[connection] = gameRoomID;
sendServerLoginSuccess(connection, accountCookie);
broadcastActiveGameRooms();