Merge pull request #38 from PixieCore/master

Added lots of stuff to r5net and invalided stryder hostnames.
This commit is contained in:
PixieCore 2021-08-15 19:59:02 +02:00 committed by GitHub
commit 1b0e9ee08d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 287 additions and 67 deletions

View File

@ -40,6 +40,7 @@ public:
std::vector<ServerListing> ServerList;
ImGuiTextFilter ServerBrowserFilter;
char ServerConnStringBuffer[256] = { 0 };
std::string ServerListMessage = std::string();
////////////////////
// Settings //
@ -56,6 +57,7 @@ public:
ImVec4 HostRequestMessageColor = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);
bool StartAsDedi = false;
bool BroadCastServer = false;
bool OverridePlaylist = false;
////////////////////
// Private Server //

View File

@ -368,5 +368,53 @@ enum FileWarningLevel_t
FILESYSTEM_WARNING_REPORTALLACCESSES_READ,
FILESYSTEM_WARNING_REPORTALLACCESSES_READWRITE,
FILESYSTEM_WARNING_REPORTALLACCESSES_ASYNC
};
};
#define FCVAR_NONE 0
// Command to ConVars and ConCommands
// ConVar Systems
#define FCVAR_UNREGISTERED (1<<0) // If this is set, don't add to linked list, etc.
#define FCVAR_DEVELOPMENTONLY (1<<1) // Hidden in released products. Flag is removed automatically if ALLOW_DEVELOPMENT_CVARS is defined.
#define FCVAR_GAMEDLL (1<<2) // defined by the game DLL
#define FCVAR_CLIENTDLL (1<<3) // defined by the client DLL
#define FCVAR_HIDDEN (1<<4) // Hidden. Doesn't appear in find or auto complete. Like DEVELOPMENTONLY, but can't be compiled out.
// ConVar only
#define FCVAR_PROTECTED (1<<5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value
#define FCVAR_SPONLY (1<<6) // This cvar cannot be changed by clients connected to a multiplayer server.
#define FCVAR_ARCHIVE (1<<7) // set to cause it to be saved to vars.rc
#define FCVAR_NOTIFY (1<<8) // notifies players when changed
#define FCVAR_USERINFO (1<<9) // changes the client's info string
#define FCVAR_PRINTABLEONLY (1<<10) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ).
#define FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS (1<<10) // When on concommands this allows remote clients to execute this cmd on the server.
// We are changing the default behavior of concommands to disallow execution by remote clients without
// this flag due to the number existing concommands that can lag or crash the server when clients abuse them.
#define FCVAR_UNLOGGED (1<<11) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log
#define FCVAR_NEVER_AS_STRING (1<<12) // never try to print that cvar
// It's a ConVar that's shared between the client and the server.
// At signon, the values of all such ConVars are sent from the server to the client (skipped for local
// client, of course )
// If a change is requested it must come from the console (i.e., no remote client changes)
// If a value is changed while a server is active, it's replicated to all connected clients
#define FCVAR_REPLICATED (1<<13) // server setting enforced on clients, TODO rename to FCAR_SERVER at some time
#define FCVAR_CHEAT (1<<14) // Only useable in singleplayer / debug / multiplayer & sv_cheats
#define FCVAR_SS (1<<15) // causes varnameN where N == 2 through max splitscreen slots for mod to be autogenerated
#define FCVAR_DEMO (1<<16) // record this cvar when starting a demo file
#define FCVAR_DONTRECORD (1<<17) // don't record these command in demofiles
#define FCVAR_SS_ADDED (1<<18) // This is one of the "added" FCVAR_SS variables for the splitscreen players
#define FCVAR_RELEASE (1<<19) // Cvars tagged with this are the only cvars avaliable to customers
#define FCVAR_RELOAD_MATERIALS (1<<20) // If this cvar changes, it forces a material reload
#define FCVAR_RELOAD_TEXTURES (1<<21) // If this cvar changes, if forces a texture reload
#define FCVAR_NOT_CONNECTED (1<<22) // cvar cannot be changed by a client that is connected to a server
#define FCVAR_MATERIAL_SYSTEM_THREAD (1<<23) // Indicates this cvar is read from the material system thread
#define FCVAR_ARCHIVE_GAMECONSOLE (1<<24) // cvar written to config.cfg on the Xbox
#define FCVAR_SERVER_CAN_EXECUTE (1<<28)// the server is allowed to execute this command on clients via ClientCommand/NET_StringCmd/CBaseClientState::ProcessStringCmd.
#define FCVAR_SERVER_CANNOT_QUERY (1<<29)// If this is set, then the server is not allowed to query this cvar's value (via IServerPluginHelpers::StartQueryCvarValue).
#define FCVAR_CLIENTCMD_CAN_EXECUTE (1<<30) // IVEngineClient::ClientCmd is allowed to execute this command.

View File

@ -22,9 +22,13 @@ namespace Hooks
#pragma region Squirrel
void* SQVM_Print(void* sqvm, char* fmt, ...);
__int64 SQVM_Warning(void* sqvm, int a2, int a3, int* stringSize, void** string);
__int64 SQVM_LoadRson(const char* rson_name);
bool SQVM_LoadScript(void* sqvm, const char* script_path, const char* script_name, int flag);
using SQVM_WarningFn = __int64(*)(void*, int, int, int*, void**);
extern SQVM_WarningFn originalSQVM_Warning;
using SQVM_LoadRsonFn = __int64(*)(const char*);
extern SQVM_LoadRsonFn originalSQVM_LoadRson;
@ -58,8 +62,18 @@ namespace Hooks
#pragma endregion
#pragma region ConVar
bool ConVar_IsFlagSet(int** cvar, int flag);
bool ConCommand_IsFlagSet(int* cmd, int flag);
bool ConVar_IsFlagSet(ConVar* cvar, int flag);
bool ConCommand_IsFlagSet(ConCommandBase* cmd, int flag);
void Map_Callback(void* args);
using ConVar_IsFlagSetFn = bool(*)(ConVar*, int);
extern ConVar_IsFlagSetFn originalConVar_IsFlagSet;
using ConCommand_IsFlagSetFn = bool(*)(ConCommandBase*, int);
extern ConCommand_IsFlagSetFn originalConCommand_IsFlagSet;
using Map_CallbackFn = void(*)(void*);
extern Map_CallbackFn originalMap_Callback;
#pragma endregion
#pragma region WinAPI

View File

@ -23,6 +23,10 @@ namespace
/*0x141057FD0*/
FUNC_AT_ADDRESS(addr_SQVM_Print, void*, r5_patterns.PatternSearch("83 F8 01 48 8D 3D ? ? ? ?").OffsetSelf(0x3).FollowNearCallSelf(0x3, 0x7).GetPtr());
FUNC_AT_ADDRESS(addr_SQVM_Warning, __int64(*)(__int64, int, int, const char*, std::size_t*), r5_patterns.PatternSearch("E8 ? ? ? ? 85 C0 0F 99 C3").FollowNearCallSelf().GetPtr());
FUNC_AT_ADDRESS(addr_SQVM_Warning_ReturnAddr, void*, r5_patterns.PatternSearch("E8 ? ? ? ? 85 C0 0F 99 C3").OffsetSelf(0x5).GetPtr());
//DWORD64 p_SQVM_LoadScript = FindPattern("r5apex.exe", (const unsigned char*)"\x48\x89\x5C\x24\x10\x48\x89\x74\x24\x18\x48\x89\x7C\x24\x20\x48\x89\x4C\x24\x08\x55\x41\x54\x41\x55\x41\x56\x41\x57\x48\x8D\x6C", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); // For S0 and S1
/*0x141055630*/

View File

@ -54,7 +54,7 @@ void CCompanion::UpdateHostingStatus()
if (!GameGlobals::HostState || !GameGlobals::Cvar) // Is HostState and Cvar valid?
return;
GameGlobals::HostState->m_bActiveGame ? HostingStatus = EHostStatus::Hosting : HostingStatus = EHostStatus::NotHosting; // Are we hosting a server?
HostingStatus = GameGlobals::HostState->m_bActiveGame ? EHostStatus::Hosting : EHostStatus::NotHosting; // Are we hosting a server?
switch (HostingStatus)
{
@ -94,7 +94,7 @@ void CCompanion::RefreshServerList()
std::cout << " [+CCompanion+] Refreshing server list with string " << MatchmakingServerStringBuffer << "\n";
#endif
bThreadLocked = true;
ServerList = r5net->GetServersList();
ServerList = r5net->GetServersList(ServerListMessage);
bThreadLocked = false;
});
@ -105,7 +105,17 @@ void CCompanion::RefreshServerList()
void CCompanion::SendHostingPostRequest()
{
HostToken = std::string();
bool result = r5net->PostServerHost(HostRequestMessage, HostToken, ServerListing{ MyServer.name, std::string(GameGlobals::HostState->m_levelName), "", GameGlobals::Cvar->FindVar("hostport")->m_pzsCurrentValue, MyServer.password, std::to_string(*reinterpret_cast<std::int32_t*>(0x1656057E0)) /* checksum */});
bool result = r5net->PostServerHost(HostRequestMessage,HostToken,
ServerListing{ MyServer.name,
std::string(GameGlobals::HostState->m_levelName),
"",
GameGlobals::Cvar->FindVar("hostport")->m_pzsCurrentValue,
GameGlobals::Cvar->FindVar("mp_gamemode")->m_pzsCurrentValue,
MyServer.password,
std::to_string(*reinterpret_cast<std::int32_t*>(0x1656057E0)),
std::string()}
);
if (result)
{
HostRequestMessageColor = ImVec4(0.00f, 1.00f, 0.00f, 1.00f);
@ -152,16 +162,18 @@ void CCompanion::ServerBrowserSection()
RefreshServerList();
}
ImGui::EndGroup();
ImGui::TextColored(ImVec4(1.00f, 0.00f, 0.00f, 1.00f), ServerListMessage.c_str());
ImGui::Separator();
const float FooterHeight = ImGui::GetStyle().ItemSpacing.y + ImGui::GetFrameHeightWithSpacing();
ImGui::BeginChild("ServerListChild", { 0, -FooterHeight }, true, ImGuiWindowFlags_AlwaysVerticalScrollbar);
if (ImGui::BeginTable("##ServerBrowser_ServerList", 4, ImGuiTableFlags_Resizable))
if (ImGui::BeginTable("##ServerBrowser_ServerList", 5, ImGuiTableFlags_Resizable))
{
ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthStretch, 35);
ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthStretch, 20);
ImGui::TableSetupColumn("Map", ImGuiTableColumnFlags_WidthStretch, 25);
ImGui::TableSetupColumn("Port", ImGuiTableColumnFlags_WidthStretch, 10);
ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch, 8);
ImGui::TableSetupColumn("Port", ImGuiTableColumnFlags_WidthStretch, 5);
ImGui::TableSetupColumn("Gamemode", ImGuiTableColumnFlags_WidthStretch, 5);
ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch, 5);
ImGui::TableHeadersRow();
for (ServerListing& server : ServerList)
@ -169,6 +181,7 @@ void CCompanion::ServerBrowserSection()
const char* name = server.name.c_str();
const char* map = server.map.c_str();
const char* port = server.port.c_str();
const char* gamemode = server.gamemode.c_str();
if (ServerBrowserFilter.PassFilter(name)
|| ServerBrowserFilter.PassFilter(map)
@ -183,6 +196,9 @@ void CCompanion::ServerBrowserSection()
ImGui::TableNextColumn();
ImGui::Text(port);
ImGui::TableNextColumn();
ImGui::Text(gamemode);
ImGui::TableNextColumn();
std::string selectButtonText = "Connect##";
selectButtonText += (server.name + server.ip + server.map);

View File

@ -155,6 +155,10 @@ void CGameConsole::Draw(const char* title)
if (strstr(item, "Script(C):")) { color = ImVec4(0.59f, 0.58f, 0.63f, 1.00f); has_color = true; }
if (strstr(item, "Script(U):")) { color = ImVec4(0.59f, 0.48f, 0.53f, 1.00f); has_color = true; }
if (strstr(item, "Script(S) Warning:")) { color = ImVec4(0.80f, 0.80f, 0.73f, 1.00f); has_color = true; }
if (strstr(item, "Script(C) Warning:")) { color = ImVec4(0.80f, 0.80f, 0.63f, 1.00f); has_color = true; }
if (strstr(item, "Script(U) Warning:")) { color = ImVec4(0.80f, 0.80f, 0.53f, 1.00f); has_color = true; }
///////////////////////////////////////////////////////////////////
// Callbacks
//if (strstr(item, "CodeCallback_")) { color = ImVec4(0.00f, 0.30f, 1.00f, 1.00f); has_color = true; }

View File

@ -8,6 +8,36 @@ namespace GameGlobals
CInputSystem* InputSystem = nullptr;
CCVar* Cvar = nullptr;
void EmptyHostNames()
{
const char* hostnameArray[] =
{
"pin_telemetry_hostname",
"assetdownloads_hostname",
"users_hostname",
"persistence_hostname",
"speechtotexttoken_hostname",
"communities_hostname",
"persistenceDef_hostname",
"party_hostname",
"speechtotext_hostname",
"serverReports_hostname",
"subscription_hostname",
"steamlink_hostname",
"staticfile_hostname",
"matchmaking_hostname",
"skill_hostname",
"publication_hostname",
"stats_hostname"
};
for (int i = 0; i < 17; i++)
{
const char* name = hostnameArray[i];
Cvar->FindVar(name)->m_pzsCurrentValue = "0.0.0.0";
}
}
void InitGameGlobals()
{
HostState = reinterpret_cast<CHostState*>(0x141736120); // Get CHostState from memory.
@ -19,7 +49,7 @@ namespace GameGlobals
// {
// printf("%s: %p\n", current->InterfaceName, current->InterfacePtr);
// }
EmptyHostNames();
IsInitialized = true;
}
}

View File

@ -18,6 +18,7 @@ void Hooks::InstallHooks()
///////////////////////////////////////////////////////////////////////////////
// Hook Squirrel functions
MH_CreateHook(addr_SQVM_Print, &Hooks::SQVM_Print, NULL);
MH_CreateHook(addr_SQVM_Warning, &Hooks::SQVM_Warning, reinterpret_cast<void**>(&originalSQVM_Warning));
MH_CreateHook(addr_SQVM_LoadRson, &Hooks::SQVM_LoadRson, reinterpret_cast<void**>(&originalSQVM_LoadRson));
MH_CreateHook(addr_SQVM_LoadScript, &Hooks::SQVM_LoadScript, reinterpret_cast<void**>(&originalSQVM_LoadScript));
@ -35,8 +36,8 @@ void Hooks::InstallHooks()
///////////////////////////////////////////////////////////////////////////////
// Hook ConVar | ConCommand functions.
MH_CreateHook(addr_ConVar_IsFlagSet, &Hooks::ConVar_IsFlagSet, NULL);
MH_CreateHook(addr_ConCommand_IsFlagSet, &Hooks::ConCommand_IsFlagSet, NULL);
MH_CreateHook(addr_ConVar_IsFlagSet, &Hooks::ConVar_IsFlagSet, reinterpret_cast<void**>(&originalConVar_IsFlagSet));
MH_CreateHook(addr_ConCommand_IsFlagSet, &Hooks::ConCommand_IsFlagSet, reinterpret_cast<void**>(&originalConCommand_IsFlagSet));
///////////////////////////////////////////////////////////////////////////////
// Hooks CBaseFileSystem functions.
@ -71,6 +72,7 @@ void Hooks::InstallHooks()
///////////////////////////////////////////////////////////////////////////////
// Enable Squirrel hooks
MH_EnableHook(addr_SQVM_Print);
MH_EnableHook(addr_SQVM_Warning);
MH_EnableHook(addr_SQVM_LoadRson);
MH_EnableHook(addr_SQVM_LoadScript);

View File

@ -1,65 +1,85 @@
#include "pch.h"
#include "hooks.h"
bool Hooks::ConVar_IsFlagSet(int** cvar, int flag)
namespace Hooks
{
int real_flags = *(*(cvar + (72 / (sizeof(void*)))) + (56 / sizeof(int)));
if (g_bDebugConsole)
{
printf("--------------------------------------------------\n");
printf(" Flaged: %08X\n", real_flags);
}
// Mask off FCVAR_CHEATS and FCVAR_DEVELOPMENTONLY
real_flags &= 0xFFFFBFFD;
if (g_bDebugConsole)
{
printf(" Masked: %08X\n", real_flags);
printf(" Verify: %08X\n", flag);
printf("--------------------------------------------------\n");
}
if (flag & 0x80000)
{
return true;
}
if (!g_bReturnAllFalse)
{
return (real_flags & flag) != 0;
}
else
{
return false;
}
ConVar_IsFlagSetFn originalConVar_IsFlagSet = nullptr;
ConCommand_IsFlagSetFn originalConCommand_IsFlagSet = nullptr;
Map_CallbackFn originalMap_Callback = nullptr;
}
bool Hooks::ConCommand_IsFlagSet(int* cmd, int flag)
bool Hooks::ConVar_IsFlagSet(ConVar* cvar, int flag)
{
int real_flags = *((cmd + (56 / sizeof(int))));
#ifdef _DEBUG
if (g_bDebugConsole)
{
printf("--------------------------------------------------\n");
printf(" Flaged: %08X\n", real_flags);
printf(" Flaged: %08X\n", cvar->m_ConCommandBase.m_nFlags);
}
// Mask off FCVAR_CHEATS and FCVAR_DEVELOPMENTONLY
real_flags &= 0xFFFFBFFD;
cvar->m_ConCommandBase.m_nFlags &= 0xFFFFBFFD;
if (g_bDebugConsole)
{
printf(" Masked: %08X\n", real_flags);
printf(" Masked: %08X\n", cvar->m_ConCommandBase.m_nFlags);
printf(" Verify: %08X\n", flag);
printf("--------------------------------------------------\n");
}
if (flag & 0x80000)
if (flag & FCVAR_RELEASE)
{
return true;
}
if (!g_bReturnAllFalse)
{
return (real_flags & flag) != 0;
return (cvar->m_ConCommandBase.m_nFlags & flag) != 0;
}
else
{
return false;
}
#else
// Mask off FCVAR_DEVELOPMENTONLY if existing.
cvar->m_ConCommandBase.m_nFlags &= ~FCVAR_DEVELOPMENTONLY;
return originalConVar_IsFlagSet(cvar, flag);
#endif
}
bool Hooks::ConCommand_IsFlagSet(ConCommandBase* cmd, int flag)
{
#ifdef _DEBUG
if (g_bDebugConsole)
{
printf("--------------------------------------------------\n");
printf(" Flaged: %08X\n", cmd->m_nFlags);
}
// Mask off FCVAR_CHEATS and FCVAR_DEVELOPMENTONLY
cmd->m_nFlags &= 0xFFFFBFFD;
if (g_bDebugConsole)
{
printf(" Masked: %08X\n", cmd->m_nFlags);
printf(" Verify: %08X\n", flag);
printf("--------------------------------------------------\n");
}
if (flag & FCVAR_RELEASE)
{
return true;
}
if (!g_bReturnAllFalse)
{
return (cmd->m_nFlags & flag) != 0;
}
else
{
return false;
}
#else
// Mask off FCVAR_DEVELOPMENTONLY if existing.
cmd->m_nFlags &= ~FCVAR_DEVELOPMENTONLY;
return originalConCommand_IsFlagSet(cmd, flag);
#endif
}

View File

@ -3,12 +3,13 @@
namespace Hooks
{
SQVM_WarningFn originalSQVM_Warning = nullptr;
SQVM_LoadRsonFn originalSQVM_LoadRson = nullptr;
SQVM_LoadScriptFn originalSQVM_LoadScript = nullptr;
}
static std::ostringstream oss;
static auto ostream_sink = std::make_shared<spdlog::sinks::ostream_sink_st>(oss);
static std::ostringstream oss_print;
static auto ostream_sink_print = std::make_shared<spdlog::sinks::ostream_sink_st>(oss_print);
//---------------------------------------------------------------------------------
// Purpose: prints the output of each VM to the console
@ -21,17 +22,17 @@ void* Hooks::SQVM_Print(void* sqvm, char* fmt, ...)
static char buf[1024];
static std::string vmType[3] = { "Script(S):", "Script(C):", "Script(U):" };
static auto iconsole = spdlog::stdout_logger_mt("sqvm_iconsole"); // in-game console
static auto wconsole = spdlog::stdout_logger_mt("sqvm_wconsole"); // windows console
static auto iconsole = spdlog::stdout_logger_mt("sqvm_print_iconsole"); // in-game console
static auto wconsole = spdlog::stdout_logger_mt("sqvm_print_wconsole"); // windows console
std::string vmStr = vmType[vmIdx].c_str();
oss.str("");
oss.clear();
oss_print.str("");
oss_print.clear();
if (!initialized)
{
iconsole = std::make_shared<spdlog::logger>("ostream", ostream_sink);
iconsole = std::make_shared<spdlog::logger>("ostream", ostream_sink_print);
iconsole->set_pattern("[%S.%e] %v");
iconsole->set_level(spdlog::level::debug);
wconsole->set_pattern("[%S.%e] %v");
@ -52,13 +53,62 @@ void* Hooks::SQVM_Print(void* sqvm, char* fmt, ...)
iconsole->debug(vmStr);
wconsole->debug(vmStr);
std::string s = oss.str();
std::string s = oss_print.str();
const char* c = s.c_str();
Items.push_back(Strdup((const char*)c));
return NULL;
}
static std::ostringstream oss_warning;
static auto ostream_sink_warning = std::make_shared<spdlog::sinks::ostream_sink_st>(oss_warning);
__int64 Hooks::SQVM_Warning(void* sqvm, int a2, int a3, int* stringSize, void** string)
{
__int64 result = originalSQVM_Warning(sqvm, a2, a3, stringSize, string);
void* retaddr = _ReturnAddress(); // Get return address.
if (retaddr != addr_SQVM_Warning_ReturnAddr) // Check if its SQVM_Warning calling.
return result; // If not return.
static bool initialized = false;
static auto iconsole = spdlog::stdout_logger_mt("sqvm_warning_iconsole"); // in-game console
static auto wconsole = spdlog::stdout_logger_mt("sqvm_warning_wconsole"); // windows console
static std::string vmType[3] = { "Script(S) Warning:", "Script(C) Warning:", "Script(U) Warning:" };
int vmIdx = *(int*)((std::uintptr_t)sqvm + 0x18); // Get vm index.
std::string vmStr = vmType[vmIdx].c_str(); // Get string prefix for vm.
oss_warning.str("");
oss_warning.clear();
if (!initialized)
{
iconsole = std::make_shared<spdlog::logger>("ostream", ostream_sink_warning);
iconsole->set_pattern("[%S.%e] %v");
iconsole->set_level(spdlog::level::debug);
wconsole->set_pattern("[%S.%e] %v\n");
wconsole->set_level(spdlog::level::debug);
initialized = true;
}
std::string stringConstructor((char*)*string, *stringSize); // Get string from memory via std::string constructor.
vmStr.append(stringConstructor);
iconsole->debug(vmStr.c_str());
wconsole->debug(vmStr.c_str());
std::string s = oss_warning.str();
const char* c = s.c_str();
Items.push_back(Strdup((const char*)c));
return result;
}
//---------------------------------------------------------------------------------
// Purpose: loads the include file from the mods directory
//---------------------------------------------------------------------------------

View File

@ -20,8 +20,9 @@ namespace R5Net
m_HttpClient.set_connection_timeout(10);
}
std::vector<ServerListing> GetServersList();
std::vector<ServerListing> GetServersList(std::string& outMessage);
bool PostServerHost(std::string& outMessage, std::string& outToken, const ServerListing& serverListing);
bool GetServerByToken(ServerListing& outServer, std::string& outError, const std::string& token, const std::string& password = "");
std::string GetVersionString();
};
}

View File

@ -6,7 +6,9 @@ struct ServerListing
std::string map;
std::string ip;
std::string port;
std::string gamemode;
std::string password;
std::string checksum;
std::string version;
};

View File

@ -4,22 +4,47 @@
#include "netpch.h"
#include "r5\r5net.h"
std::vector<ServerListing> R5Net::Client::GetServersList()
std::string R5Net::Client::GetVersionString()
{
return "beta 1.5";
}
std::vector<ServerListing> R5Net::Client::GetServersList(std::string& outMessage)
{
std::vector<ServerListing> list{ };
auto res = m_HttpClient.Get("/servers");
if (!res) return std::vector<ServerListing>();
nlohmann::json reqBody = nlohmann::json::object();
reqBody["version"] = GetVersionString();
std::string reqBodyStr = reqBody.dump();;
httplib::Result res = m_HttpClient.Post("/servers", reqBody.dump().c_str(), reqBody.dump().length(), "application/json");
if (res)
{
nlohmann::json root = nlohmann::json::parse(res->body);
for (auto obj : root["servers"])
nlohmann::json resBody = nlohmann::json::parse(res->body);
if (resBody["success"].is_boolean() && resBody["success"].get<bool>())
{
list.push_back(
ServerListing{ obj["name"].get<std::string>(), obj["map"].get<std::string>(), obj["ip"].get<std::string>(), obj["port"].get<std::string>() }
);
for (auto obj : resBody["servers"])
{
list.push_back(
ServerListing{ obj["name"].get<std::string>(), obj["map"].get<std::string>(), obj["ip"].get<std::string>(), obj["port"].get<std::string>(), obj["gamemode"].get<std::string>() }
);
}
}
else
{
if (resBody["err"].is_string())
outMessage = resBody["err"].get<std::string>();
else
outMessage = "An unknown error occured!";
}
}
else
{
outMessage = "Failed to reach comp-server";
}
return list;
}
@ -31,6 +56,8 @@ bool R5Net::Client::PostServerHost(std::string& outMessage, std::string& outToke
reqBody["port"] = serverListing.port;
reqBody["password"] = serverListing.password;
reqBody["remote_checksum"] = serverListing.checksum;
reqBody["version"] = GetVersionString();
reqBody["gamemode"] = serverListing.gamemode;
std::string reqBodyStr = reqBody.dump();
@ -44,7 +71,7 @@ bool R5Net::Client::PostServerHost(std::string& outMessage, std::string& outToke
}
nlohmann::json resBody = nlohmann::json::parse(res->body);
if (resBody["success"].is_boolean() && resBody["success"])
if (resBody["success"].is_boolean() && resBody["success"].get<bool>())
{
if (resBody["token"].is_string())
outToken = resBody["token"].get<std::string>();