mirror of
https://github.com/BeamMP/BeamMP-Launcher.git
synced 2025-07-02 07:56:26 +00:00
Merge pull request #108 from WiserTixx/implement-mods-warning
Implement mods warning
This commit is contained in:
commit
85086909a6
@ -36,7 +36,6 @@ extern std::string MStatus;
|
|||||||
extern std::string UlStatus;
|
extern std::string UlStatus;
|
||||||
extern std::string PublicKey;
|
extern std::string PublicKey;
|
||||||
extern std::string PrivateKey;
|
extern std::string PrivateKey;
|
||||||
extern std::string ListOfMods;
|
|
||||||
int KillSocket(uint64_t Dead);
|
int KillSocket(uint64_t Dead);
|
||||||
void UUl(const std::string& R);
|
void UUl(const std::string& R);
|
||||||
void UDPSend(std::string Data);
|
void UDPSend(std::string Data);
|
||||||
@ -52,3 +51,5 @@ void TCPSend(const std::string& Data, uint64_t Sock);
|
|||||||
void TCPClientMain(const std::string& IP, int Port);
|
void TCPClientMain(const std::string& IP, int Port);
|
||||||
void UDPClientMain(const std::string& IP, int Port);
|
void UDPClientMain(const std::string& IP, int Port);
|
||||||
void TCPGameServer(const std::string& IP, int Port);
|
void TCPGameServer(const std::string& IP, int Port);
|
||||||
|
bool SecurityWarning();
|
||||||
|
void CoreSend(std::string data);
|
||||||
|
@ -44,6 +44,26 @@ std::string UlStatus;
|
|||||||
std::string MStatus;
|
std::string MStatus;
|
||||||
bool ModLoaded;
|
bool ModLoaded;
|
||||||
int ping = -1;
|
int ping = -1;
|
||||||
|
SOCKET CoreSocket = -1;
|
||||||
|
signed char confirmed = -1;
|
||||||
|
|
||||||
|
bool SecurityWarning() {
|
||||||
|
confirmed = -1;
|
||||||
|
CoreSend("WMODS_FOUND");
|
||||||
|
|
||||||
|
while (confirmed == -1)
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
||||||
|
|
||||||
|
if (confirmed == 1)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
NetReset();
|
||||||
|
Terminate = true;
|
||||||
|
TCPTerminate = true;
|
||||||
|
ping = -1;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void StartSync(const std::string& Data) {
|
void StartSync(const std::string& Data) {
|
||||||
std::string IP = GetAddr(Data.substr(1, Data.find(':') - 1));
|
std::string IP = GetAddr(Data.substr(1, Data.find(':') - 1));
|
||||||
@ -52,8 +72,8 @@ void StartSync(const std::string& Data) {
|
|||||||
UlStatus = "UlConnection Failed! (DNS Lookup Failed)";
|
UlStatus = "UlConnection Failed! (DNS Lookup Failed)";
|
||||||
else
|
else
|
||||||
UlStatus = "UlConnection Failed! (WSA failed to start)";
|
UlStatus = "UlConnection Failed! (WSA failed to start)";
|
||||||
ListOfMods = "-";
|
|
||||||
Terminate = true;
|
Terminate = true;
|
||||||
|
CoreSend("L");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
CheckLocalKey();
|
CheckLocalKey();
|
||||||
@ -67,6 +87,15 @@ void StartSync(const std::string& Data) {
|
|||||||
info("Connecting to server");
|
info("Connecting to server");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CoreSend(std::string data) {
|
||||||
|
if (CoreSocket != -1) {
|
||||||
|
int res = send(CoreSocket, (data + "\n").c_str(), int(data.size()) + 1, 0);
|
||||||
|
if (res < 0) {
|
||||||
|
debug("(Core) send failed with error: " + std::to_string(WSAGetLastError()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool IsAllowedLink(const std::string& Link) {
|
bool IsAllowedLink(const std::string& Link) {
|
||||||
std::regex link_pattern(R"(https:\/\/(?:\w+)?(?:\.)?(?:beammp\.com|discord\.gg|patreon\.com\/BeamMP))");
|
std::regex link_pattern(R"(https:\/\/(?:\w+)?(?:\.)?(?:beammp\.com|discord\.gg|patreon\.com\/BeamMP))");
|
||||||
std::smatch link_match;
|
std::smatch link_match;
|
||||||
@ -88,15 +117,8 @@ void Parse(std::string Data, SOCKET CSocket) {
|
|||||||
Data = Code + HTTP::Get("https://backend.beammp.com/servers-info");
|
Data = Code + HTTP::Get("https://backend.beammp.com/servers-info");
|
||||||
break;
|
break;
|
||||||
case 'C':
|
case 'C':
|
||||||
ListOfMods.clear();
|
|
||||||
StartSync(Data);
|
StartSync(Data);
|
||||||
while (ListOfMods.empty() && !Terminate) {
|
Data.clear();
|
||||||
std::this_thread::sleep_for(std::chrono::seconds(1));
|
|
||||||
}
|
|
||||||
if (ListOfMods == "-")
|
|
||||||
Data = "L";
|
|
||||||
else
|
|
||||||
Data = "L" + ListOfMods;
|
|
||||||
break;
|
break;
|
||||||
case 'O': // open default browser with URL
|
case 'O': // open default browser with URL
|
||||||
if (IsAllowedLink(Data.substr(1))) {
|
if (IsAllowedLink(Data.substr(1))) {
|
||||||
@ -189,6 +211,15 @@ void Parse(std::string Data, SOCKET CSocket) {
|
|||||||
Data = "N" + Login(Data.substr(Data.find(':') + 1));
|
Data = "N" + Login(Data.substr(Data.find(':') + 1));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 'W':
|
||||||
|
if (SubCode == 'Y') {
|
||||||
|
confirmed = 1;
|
||||||
|
} else if (SubCode == 'N') {
|
||||||
|
confirmed = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Data.clear();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
Data.clear();
|
Data.clear();
|
||||||
break;
|
break;
|
||||||
@ -201,7 +232,7 @@ void Parse(std::string Data, SOCKET CSocket) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
void GameHandler(SOCKET Client) {
|
void GameHandler(SOCKET Client) {
|
||||||
|
CoreSocket = Client;
|
||||||
int32_t Size, Temp, Rcv;
|
int32_t Size, Temp, Rcv;
|
||||||
char Header[10] = { 0 };
|
char Header[10] = { 0 };
|
||||||
do {
|
do {
|
||||||
|
@ -32,7 +32,6 @@
|
|||||||
#include <Utils.h>
|
#include <Utils.h>
|
||||||
|
|
||||||
namespace fs = std::filesystem;
|
namespace fs = std::filesystem;
|
||||||
std::string ListOfMods;
|
|
||||||
|
|
||||||
void CheckForDir() {
|
void CheckForDir() {
|
||||||
if (!fs::exists("Resources")) {
|
if (!fs::exists("Resources")) {
|
||||||
@ -64,16 +63,20 @@ std::string Auth(SOCKET Sock) {
|
|||||||
|
|
||||||
if (Res.empty() || Res[0] == 'E' || Res[0] == 'K') {
|
if (Res.empty() || Res[0] == 'E' || Res[0] == 'K') {
|
||||||
Abord();
|
Abord();
|
||||||
|
CoreSend("L");
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
TCPSend(PublicKey, Sock);
|
TCPSend(PublicKey, Sock);
|
||||||
if (Terminate)
|
if (Terminate) {
|
||||||
|
CoreSend("L");
|
||||||
return "";
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
Res = TCPRcv(Sock);
|
Res = TCPRcv(Sock);
|
||||||
if (Res.empty() || Res[0] != 'P') {
|
if (Res.empty() || Res[0] != 'P') {
|
||||||
Abord();
|
Abord();
|
||||||
|
CoreSend("L");
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,23 +85,27 @@ std::string Auth(SOCKET Sock) {
|
|||||||
ClientID = std::stoi(Res);
|
ClientID = std::stoi(Res);
|
||||||
} else {
|
} else {
|
||||||
Abord();
|
Abord();
|
||||||
|
CoreSend("L");
|
||||||
UUl("Authentication failed!");
|
UUl("Authentication failed!");
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
TCPSend("SR", Sock);
|
TCPSend("SR", Sock);
|
||||||
if (Terminate)
|
if (Terminate) {
|
||||||
|
CoreSend("L");
|
||||||
return "";
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
Res = TCPRcv(Sock);
|
Res = TCPRcv(Sock);
|
||||||
|
|
||||||
if (Res[0] == 'E' || Res[0] == 'K') {
|
if (Res[0] == 'E' || Res[0] == 'K') {
|
||||||
Abord();
|
Abord();
|
||||||
|
CoreSend("L");
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Res.empty() || Res == "-") {
|
if (Res.empty() || Res == "-") {
|
||||||
info("Didn't Receive any mods...");
|
info("Didn't Receive any mods...");
|
||||||
ListOfMods = "-";
|
CoreSend("L");
|
||||||
TCPSend("Done", Sock);
|
TCPSend("Done", Sock);
|
||||||
info("Done!");
|
info("Done!");
|
||||||
return "";
|
return "";
|
||||||
@ -229,6 +236,9 @@ void SyncResources(SOCKET Sock) {
|
|||||||
if (Ret.empty())
|
if (Ret.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!SecurityWarning())
|
||||||
|
return;
|
||||||
|
|
||||||
info("Checking Resources...");
|
info("Checking Resources...");
|
||||||
CheckForDir();
|
CheckForDir();
|
||||||
|
|
||||||
@ -246,9 +256,9 @@ void SyncResources(SOCKET Sock) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (t.empty())
|
if (t.empty())
|
||||||
ListOfMods = "-";
|
CoreSend("L");
|
||||||
else
|
else
|
||||||
ListOfMods = t;
|
CoreSend("L" + t);
|
||||||
t.clear();
|
t.clear();
|
||||||
for (auto FN = FNames.begin(), FS = FSizes.begin(); FN != FNames.end() && !Terminate; ++FN, ++FS) {
|
for (auto FN = FNames.begin(), FS = FSizes.begin(); FN != FNames.end() && !Terminate; ++FN, ++FS) {
|
||||||
auto pos = FN->find_last_of('/');
|
auto pos = FN->find_last_of('/');
|
||||||
|
@ -152,6 +152,7 @@ void TCPClientMain(const std::string& IP, int Port) {
|
|||||||
KillSocket(TCPSock);
|
KillSocket(TCPSock);
|
||||||
WSACleanup();
|
WSACleanup();
|
||||||
Terminate = true;
|
Terminate = true;
|
||||||
|
CoreSend("L");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
info("Connected!");
|
info("Connected!");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user