added multithreading

This commit is contained in:
Luna 2024-10-23 02:01:34 +03:00
parent 0ed8a758af
commit 1c50d4d779
3 changed files with 32 additions and 25 deletions

View file

@ -52,9 +52,9 @@ void Regex(cmd *inputCmd) {
} }
} }
void filerestort(cmd *inputCmd) { void filerestort(cmd *inputCmd, std::string idnumber, std::string idname) {
std::filesystem::path steamdir = std::string(inputCmd->userHome) + "/.cache/steamapps/workshop/content/" + inputCmd->gameid + "/" + inputCmd->idnumber; std::filesystem::path steamdir = std::string(inputCmd->userHome) + "/.cache/steamapps/workshop/content/" + inputCmd->gameid + "/" + idnumber;
std::filesystem::path modname = inputCmd->dir + "/" + inputCmd->idname; std::filesystem::path modname = inputCmd->dir + "/" + idname;
// renames and moves the files. // renames and moves the files.
try { try {
@ -63,29 +63,38 @@ void filerestort(cmd *inputCmd) {
std::filesystem::remove_all(modname); std::filesystem::remove_all(modname);
} }
std::filesystem::rename(steamdir, modname); std::filesystem::rename(steamdir, modname);
inputCmd->threadsCompleted++;
} else { } else {
std::cerr << "Error: The directory " << steamdir << " does not exist." << std::endl; std::cerr << "Error: The directory " << steamdir << " does not exist." << std::endl;
inputCmd->threadsCompleted++;
} }
} catch (const std::filesystem::filesystem_error& e) { } catch (const std::filesystem::filesystem_error& e) {
std::cerr << "Filesystem error: " << e.what() << std::endl; std::cerr << "Filesystem error: " << e.what() << std::endl;
inputCmd->threadsCompleted++;
} catch (const std::exception& e) { } catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << std::endl; 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()) { if (!inputCmd->sucids.empty()) {
std::regex downloadItemRegex(R"(Downloaded item (\d+))"); std::regex downloadItemRegex(R"(Downloaded item (\d+))");
std::smatch match; 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(); std::string downloadItemNumber = match[1].str();
inputCmd->idnumber = downloadItemNumber; idnumber = downloadItemNumber;
} }
std::istringstream inputStream(inputCmd->source); std::istringstream inputStream(inputCmd->source);
std::regex grepRegex("\"id\":\"" + inputCmd->idnumber + "\",\"title\":\""); std::regex grepRegex("\"id\":\"" + idnumber + "\",\"title\":\"");
std::string line; std::string line;
while (std::getline(inputStream, line)) { while (std::getline(inputStream, line)) {
@ -103,8 +112,9 @@ void Modname(cmd *inputCmd, std::string input) {
line = line.substr(idPos + idPrefix.length()); // Keep everything after "id=" line = line.substr(idPos + idPrefix.length()); // Keep everything after "id="
} }
inputCmd->idname = line; idname = line;
} }
} }
filerestort(inputCmd, idnumber, idname);
} }
} }

View file

@ -1,7 +1,7 @@
#ifndef REGEX_H #ifndef REGEX_H
#define REGEX_H #define REGEX_H
#include <string> #include <string>
#include <vector>
// all the var's // all the var's
struct cmd { struct cmd {
const char* userHome = getenv("HOME"); const char* userHome = getenv("HOME");
@ -24,17 +24,15 @@ int slashtp = 0;
std::string slash; std::string slash;
// counter // counter
std::string sucids; std::vector<std::string> sucids;
std::string idnumber;
std::string idname;
int successes = 0; int successes = 0;
int timedout = 0; int timedout = 0;
int errors = 0; int errors = 0;
int totalmeow = 0; int totalmeow = 0;
size_t threadsCompleted = 0;
}; };
void Regex(cmd *inputCmd); void Regex(cmd *inputCmd);
void filerestort(cmd *inputCmd); void Modname(cmd *inputCmd, size_t index);
void Modname(cmd *inputCmd, std::string input);
#endif #endif

View file

@ -1,7 +1,6 @@
#include <filesystem> #include <filesystem>
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
#include <sstream>
#include <stdexcept> #include <stdexcept>
#include <string> #include <string>
#include <thread> #include <thread>
@ -24,7 +23,8 @@ void execAndDisplay(cmd *inputCmd, const std::string& cmd, std::atomic<bool>& ru
// checks for success. // checks for success.
if (line.find("Success") != std::string::npos) { if (line.find("Success") != std::string::npos) {
inputCmd->successes++; inputCmd->successes++;
inputCmd->sucids += line + "\n"; inputCmd->sucids.push_back( line + "\n");
std::cout << "pushed success to array\n";
} }
// checks for timed out ones. // checks for timed out ones.
@ -93,15 +93,14 @@ void maincommand(cmd *inputCmd) {
+ "Timed out: " + std::to_string(inputCmd->timedout) + "\n" + "Timed out: " + std::to_string(inputCmd->timedout) + "\n"
+ "Errored: " + std::to_string(inputCmd->errors) + "\n" + "\n"; + "Errored: " + std::to_string(inputCmd->errors) + "\n" + "\n";
// mod names //start the threads
std::istringstream inputStream(inputCmd->sucids); for(size_t nya{0}; nya < inputCmd->sucids.size(); ++nya){
std::string line; inputCmd->slashtp++;
std::thread meowT {Modname, inputCmd, nya};
while (std::getline(inputStream, line)) { meowT.detach();
inputCmd->slashtp++;
Modname(inputCmd, line);
filerestort(inputCmd);
} }
std::cout << "waiting for threads to finish >.<\n";
while(inputCmd->threadsCompleted != inputCmd->sucids.size()){}
std::cout << "threads finished!\n";
std::cout << "\n\n" + mods + colm + " has been downloaded too: " + inputCmd->dir + "\n"; std::cout << "\n\n" + mods + colm + " has been downloaded too: " + inputCmd->dir + "\n";
} }