From 050db169f58ee2f98c3d76f9e16373e77153f4a7 Mon Sep 17 00:00:00 2001 From: Anonymous275 Date: Sat, 20 Jun 2020 14:57:08 +0300 Subject: [PATCH] Minor tweaking --- src/CoreNetwork.cpp | 15 ++++++-- src/Network 2.0/GlobalHandler.cpp | 1 - src/Resources.cpp | 58 +++++++++++++++++++++++++------ src/main.cpp | 26 ++++++-------- 4 files changed, 70 insertions(+), 30 deletions(-) diff --git a/src/CoreNetwork.cpp b/src/CoreNetwork.cpp index ffd6b95..2d4d25f 100644 --- a/src/CoreNetwork.cpp +++ b/src/CoreNetwork.cpp @@ -19,8 +19,10 @@ extern int ping; extern bool Terminate; extern bool TCPTerminate; extern bool MPDEV; - +extern std::string ListOfMods; +bool Confirm = false; void StartSync(const std::string &Data){ + Terminate = false; std::thread t1(ProxyThread,Data.substr(1,Data.find(':')-1),std::stoi(Data.substr(Data.find(':')+1))); //std::thread t1(ProxyThread,"127.0.0.1",30814); t1.detach(); @@ -35,8 +37,14 @@ std::string Parse(const std::string& Data){ case 'B': return Code + HTTP_REQUEST("s1.yourthought.co.uk/servers-info",3599); case 'C': + ListOfMods.clear(); StartSync(Data); - return ""; + std::cout << "Called Connect" << std::endl; + while(ListOfMods.empty() && !Terminate){ + std::this_thread::sleep_for(std::chrono::seconds(1)); + } + if(ListOfMods == "-")return ""; + else return "L"+ListOfMods; case 'U': if(SubCode == 'l')return UlStatus; if(SubCode == 'p')return "Up" + std::to_string(ping); @@ -50,6 +58,9 @@ std::string Parse(const std::string& Data){ } if(SubCode == 'G')exit(2); return ""; + case 'R': //will send mod name useful?? + Confirm = true; + return ""; default: return ""; } diff --git a/src/Network 2.0/GlobalHandler.cpp b/src/Network 2.0/GlobalHandler.cpp index 4330b1d..a15e698 100644 --- a/src/Network 2.0/GlobalHandler.cpp +++ b/src/Network 2.0/GlobalHandler.cpp @@ -106,7 +106,6 @@ void Reset() { UDPSock = -1; TCPSock = -1; } - std::string Compress(const std::string&Data); std::string Decompress(const std::string&Data); void TCPGameServer(const std::string& IP, int Port){ diff --git a/src/Resources.cpp b/src/Resources.cpp index 0fbdeae..a4170c3 100644 --- a/src/Resources.cpp +++ b/src/Resources.cpp @@ -15,8 +15,9 @@ void Exit(const std::string& Msg); namespace fs = std::experimental::filesystem; extern std::string UlStatus; extern bool Terminate; +extern bool Confirm; extern bool MPDEV; - +std::string ListOfMods; std::vector Split(const std::string& String,const std::string& delimiter){ std::vector Val; size_t pos = 0; @@ -47,7 +48,7 @@ void STCPSend(SOCKET socket,const std::string&Data){ Terminate = true; return; } - std::this_thread::sleep_for(std::chrono::milliseconds(100)); + std::this_thread::sleep_for(std::chrono::milliseconds(200)); } std::pair STCPRecv(SOCKET socket){ char buf[64000]; @@ -76,6 +77,13 @@ void CheckForDir(){ _wmkdir(L"Resources"); } } +void WaitForConfirm(){ + while(!Terminate && !Confirm){ + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + Confirm = false; +} + void SyncResources(SOCKET Sock){ if(MPDEV)std::cout << "SyncResources Called" << std::endl; CheckForDir(); @@ -83,28 +91,50 @@ void SyncResources(SOCKET Sock){ STCPSend(Sock,"SR"); char* Res = STCPRecv(Sock).first; if(strlen(Res) == 0){ + std::cout << "Didn't Receive any mod from server skipping..." << std::endl; STCPSend(Sock,"Done"); + UlStatus = "UlDone"; + ListOfMods = "-"; + std::cout << "Done!" << std::endl; return; } std::vector list = Split(std::string(Res), ";"); std::vector FNames(list.begin(), list.begin() + (list.size() / 2)); std::vector FSizes(list.begin() + (list.size() / 2), list.end()); list.clear(); - + int Amount = 0,Pos = 0; struct stat info{}; + std::string a,t; + for(const std::string&N : FNames){ + if(!N.empty()){ + t += N.substr(N.find_last_of('/')+1) + ";"; + } + } + if(t.empty())ListOfMods = "-"; + else ListOfMods = t; + t.clear(); + + for(auto FN = FNames.begin(),FS = FSizes.begin(); FN != FNames.end() && !Terminate; ++FN,++FS) { + int pos = FN->find_last_of('/'); + if (pos == std::string::npos)continue; + Amount++; + } for(auto FN = FNames.begin(),FS = FSizes.begin(); FN != FNames.end() && !Terminate; ++FN,++FS) { - std::string a; int pos = FN->find_last_of('/'); if (pos != std::string::npos) { a = "Resources" + FN->substr(pos); } else continue; char *Data; - + Pos++; if (stat(a.c_str(), &info) == 0) { if (FS->find_first_not_of("0123456789") != std::string::npos)continue; - if (fs::file_size(a) == std::stoi(*FS)) { + if (fs::file_size(a) == std::stoi(*FS)){ + UlStatus = "UlLoading Resource: (" + std::to_string(Pos) + "/" + std::to_string(Amount) + + "): " + a.substr(a.find_last_of('/')); + fs::copy_file(a, "BeamNG/mods"+a.substr(a.find_last_of('/')), fs::copy_options::overwrite_existing); + WaitForConfirm(); continue; - } else remove(a.c_str()); + }else remove(a.c_str()); } CheckForDir(); std::ofstream LFS; @@ -119,15 +149,21 @@ void SyncResources(SOCKET Sock){ LFS.write(Data, Pair.second); float per = LFS.tellp() / std::stof(*FS) * 100; std::string Percent = std::to_string(truncf(per * 10) / 10); - UlStatus = "UlDownloading Resource: " + a.substr(a.find_last_of('/')) + " (" + + UlStatus = "UlDownloading Resource: (" + std::to_string(Pos) + "/" + std::to_string(Amount) + + "): " + a.substr(a.find_last_of('/')) + " (" + Percent.substr(0, Percent.find('.') + 2) + "%)"; } while (LFS.tellp() != std::stoi(*FS)); LFS.close(); - } - if(!FNames.empty()){ - STCPSend(Sock,"Done"); + UlStatus = "UlLoading Resource: (" + std::to_string(Pos) + "/" + std::to_string(Amount) + + "): " + a.substr(a.find_last_of('/')); + fs::copy_file(a, "BeamNG/mods"+a.substr(a.find_last_of('/')), fs::copy_options::overwrite_existing); + WaitForConfirm(); } FNames.clear(); FSizes.clear(); + a.clear(); + std::this_thread::sleep_for(std::chrono::seconds(2)); + UlStatus = "UlDone"; + STCPSend(Sock,"Done"); std::cout << "Done!" << std::endl; } \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index dbaaec7..2afe760 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -42,27 +42,18 @@ void Exit(const std::string& Msg){ } std::string CheckDir(char*dir){ - char*temp;size_t len; struct stat info{}; - _dupenv_s(&temp, &len,"APPDATA"); - std::string DN = "BeamMP-Launcher.exe",CDir = dir, AD = temp,FN = CDir.substr(CDir.find_last_of('\\')+1,CDir.size()); - AD += "\\BeamMP-Launcher"; + std::string DN = "BeamMP-Launcher.exe",CDir = dir,FN = CDir.substr(CDir.find_last_of('\\')+1); if(FN != DN){ if(stat(DN.c_str(),&info)==0)remove(DN.c_str()); SystemExec("rename \""+ FN +"\" " + DN + ">nul"); } - if(CDir.substr(0,CDir.find_last_of('\\')) != AD){ - _mkdir(AD.c_str()); - SystemExec(R"(move "BeamMP-Launcher.exe" ")" + AD + "\">nul"); - } - SetCurrentDirectoryA(AD.c_str()); - SystemExec("rename *.exe " + DN + ">nul"); - SystemExec(R"(powershell "$s=(New-Object -COM WScript.Shell).CreateShortcut('%userprofile%\Desktop\BeamMP-Launcher.lnk');$s.TargetPath=')"+AD+"\\"+DN+"';$s.Save()\""); + //SystemExec(R"(powershell "$s=(New-Object -COM WScript.Shell).CreateShortcut('%userprofile%\Desktop\BeamMP-Launcher.lnk');$s.TargetPath=')"+AD+"\\"+DN+"';$s.Save()\""); if(stat("BeamNG",&info))SystemExec("mkdir BeamNG>nul"); - if(stat("BeamNG\\mods",&info))SystemExec("mkdir BeamNG\\mods>nul"); + if(!stat("BeamNG\\mods",&info))SystemExec("RD /S /Q BeamNG\\mods>nul"); + SystemExec("mkdir BeamNG\\mods>nul"); if(stat("BeamNG\\settings",&info))SystemExec("mkdir BeamNG\\settings>nul"); - SetFileAttributesA("BeamNG",2|4); - return AD + "\\BeamNG"; + return CDir.substr(0,CDir.find_last_of('\\')) + "\\BeamNG"; } std::string CheckVer(const std::string &path){ @@ -111,9 +102,12 @@ int main(int argc, char* argv[]){ if(argc > 1){ std::string Port = argv[1]; if(Port.find_first_not_of("0123456789") == NPos){ - DEFAULT_PORT = std::stoi(Port); - std::cout << "Running on custom port : " << DEFAULT_PORT << std::endl; + if(std::stoi(Port) > 1000){ + DEFAULT_PORT = std::stoi(Port); + std::cout << "Running on custom port : " << DEFAULT_PORT << std::endl; + } } + if(argc > 2)MPDEV = false; } //Security