diff --git a/src/Regex.cpp b/src/Regex.cpp index d9bc249..8112a2e 100644 --- a/src/Regex.cpp +++ b/src/Regex.cpp @@ -48,13 +48,13 @@ void Regex(cmd *inputCmd) { // Count the number of lines while (std::getline(inputStream, line)) { - inputCmd->slashtp++; + inputCmd->totalmods++; } } -void filerestort(cmd *inputCmd) { - std::filesystem::path steamdir = std::string(inputCmd->userHome) + "/.cache/steamapps/workshop/content/" + inputCmd->gameid + "/" + inputCmd->idnumber; - std::filesystem::path modname = inputCmd->dir + "/" + inputCmd->idname; +void filerestort(cmd *inputCmd, std::string idnumber, std::string idname) { + std::filesystem::path steamdir = std::string(inputCmd->userHome) + "/.cache/steamapps/workshop/content/" + inputCmd->gameid + "/" + idnumber; + std::filesystem::path modname = inputCmd->dir + "/" + idname; // renames and moves the files. try { @@ -63,29 +63,37 @@ void filerestort(cmd *inputCmd) { std::filesystem::remove_all(modname); } std::filesystem::rename(steamdir, modname); + inputCmd->threadsCompleted++; } else { std::cerr << "Error: The directory " << steamdir << " does not exist." << std::endl; + inputCmd->threadsCompleted++; } } catch (const std::filesystem::filesystem_error& e) { std::cerr << "Filesystem error: " << e.what() << std::endl; + inputCmd->threadsCompleted++; + } catch (const std::exception& e) { std::cerr << "Error: " << e.what() << std::endl; + inputCmd->threadsCompleted++; + } } -void Modname(cmd *inputCmd, std::string input) { +void Modname(cmd *inputCmd, size_t index) { + std::string idnumber; + std::string idname; if (!inputCmd->sucids.empty()) { std::regex downloadItemRegex(R"(Downloaded item (\d+))"); std::smatch match; - if (std::regex_search(input, match, downloadItemRegex)) { + if (std::regex_search(inputCmd->sucids[index], match, downloadItemRegex)) { std::string downloadItemNumber = match[1].str(); - inputCmd->idnumber = downloadItemNumber; + idnumber = downloadItemNumber; } std::istringstream inputStream(inputCmd->source); - std::regex grepRegex("\"id\":\"" + inputCmd->idnumber + "\",\"title\":\""); + std::regex grepRegex("\"id\":\"" + idnumber + "\",\"title\":\""); std::string line; while (std::getline(inputStream, line)) { @@ -102,9 +110,9 @@ void Modname(cmd *inputCmd, std::string input) { if (idPos != std::string::npos) { line = line.substr(idPos + idPrefix.length()); // Keep everything after "id=" } - - inputCmd->idname = line; + idname = line; } } + filerestort(inputCmd, idnumber, idname); } } diff --git a/src/includes/Regex.hpp b/src/includes/Regex.hpp index ce31c53..3bcc780 100644 --- a/src/includes/Regex.hpp +++ b/src/includes/Regex.hpp @@ -1,7 +1,7 @@ #ifndef REGEX_H #define REGEX_H #include - +#include // all the var's struct cmd { const char* userHome = getenv("HOME"); @@ -19,22 +19,20 @@ std::string dir; bool ab = false; -// slashing -int slashtp = 0; -std::string slash; +// total mods +int totalmods = 0; -// counter -std::string sucids; -std::string idnumber; -std::string idname; +// Modnamestuff +std::vector sucids; int successes = 0; int timedout = 0; int errors = 0; int totalmeow = 0; + +size_t threadsCompleted = 0; }; void Regex(cmd *inputCmd); -void filerestort(cmd *inputCmd); -void Modname(cmd *inputCmd, std::string input); +void Modname(cmd *inputCmd, size_t index); #endif diff --git a/src/maincommand.cpp b/src/maincommand.cpp index 2a970dc..9f83dac 100644 --- a/src/maincommand.cpp +++ b/src/maincommand.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #include #include #include @@ -24,7 +23,7 @@ void execAndDisplay(cmd *inputCmd, const std::string& cmd, std::atomic& ru // checks for success. if (line.find("Success") != std::string::npos) { inputCmd->successes++; - inputCmd->sucids += line + "\n"; + inputCmd->sucids.push_back( line + "\n"); } // checks for timed out ones. @@ -39,8 +38,6 @@ void execAndDisplay(cmd *inputCmd, const std::string& cmd, std::atomic& ru std::ofstream meow{"/home/rander/.cache/errors.txt"}; meow << "start:\n" + line; } - - inputCmd->totalmeow++; } running = false; @@ -83,7 +80,7 @@ void maincommand(cmd *inputCmd) { } // mod or collection? - std::string total = (inputCmd->ab == true) ? "Total: 1" : "Total: " + std::to_string(inputCmd->slashtp -1) + "\n"; + std::string total = (inputCmd->ab == true) ? "Total: 1" : "Total: " + std::to_string(inputCmd->totalmods -1) + "\n"; std::string colm = (inputCmd->ab == true) ? R"(Mod)" : R"(Collection)"; // shows how much and what has downloaded @@ -93,15 +90,13 @@ void maincommand(cmd *inputCmd) { + "Timed out: " + std::to_string(inputCmd->timedout) + "\n" + "Errored: " + std::to_string(inputCmd->errors) + "\n" + "\n"; - // mod names - std::istringstream inputStream(inputCmd->sucids); - std::string line; - - while (std::getline(inputStream, line)) { - inputCmd->slashtp++; - Modname(inputCmd, line); - filerestort(inputCmd); + //start the threads + for(size_t nya{0}; nya < inputCmd->sucids.size(); ++nya){ + inputCmd->totalmods++; + std::thread meowT {Modname, inputCmd, nya}; + meowT.detach(); } + while(inputCmd->threadsCompleted != inputCmd->sucids.size()){} std::cout << "\n\n" + mods + colm + " has been downloaded too: " + inputCmd->dir + "\n"; }