Mingw Compatible

This commit is contained in:
Anonymous-275
2021-03-29 11:43:24 +03:00
parent d96f968dde
commit fbc5e28d25
65 changed files with 883 additions and 822 deletions
+16 -12
View File
@@ -6,18 +6,22 @@ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG")
file(GLOB source_files "src/*.cpp" "src/*/*.cpp" "src/*/*.hpp" "include/*.h" "include/*/*.h" "include/*/*/*.h") file(GLOB source_files "src/*.cpp" "src/*/*.cpp" "src/*/*.hpp" "include/*.h" "include/*/*.h" "include/*/*/*.h")
add_executable(${PROJECT_NAME} ${source_files}) add_executable(${PROJECT_NAME} ${source_files})
set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "BeamMP-Launcher") set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "BeamMP-Launcher")
find_package(ZLIB REQUIRED)
find_package(CURL CONFIG REQUIRED)
# This might cause issues with old windows headers, but it's worth the trouble to keep the code if (WIN32)
# completely cross platform. For fixes to common issues arising from /permissive- visit: find_package(ZLIB REQUIRED)
# https://docs.microsoft.com/en-us/cpp/build/reference/permissive-standards-conformance find_package(CURL REQUIRED)
message(STATUS "MSVC -> forcing use of statically-linked runtime.")
STRING(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
STRING(REPLACE "/MDd" "/MTd" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
#-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static
set(VcpkgRoot ${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET})
include_directories(${VcpkgRoot}/include)
link_directories(${VcpkgRoot}/lib)
target_link_libraries(${PROJECT_NAME} PRIVATE discord-rpc CURL::libcurl ZLIB::ZLIB)
else(WIN32) #MINGW
add_definitions("-D_WIN32_WINNT=0x0600")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s -static-libgcc -static-libstdc++ --static")
target_link_libraries(${PROJECT_NAME} discord-rpc.a ssp z ws2_32)
endif(WIN32)
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /permissive-")
message(STATUS "MSVC -> forcing use of statically-linked runtime.")
STRING(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
STRING(REPLACE "/MDd" "/MTd" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
#-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static
target_link_libraries(${PROJECT_NAME} PRIVATE rstrtmgr discord-rpc CURL::libcurl ZLIB::ZLIB)
target_include_directories(${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>) target_include_directories(${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>)
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
View File
+1 -1
View File
@@ -1,5 +1,5 @@
#pragma once #pragma once
#include <stdint.h> #include <cstdint>
// clang-format off // clang-format off
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
+3 -1
View File
@@ -5,6 +5,8 @@
/// ///
/// Created by Anonymous275 on 7/18/2020 /// Created by Anonymous275 on 7/18/2020
/// ///
#pragma once #pragma once
#include <string> #include <string>
void NetReset(); void NetReset();
@@ -18,7 +20,7 @@ extern bool Terminate;
extern int DEFAULT_PORT; extern int DEFAULT_PORT;
extern uint64_t UDPSock; extern uint64_t UDPSock;
extern uint64_t TCPSock; extern uint64_t TCPSock;
extern std::string Role; extern std::string Branch;
extern bool TCPTerminate; extern bool TCPTerminate;
extern std::string LastIP; extern std::string LastIP;
extern std::string MStatus; extern std::string MStatus;
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
+1
View File
@@ -12,4 +12,5 @@ std::string GetEP(char*P = nullptr);
std::string GetGamePath(); std::string GetGamePath();
std::string GetVer(); std::string GetVer();
std::string GetEN(); std::string GetEN();
void ConfigInit();
extern bool Dev; extern bool Dev;
Regular → Executable
View File
Regular → Executable
View File
View File
Regular → Executable
View File
View File
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
View File
View File
View File
Regular → Executable
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
Regular → Executable
View File
Regular → Executable
View File
View File
View File
View File
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
View File
Executable
+60
View File
@@ -0,0 +1,60 @@
///
/// Created by Anonymous275 on 2/23/2021
///
#include "Network/network.h"
#include <filesystem>
#include "Logger.h"
#include <fstream>
#include "Json.h"
#include <cstdint>
namespace fs = std::filesystem;
std::string Branch;
void ParseConfig(const json::Document& d){
if(d["Port"].IsInt()){
DEFAULT_PORT = d["Port"].GetInt();
}
//Default -1
//Release 1
//EA 2
//Dev 3
//Custom 3
if(d["Build"].IsString()){
Branch = d["Build"].GetString();
for(char& c : Branch)c = char(tolower(c));
}
}
void ConfigInit(){
if(fs::exists("Launcher.cfg")){
std::ifstream cfg("Launcher.cfg");
if(cfg.is_open()){
auto Size = fs::file_size("Launcher.cfg");
std::string Buffer(Size, 0);
cfg.read(&Buffer[0], Size);
cfg.close();
json::Document d;
d.Parse(Buffer.c_str());
if(d.HasParseError()){
fatal("Config failed to parse make sure it's valid JSON! Code : " + std::to_string(d.GetParseError()));
}
ParseConfig(d);
}else fatal("Failed to open Launcher.cfg!");
}else{
std::ofstream cfg("Launcher.cfg");
if(cfg.is_open()){
cfg <<
R"({
"Port": 4444,
"Build": "Default"
})";
cfg.close();
}else{
fatal("Failed to write config on disk!");
}
}
}
Regular → Executable
+1 -1
View File
@@ -7,7 +7,7 @@
/// ///
#include "Discord/discord_rpc.h" #include "Discord/discord_rpc.h"
#include "Logger.h" #include "Logger.h"
#include <iostream> #include <cstring>
#include <thread> #include <thread>
#include <ctime> #include <ctime>
Regular → Executable
+1 -1
View File
@@ -6,7 +6,7 @@
/// Created by Anonymous275 on 7/19/2020 /// Created by Anonymous275 on 7/19/2020
/// ///
#include <Windows.h> #include <windows.h>
#include "Startup.h" #include "Startup.h"
#include "Logger.h" #include "Logger.h"
#include <iostream> #include <iostream>
Regular → Executable
View File
Regular → Executable
+6 -2
View File
@@ -9,8 +9,8 @@
#include "Security/Init.h" #include "Security/Init.h"
#include "Curl/http.h" #include "Curl/http.h"
#include <WinSock2.h> #include <winsock2.h>
#include <WS2tcpip.h> #include <ws2tcpip.h>
#include "Startup.h" #include "Startup.h"
#include "Logger.h" #include "Logger.h"
#include <charconv> #include <charconv>
@@ -242,9 +242,13 @@ int Handle(EXCEPTION_POINTERS *ep){
void CoreNetwork(){ void CoreNetwork(){
while(TraceBack >= 4){ while(TraceBack >= 4){
#ifndef __MINGW32__
__try{ __try{
#endif
CoreMain(); CoreMain();
#ifndef __MINGW32__
}__except(Handle(GetExceptionInformation())){} }__except(Handle(GetExceptionInformation())){}
#endif
std::this_thread::sleep_for(std::chrono::seconds(1)); std::this_thread::sleep_for(std::chrono::seconds(1));
} }
} }
Regular → Executable
View File
Regular → Executable
+3 -3
View File
@@ -6,15 +6,15 @@
/// Created by Anonymous275 on 7/25/2020 /// Created by Anonymous275 on 7/25/2020
/// ///
#include "Network/network.h" #include "Network/network.h"
#include <WinSock2.h> #include <winsock2.h>
#include <WS2tcpip.h> #include <ws2tcpip.h>
#include "Logger.h" #include "Logger.h"
#include <charconv> #include <charconv>
#include <string> #include <string>
#include <thread> #include <thread>
#include <mutex> #include <mutex>
std::chrono::time_point<std::chrono::steady_clock> PingStart,PingEnd; std::chrono::time_point<std::chrono::high_resolution_clock> PingStart,PingEnd;
bool GConnected = false; bool GConnected = false;
bool CServer = true; bool CServer = true;
SOCKET CSocket = -1; SOCKET CSocket = -1;
Regular → Executable
+5 -1
View File
@@ -10,6 +10,7 @@
#include <iostream> #include <iostream>
#include <Logger.h> #include <Logger.h>
#include <mutex> #include <mutex>
#include <cmath>
class CurlManager{ class CurlManager{
public: public:
@@ -123,6 +124,7 @@ std::string PostHTTP(const std::string& IP, const std::string& Fields) {
CURLcode res; CURLcode res;
std::string readBuffer; std::string readBuffer;
if (curl) { if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, IP.c_str()); curl_easy_setopt(curl, CURLOPT_URL, IP.c_str());
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header);
@@ -130,9 +132,11 @@ std::string PostHTTP(const std::string& IP, const std::string& Fields) {
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, Fields.c_str()); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, Fields.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); //curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10); curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);
res = curl_easy_perform(curl); res = curl_easy_perform(curl);
if (res != CURLE_OK) if (res != CURLE_OK)
return "-1"; return "-1";
} }
Regular → Executable
+3 -4
View File
@@ -7,8 +7,7 @@
/// ///
#include "Network/network.h" #include "Network/network.h"
#include <ws2tcpip.h>
#include <WS2tcpip.h>
#include <filesystem> #include <filesystem>
#include "Startup.h" #include "Startup.h"
#include "Logger.h" #include "Logger.h"
@@ -20,6 +19,7 @@
#include <atomic> #include <atomic>
#include <vector> #include <vector>
#include <future> #include <future>
#include <cmath>
namespace fs = std::filesystem; namespace fs = std::filesystem;
std::string ListOfMods; std::string ListOfMods;
@@ -37,8 +37,7 @@ std::vector<std::string> Split(const std::string& String,const std::string& deli
} }
void CheckForDir(){ void CheckForDir(){
struct stat info{}; if(!fs::exists("Resources")){
if(stat( "Resources", &info) != 0){
_wmkdir(L"Resources"); _wmkdir(L"Resources");
} }
} }
Regular → Executable
+1 -1
View File
@@ -8,7 +8,7 @@
#include "Zlib/Compressor.h" #include "Zlib/Compressor.h"
#include "Network/network.h" #include "Network/network.h"
#include <WS2tcpip.h> #include <ws2tcpip.h>
#include "Logger.h" #include "Logger.h"
#include <string> #include <string>
#include <set> #include <set>
Regular → Executable
+2 -2
View File
@@ -10,7 +10,7 @@
#include <vector> #include <vector>
#include "Logger.h" #include "Logger.h"
#include <iostream> #include <iostream>
#include <WS2tcpip.h> #include <ws2tcpip.h>
#include <Zlib/Compressor.h> #include <Zlib/Compressor.h>
#include "Network/network.h" #include "Network/network.h"
@@ -133,7 +133,7 @@ void TCPClientMain(const std::string& IP,int Port){
RetCode = connect(TCPSock, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr)); RetCode = connect(TCPSock, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr));
if(RetCode != 0){ if(RetCode != 0){
UlStatus = "UlConnection Failed!"; UlStatus = "UlConnection Failed!";
std::cout << "Client: connect failed! Error code: " << WSAGetLastError() << std::endl; error("Client: connect failed! Error code: " + std::to_string(WSAGetLastError()));
KillSocket(TCPSock); KillSocket(TCPSock);
WSACleanup(); WSACleanup();
Terminate = true; Terminate = true;
Regular → Executable
+1 -2
View File
@@ -7,13 +7,12 @@
/// ///
#include <filesystem> #include <filesystem>
#include <Windows.h> #include <windows.h>
#include "Logger.h" #include "Logger.h"
#include <fstream> #include <fstream>
#include <sstream> #include <sstream>
#include <string> #include <string>
#include <thread> #include <thread>
#include <ShlDisp.h>
#define MAX_KEY_LENGTH 255 #define MAX_KEY_LENGTH 255
#define MAX_VALUE_NAME 16383 #define MAX_VALUE_NAME 16383
Regular → Executable
+9 -4
View File
@@ -12,7 +12,7 @@
#include <fstream> #include <fstream>
#include "Json.h" #include "Json.h"
using namespace std::filesystem; namespace fs = std::filesystem;
std::string PublicKey; std::string PublicKey;
extern bool LoginAuth; extern bool LoginAuth;
std::string Role; std::string Role;
@@ -24,7 +24,7 @@ void UpdateKey(const char* newKey){
Key << newKey; Key << newKey;
Key.close(); Key.close();
}else fatal("Cannot write to disk!"); }else fatal("Cannot write to disk!");
}else if(exists("key")){ }else if(fs::exists("key")){
remove("key"); remove("key");
} }
} }
@@ -55,6 +55,7 @@ std::string Login(const std::string& fields){
} }
if (Buffer.at(0) != '{' || d.HasParseError()) { if (Buffer.at(0) != '{' || d.HasParseError()) {
error(Buffer);
return GetFail("Invalid answer from authentication servers, please try again later!"); return GetFail("Invalid answer from authentication servers, please try again later!");
} }
if(!d["success"].IsNull() && d["success"].GetBool()){ if(!d["success"].IsNull() && d["success"].GetBool()){
@@ -79,17 +80,20 @@ std::string Login(const std::string& fields){
} }
void CheckLocalKey(){ void CheckLocalKey(){
if(exists("key") && file_size("key") < 100){ if(fs::exists("key") && fs::file_size("key") < 100){
std::ifstream Key("key"); std::ifstream Key("key");
if(Key.is_open()) { if(Key.is_open()) {
auto Size = file_size("key"); auto Size = fs::file_size("key");
std::string Buffer(Size, 0); std::string Buffer(Size, 0);
Key.read(&Buffer[0], Size); Key.read(&Buffer[0], Size);
Key.close(); Key.close();
Buffer = PostHTTP("https://auth.beammp.com/userlogin", R"({"pk":")"+Buffer+"\"}"); Buffer = PostHTTP("https://auth.beammp.com/userlogin", R"({"pk":")"+Buffer+"\"}");
json::Document d; json::Document d;
d.Parse(Buffer.c_str()); d.Parse(Buffer.c_str());
if (Buffer == "-1" || Buffer.at(0) != '{' || d.HasParseError()) { if (Buffer == "-1" || Buffer.at(0) != '{' || d.HasParseError()) {
error(Buffer);
fatal("Invalid answer from authentication servers, please try again later!"); fatal("Invalid answer from authentication servers, please try again later!");
} }
if(d["success"].GetBool()){ if(d["success"].GetBool()){
@@ -97,6 +101,7 @@ void CheckLocalKey(){
UpdateKey(d["private_key"].GetString()); UpdateKey(d["private_key"].GetString());
PublicKey = d["public_key"].GetString(); PublicKey = d["public_key"].GetString();
Role = d["role"].GetString(); Role = d["role"].GetString();
//info(Role);
}else{ }else{
info("Auto-Authentication unsuccessful please re-login!"); info("Auto-Authentication unsuccessful please re-login!");
UpdateKey(nullptr); UpdateKey(nullptr);
Regular → Executable
+16 -33
View File
@@ -5,6 +5,8 @@
/// ///
/// Created by Anonymous275 on 7/16/2020 /// Created by Anonymous275 on 7/16/2020
/// ///
#include "Discord/discord_info.h" #include "Discord/discord_info.h"
#include "Network/network.h" #include "Network/network.h"
#include "Security/Init.h" #include "Security/Init.h"
@@ -23,10 +25,10 @@ std::string GetEN(){
return "BeamMP-Launcher.exe"; return "BeamMP-Launcher.exe";
} }
std::string GetVer(){ std::string GetVer(){
return "1.81"; return "1.80";
} }
std::string GetPatch(){ std::string GetPatch(){
return ".0"; return ".95";
} }
std::string GetEP(char*P){ std::string GetEP(char*P){
static std::string Ret = [&](){ static std::string Ret = [&](){
@@ -59,35 +61,15 @@ void URelaunch(int argc,char* args[]){
exit(1); exit(1);
} }
void CheckName(int argc,char* args[]){ void CheckName(int argc,char* args[]){
struct stat info{};
std::string DN = GetEN(),CDir = args[0],FN = CDir.substr(CDir.find_last_of('\\')+1); std::string DN = GetEN(),CDir = args[0],FN = CDir.substr(CDir.find_last_of('\\')+1);
if(FN != DN){ if(FN != DN){
if(stat(DN.c_str(),&info)==0)remove(DN.c_str()); if(fs::exists(DN))remove(DN.c_str());
if(stat(DN.c_str(),&info)==0)ReLaunch(argc,args); if(fs::exists(DN))ReLaunch(argc,args);
std::rename(FN.c_str(), DN.c_str()); std::rename(FN.c_str(), DN.c_str());
URelaunch(argc,args); URelaunch(argc,args);
} }
} }
/// Deprecated
void RequestRole(){
/*auto NPos = std::string::npos;
std::string HTTP_Result = HTTP_REQUEST("https://beammp.com/entitlement?did="+GetDID()+"&t=l",443);
if(HTTP_Result == "-1"){
HTTP_Result = HTTP_REQUEST("https://backup1.beammp.com/entitlement?did="+GetDID()+"&t=l",443);
if(HTTP_Result == "-1") {
fatal("Sorry Backend System Outage! Don't worry it will back on soon!");
}
}
if(HTTP_Result.find("\"MDEV\"") != NPos || HTTP_Result.find("\"CON\"") != NPos){
Dev = true;
}
if(HTTP_Result.find("Error") != NPos){
fatal("Sorry You need to be in the official BeamMP Discord to proceed! https://discord.gg/beammp");
}
info("Client Connected!");*/
}
void CheckForUpdates(int argc,char*args[],const std::string& CV){ void CheckForUpdates(int argc,char*args[],const std::string& CV){
std::string link = "https://beammp.com/builds/launcher?version=true"; std::string link = "https://beammp.com/builds/launcher?version=true";
std::string HTTP = HTTP_REQUEST(link,443); std::string HTTP = HTTP_REQUEST(link,443);
@@ -147,13 +129,12 @@ void InitLauncher(int argc, char* argv[]) {
SetConsoleTitleA(("BeamMP Launcher v" + std::string(GetVer()) + GetPatch()).c_str()); SetConsoleTitleA(("BeamMP Launcher v" + std::string(GetVer()) + GetPatch()).c_str());
InitLog(); InitLog();
CheckName(argc, argv); CheckName(argc, argv);
CheckLocalKey(); //will replace RequestRole CheckLocalKey();
Discord_Main(); ConfigInit();
//Dev = true;
//RequestRole();
CustomPort(argc, argv); CustomPort(argc, argv);
Discord_Main();
CheckForUpdates(argc, argv, std::string(GetVer()) + GetPatch()); CheckForUpdates(argc, argv, std::string(GetVer()) + GetPatch());
} }
size_t DirCount(const std::filesystem::path& path){ size_t DirCount(const std::filesystem::path& path){
return (size_t)std::distance(std::filesystem::directory_iterator{path}, std::filesystem::directory_iterator{}); return (size_t)std::distance(std::filesystem::directory_iterator{path}, std::filesystem::directory_iterator{});
@@ -179,7 +160,7 @@ void CheckMP(const std::string& Path) {
} }
void PreGame(const std::string& GamePath){ void PreGame(const std::string& GamePath){
const std::string CurrVer("0.21.3.0"); const std::string CurrVer("0.21.4.0");
std::string GameVer = CheckVer(GamePath); std::string GameVer = CheckVer(GamePath);
info("Game Version : " + GameVer); info("Game Version : " + GameVer);
if(GameVer < CurrVer){ if(GameVer < CurrVer){
@@ -198,11 +179,13 @@ void PreGame(const std::string& GamePath){
}catch(std::exception&e){ }catch(std::exception&e){
fatal(e.what()); fatal(e.what());
} }
/* Download("https://backend.beammp.com/builds/client?download=true"
"&pk=" + PublicKey +
"&branch=" + Branch, GetGamePath() + R"(mods\multiplayer\BeamMP.zip)", true);*/
Download("https://beammp.com/builds/client", GetGamePath() + R"(mods\multiplayer\BeamMP.zip)", true); Download("https://beammp.com/builds/client", GetGamePath() + R"(mods\multiplayer\BeamMP.zip)", true);
info("Download Complete!"); info("Download Complete!");
} }
/*debug("Name : " + GetDName());
debug("Discriminator : " + GetDTag());
debug("Unique ID : " + GetDID());*/
} }
Regular → Executable
View File