From 0eaa226dce9038c31ef9977b000c39238ad7c761 Mon Sep 17 00:00:00 2001
From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com>
Date: Sun, 15 Oct 2023 10:47:19 +0200
Subject: [PATCH] Change JSON field types send to master server

They were all strings; changed them to what made most sense for each field type. Changes:
"hidden": string -> bool
"port": string -> int
"checksum": string -> uint
"playerCount": string -> int
"maxPlayers": string -> int
---
 r5dev/engine/host_state.cpp          |  8 +++---
 r5dev/game/client/vscript_client.cpp | 12 ++++-----
 r5dev/gameui/IBrowser.cpp            | 18 +++++++------
 r5dev/networksystem/listmanager.cpp  | 10 ++++----
 r5dev/networksystem/listmanager.h    |  2 +-
 r5dev/networksystem/pylon.cpp        | 38 ++++++++++++++--------------
 r5dev/networksystem/serverlisting.h  |  8 +++---
 7 files changed, 49 insertions(+), 47 deletions(-)

diff --git a/r5dev/engine/host_state.cpp b/r5dev/engine/host_state.cpp
index 68fc614e..cf013480 100644
--- a/r5dev/engine/host_state.cpp
+++ b/r5dev/engine/host_state.cpp
@@ -339,12 +339,12 @@ void CHostState::Think(void) const
 			g_pHostState->m_levelName,
 			KeyValues_GetCurrentPlaylist(),
 			hostip->GetString(),
-			hostport->GetString(),
+			hostport->GetInt(),
 			g_pNetKey->GetBase64NetKey(),
-			std::to_string(*g_nServerRemoteChecksum),
+			*g_nServerRemoteChecksum,
 			SDK_VERSION,
-			std::to_string(g_pServer->GetNumClients()),
-			std::to_string(g_ServerGlobalVariables->m_nMaxClients),
+			g_pServer->GetNumClients(),
+			g_ServerGlobalVariables->m_nMaxClients,
 			std::chrono::duration_cast<std::chrono::milliseconds>(
 				std::chrono::system_clock::now().time_since_epoch()
 				).count()
diff --git a/r5dev/game/client/vscript_client.cpp b/r5dev/game/client/vscript_client.cpp
index ad503877..e514e717 100644
--- a/r5dev/game/client/vscript_client.cpp
+++ b/r5dev/game/client/vscript_client.cpp
@@ -204,8 +204,8 @@ namespace VScriptCode
                 return SQ_ERROR;
             }
 
-            const string& playerCount = g_pServerListManager->m_vServerList[iServer].m_svPlayerCount.c_str();
-            sq_pushinteger(v, strtol(playerCount.c_str(), NULL, NULL));
+            const SQInteger playerCount = g_pServerListManager->m_vServerList[iServer].m_nPlayerCount;
+            sq_pushinteger(v, playerCount);
 
             return SQ_OK;
         }
@@ -223,8 +223,8 @@ namespace VScriptCode
                 return SQ_ERROR;
             }
 
-            const string& maxPlayers = g_pServerListManager->m_vServerList[iServer].m_svMaxPlayers;
-            sq_pushinteger(v, strtol(maxPlayers.c_str(), NULL, NULL));
+            const SQInteger maxPlayers = g_pServerListManager->m_vServerList[iServer].m_nMaxPlayers;
+            sq_pushinteger(v, maxPlayers);
 
             return SQ_OK;
         }
@@ -322,7 +322,7 @@ namespace VScriptCode
 
             const NetGameServer_t& gameServer = g_pServerListManager->m_vServerList[iServer];
 
-            g_pServerListManager->ConnectToServer(gameServer.m_svIpAddress, gameServer.m_svGamePort,
+            g_pServerListManager->ConnectToServer(gameServer.m_svIpAddress, gameServer.m_nGamePort,
                 gameServer.m_svEncryptionKey);
 
             return SQ_OK;
@@ -344,7 +344,7 @@ namespace VScriptCode
             bool result = g_pMasterServer->GetServerByToken(netListing, hiddenServerRequestMessage, privateToken); // Send token connect request.
             if (result)
             {
-                g_pServerListManager->ConnectToServer(netListing.m_svIpAddress, netListing.m_svGamePort, netListing.m_svEncryptionKey);
+                g_pServerListManager->ConnectToServer(netListing.m_svIpAddress, netListing.m_nGamePort, netListing.m_svEncryptionKey);
             }
             else
             {
diff --git a/r5dev/gameui/IBrowser.cpp b/r5dev/gameui/IBrowser.cpp
index 5544f549..6b6ffe2b 100644
--- a/r5dev/gameui/IBrowser.cpp
+++ b/r5dev/gameui/IBrowser.cpp
@@ -295,7 +295,9 @@ void CBrowser::BrowserPanel(void)
             const char* pszHostName = server.m_svHostName.c_str();
             const char* pszHostMap = server.m_svHostMap.c_str();
             const char* pszPlaylist = server.m_svPlaylist.c_str();
-            const char* pszHostPort = server.m_svGamePort.c_str();
+
+            char pszHostPort[32];
+            sprintf(pszHostPort, "%d", server.m_nGamePort);
 
             if (m_imServerBrowserFilter.PassFilter(pszHostName)
                 || m_imServerBrowserFilter.PassFilter(pszHostMap)
@@ -311,7 +313,7 @@ void CBrowser::BrowserPanel(void)
                 ImGui::Text("%s", pszPlaylist);
 
                 ImGui::TableNextColumn();
-                ImGui::Text("%s", Format("%3d/%3d", strtol(server.m_svPlayerCount.c_str(), NULL, NULL), strtol(server.m_svMaxPlayers.c_str(), NULL, NULL)).c_str());
+                ImGui::Text("%s", Format("%3d/%3d", server.m_nPlayerCount, server.m_nMaxPlayers).c_str());
 
                 ImGui::TableNextColumn();
                 ImGui::Text("%s", pszHostPort);
@@ -322,7 +324,7 @@ void CBrowser::BrowserPanel(void)
 
                 if (ImGui::Button(svConnectBtn.c_str()))
                 {
-                    g_pServerListManager->ConnectToServer(server.m_svIpAddress, pszHostPort, server.m_svEncryptionKey);
+                    g_pServerListManager->ConnectToServer(server.m_svIpAddress, server.m_nGamePort, server.m_svEncryptionKey);
                 }
             }
         }
@@ -441,7 +443,7 @@ void CBrowser::HiddenServersModal(void)
 
                 if (result && !server.m_svHostName.empty())
                 {
-                    g_pServerListManager->ConnectToServer(server.m_svIpAddress, server.m_svGamePort, server.m_svEncryptionKey); // Connect to the server
+                    g_pServerListManager->ConnectToServer(server.m_svIpAddress, server.m_nGamePort, server.m_svEncryptionKey); // Connect to the server
                     m_svHiddenServerRequestMessage = Format("Found server: %s", server.m_svHostName.c_str());
                     m_ivHiddenServerMessageColor = ImVec4(0.00f, 1.00f, 0.00f, 1.00f);
                     ImGui::CloseCurrentPopup();
@@ -745,12 +747,12 @@ void CBrowser::UpdateHostingStatus(void)
                 g_pHostState->m_levelName,
                 KeyValues_GetCurrentPlaylist(),
                 hostip->GetString(),
-                hostport->GetString(),
+                hostport->GetInt(),
                 g_pNetKey->GetBase64NetKey(),
-                std::to_string(*g_nServerRemoteChecksum),
+                *g_nServerRemoteChecksum,
                 SDK_VERSION,
-                std::to_string(g_pServer->GetNumClients()),
-                std::to_string(g_ServerGlobalVariables->m_nMaxClients),
+                g_pServer->GetNumClients(),
+                g_ServerGlobalVariables->m_nMaxClients,
                 std::chrono::duration_cast<std::chrono::milliseconds>(
                     std::chrono::system_clock::now().time_since_epoch()
                     ).count()
diff --git a/r5dev/networksystem/listmanager.cpp b/r5dev/networksystem/listmanager.cpp
index a4779dac..f87e2ba5 100644
--- a/r5dev/networksystem/listmanager.cpp
+++ b/r5dev/networksystem/listmanager.cpp
@@ -83,16 +83,16 @@ void CServerListManager::LaunchServer(const bool bChangeLevel) const
 //-----------------------------------------------------------------------------
 // Purpose: connects to specified server
 // Input  : &svIp - 
-//          &svPort - 
+//          nPort - 
 //          &svNetKey - 
 //-----------------------------------------------------------------------------
-void CServerListManager::ConnectToServer(const string& svIp, const string& svPort, const string& svNetKey) const
+void CServerListManager::ConnectToServer(const string& svIp, const int nPort, const string& svNetKey) const
 {
     if (!ThreadInMainThread())
     {
-        g_TaskScheduler->Dispatch([this, svIp, svPort, svNetKey]()
+        g_TaskScheduler->Dispatch([this, svIp, nPort, svNetKey]()
             {
-                this->ConnectToServer(svIp, svPort, svNetKey);
+                this->ConnectToServer(svIp, nPort, svNetKey);
             }, 0);
         return;
     }
@@ -101,7 +101,7 @@ void CServerListManager::ConnectToServer(const string& svIp, const string& svPor
     {
         NET_SetKey(svNetKey);
     }
-    ProcessCommand(Format("%s \"[%s]:%s\"", "connect", svIp.c_str(), svPort.c_str()).c_str());
+    ProcessCommand(Format("%s \"[%s]:%i\"", "connect", svIp.c_str(), nPort).c_str());
 }
 
 //-----------------------------------------------------------------------------
diff --git a/r5dev/networksystem/listmanager.h b/r5dev/networksystem/listmanager.h
index 73fc78bc..b6377682 100644
--- a/r5dev/networksystem/listmanager.h
+++ b/r5dev/networksystem/listmanager.h
@@ -24,7 +24,7 @@ public:
 	void ClearServerList(void);
 
 	void LaunchServer(const bool bChangeLevel) const;
-	void ConnectToServer(const string& svIp, const string& svPort, const string& svNetKey) const;
+	void ConnectToServer(const string& svIp, const int nPort, const string& svNetKey) const;
 	void ConnectToServer(const string& svServer, const string& svNetKey) const;
 
 	void ProcessCommand(const char* pszCommand) const;
diff --git a/r5dev/networksystem/pylon.cpp b/r5dev/networksystem/pylon.cpp
index f9bb0e18..41ee01db 100644
--- a/r5dev/networksystem/pylon.cpp
+++ b/r5dev/networksystem/pylon.cpp
@@ -20,15 +20,15 @@ static bool IsServerListingValid(const rapidjson::Value& value)
 {
     if (value.HasMember("name")        && value["name"].IsString()        &&
         value.HasMember("description") && value["description"].IsString() &&
-        value.HasMember("hidden")      && value["hidden"].IsString()      && // TODO: Bool???
+        value.HasMember("hidden")      && value["hidden"].IsBool()        &&
         value.HasMember("map")         && value["map"].IsString()         &&
         value.HasMember("playlist")    && value["playlist"].IsString()    &&
         value.HasMember("ip")          && value["ip"].IsString()          &&
-        value.HasMember("port")        && value["port"].IsString()        && // TODO: Int32???
+        value.HasMember("port")        && value["port"].IsInt()           &&
         value.HasMember("key")         && value["key"].IsString()         &&
-        value.HasMember("checksum")    && value["checksum"].IsString()    && // TODO: Uint32???
-        value.HasMember("playerCount") && value["playerCount"].IsString() && // TODO: Int32???
-        value.HasMember("maxPlayers")  && value["maxPlayers"].IsString())//  && // TODO: Int32???
+        value.HasMember("checksum")    && value["checksum"].IsUint()      &&
+        value.HasMember("playerCount") && value["playerCount"].IsInt()    &&
+        value.HasMember("maxPlayers")  && value["maxPlayers"].IsInt())
     {
         return true;
     }
@@ -85,16 +85,16 @@ vector<NetGameServer_t> CPylon::GetServerList(string& outMessage) const
             {
                 obj["name"].GetString(),
                 obj["description"].GetString(),
-                V_strcmp(obj["hidden"].GetString(), "true") == NULL, // TODO: Bool???
+                obj["hidden"].GetBool(),
                 obj["map"].GetString(),
                 obj["playlist"].GetString(),
                 obj["ip"].GetString(),
-                obj["port"].GetString(), // TODO: Int32???
+                obj["port"].GetInt(),
                 obj["key"].GetString(),
-                obj["checksum"].GetString(), // TODO: Uint32???
+                obj["checksum"].GetUint(),
                 SDK_VERSION,
-                obj["playerCount"].GetString(), // TODO: Int32???
-                obj["maxPlayers"].GetString(), // TODO: Int32???
+                obj["playerCount"].GetInt(),
+                obj["maxPlayers"].GetInt(),
                 -1,
             }
         );
@@ -146,16 +146,16 @@ bool CPylon::GetServerByToken(NetGameServer_t& outGameServer,
     {
         serverJson["name"].GetString(),
         serverJson["description"].GetString(),
-        V_strcmp(serverJson["hidden"].GetString(), "true") == NULL, // TODO: Bool???
+        serverJson["hidden"].GetBool(),
         serverJson["map"].GetString(),
         serverJson["playlist"].GetString(),
         serverJson["ip"].GetString(),
-        serverJson["port"].GetString(), // TODO: Int32???
+        serverJson["port"].GetInt(),
         serverJson["key"].GetString(),
-        serverJson["checksum"].GetString(), // TODO: Uint32???
+        serverJson["checksum"].GetUint(),
         SDK_VERSION,
-        serverJson["playerCount"].GetString(), // TODO: Int32???
-        serverJson["maxPlayers"].GetString(), // TODO: Int32???
+        serverJson["playerCount"].GetInt(),
+        serverJson["maxPlayers"].GetInt(),
         -1,
     };
 
@@ -182,12 +182,12 @@ bool CPylon::PostServerHost(string& outMessage, string& outToken, string& outHos
     requestJson.AddMember("map",         rapidjson::Value(netGameServer.m_svHostMap.c_str(),        allocator), allocator);
     requestJson.AddMember("playlist",    rapidjson::Value(netGameServer.m_svPlaylist.c_str(),       allocator), allocator);
     requestJson.AddMember("ip",          rapidjson::Value(netGameServer.m_svIpAddress.c_str(),      allocator), allocator);
-    requestJson.AddMember("port",        rapidjson::Value(netGameServer.m_svGamePort.c_str(),       allocator), allocator); // TODO: Int32???
+    requestJson.AddMember("port",        netGameServer.m_nGamePort,                                 allocator);
     requestJson.AddMember("key",         rapidjson::Value(netGameServer.m_svEncryptionKey.c_str(),  allocator), allocator);
-    requestJson.AddMember("checksum",    rapidjson::Value(netGameServer.m_svRemoteChecksum.c_str(), allocator), allocator); // TODO: Uint32???
+    requestJson.AddMember("checksum",    netGameServer.m_nRemoteChecksum,                           allocator);
     requestJson.AddMember("version",     rapidjson::Value(netGameServer.m_svSDKVersion.c_str(),     allocator), allocator);
-    requestJson.AddMember("playerCount", rapidjson::Value(netGameServer.m_svPlayerCount.c_str(),    allocator), allocator); // TODO: Int32???
-    requestJson.AddMember("maxPlayers",  rapidjson::Value(netGameServer.m_svMaxPlayers.c_str(),     allocator), allocator); // TODO: Int32???
+    requestJson.AddMember("playerCount", netGameServer.m_nPlayerCount,                              allocator);
+    requestJson.AddMember("maxPlayers",  netGameServer.m_nMaxPlayers,                               allocator);
     requestJson.AddMember("timeStamp",   netGameServer.m_nTimeStamp,                                allocator);
 
     rapidjson::Document responseJson;
diff --git a/r5dev/networksystem/serverlisting.h b/r5dev/networksystem/serverlisting.h
index f8f2fbdd..906fc840 100644
--- a/r5dev/networksystem/serverlisting.h
+++ b/r5dev/networksystem/serverlisting.h
@@ -21,14 +21,14 @@ struct NetGameServer_t
 	string m_svPlaylist = "dev_default";
 
 	string m_svIpAddress;
-	string m_svGamePort; // TODO: should be 'int'.
+	int m_nGamePort;
 	string m_svEncryptionKey;
 
-	string m_svRemoteChecksum; // TODO: should be 'unsigned int'.
+	unsigned int m_nRemoteChecksum;
 	string m_svSDKVersion;
 
-	string m_svPlayerCount; // TODO: should be 'int'.
-	string m_svMaxPlayers; // TODO: should be 'int'.
+	int m_nPlayerCount;
+	int m_nMaxPlayers;
 	int64_t m_nTimeStamp = -1;
 
 	//vector<NetGameMod_t> m_vMods;