This repository has been archived on 2021-06-27. You can view files and clone it, but cannot push or open issues or pull requests.
modetw/src/install.cpp

269 lines
7.5 KiB
C++

#include <string>
#include <iostream>
#include <fstream>
#include <vector>
#include "../include/rapidjson/document.h"
#include "../include/rapidjson/istreamwrapper.h"
#include "../include/rapidjson/error/en.h"
int file_not_exists(const std::string&);
int yn_query(const std::string&, bool);
int install_query(const std::string &hd, const std::string &mod, std::string& ver)
{
const std::string modjson_path(hd + "/modlist/" + mod + ".json");
if (file_not_exists(modjson_path))
{
std::cerr << mod << " not found!" << std::endl;
return 1;
}
rapidjson::Document modlist;
std::ifstream modjson_stream(modjson_path);
rapidjson::IStreamWrapper isw_modlist(modjson_stream);
modlist.ParseStream(isw_modlist);
std::cout << "Name: " << modlist["name"].GetString() << std::endl
<< "Author: " << modlist["author"].GetString() << std::endl
<< "Last update: " << modlist["update"].GetString() << std::endl;
const rapidjson::Value& versions = modlist["versions"];
std::cout << "Latest version: " << versions[0].GetString() << std::endl
<< "Available versions: ";
for (rapidjson::SizeType i = 0; i < versions.Size(); i++)
{
if (i != 0)
{
std::cout << ", ";
}
std::cout << versions[i].GetString();
}
std::cout << std::endl;
/* PRE-INSTALLATION PROCESS */
/* --VERSION */
if (yn_query("Are you sure you want to install " + mod + " version " + versions[0].GetString() + "?", true))
{
ver = versions[0].GetString();
}
else
{
if (versions.Size() > 1)
{
// std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
do
{
std::string install_ver_input;
std::cout << "Please type in the version you would like to install [enter q to quit]: ";
std::cin.clear();
std::getline(std::cin, install_ver_input);
if (install_ver_input == "q" || install_ver_input == "q\n")
{
std::cout << "Quitting!" << std::endl;
return 0;
}
std::cout << install_ver_input << std::endl;
bool install_ver_set = false;
for (rapidjson::SizeType i = 0; i < versions.Size(); i++)
{
if (install_ver_input == versions[i].GetString())
{
ver = install_ver_input;
install_ver_set = true;
break;
}
}
if (install_ver_set)
{
break;
}
std::cout << "Error! " << install_ver_input << " not found in versions list!" << std::endl;
} while (true);
}
else
{
std::cout << "Exiting installation!" << std::endl;
return 0;
}
}
std::cout << "Preparing to install " << mod << " version " << ver << "..." << std::endl;
return 0;
}
int install(const std::string &hd, const std::string &mod)
{
std::string install_ver;
if (install_query(hd, mod, install_ver))
{
return 1;
}
/* --PACKPREINSTALLATION*/
const std::string modconfig_path(hd + "/" + mod + "/" + install_ver + "/modconfig.json");
std::cout << modconfig_path << std::endl;
if (file_not_exists(modconfig_path))
{
std::cerr << modconfig_path << " not found!" << std::endl;
return 1;
}
rapidjson::Document modconfig;
std::ifstream modconfig_stream(modconfig_path);
rapidjson::IStreamWrapper isw_config(modconfig_stream);
if (modconfig.ParseStream<0>(isw_config).HasParseError())
{
std::cerr << GetParseError_En(modconfig.GetParseError()) << std::endl;
return 1;
}
modconfig.ParseStream(isw_config);
std::cout << "CAMPAIGN SELECTION" << std::endl
<< "==================" << std::endl;
for (rapidjson::SizeType i = 0; i < modconfig["campaigns"].Size(); i++)
{
std::cout << "[" << (i+1) << "] " << modconfig["campaigns"][i]["name"].GetString() << std::endl << "Description: " << modconfig["campaigns"][i]["desc"].GetString() << std::endl << std::endl;
}
int campaign_selection, turn_selection;
/* CAMPAIGN SELECTION */
do
{
char campaign_selection_char;
std::cout << std::endl << "Please select a campaign:";
for (rapidjson::SizeType i = 0; i < modconfig["campaigns"].Size(); i++)
{
std::cout << " [" << (i+1) << "] " << modconfig["campaigns"][i]["name"].GetString();
}
std::cout << " [press q to exit]" << std::endl;
std::cin.get(campaign_selection_char);
campaign_selection = campaign_selection_char - '0';
if (campaign_selection_char == 'q')
{
return 0;
}
else if (campaign_selection < 1 || campaign_selection > (int) modconfig["campaigns"].Size())
{
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "Error! \"" << campaign_selection_char << "\" is not a valid input." << std::endl;
}
else
{
break;
}
} while (true);
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
/* TURN SELECTION */
do
{
char turn_selection_char;
std::cout << std::endl << "Please select your preferred number of turns per campaign year:";
const rapidjson::Value& turns = modconfig["turns"];
for (rapidjson::SizeType i = 0; i < turns.Size(); i++)
{
std::cout << " [" << (i+1) << "] " << turns[i]["name"].GetString();
}
std::cout << " [press q to exit]" << std::endl;
std::cin.get(turn_selection_char);
turn_selection = turn_selection_char - '0';
if (turn_selection_char == 'q')
{
return 0;
}
else if (turn_selection < 1 || turn_selection > (int) turns.Size())
{
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "Error! \"" << turn_selection_char << "\" is not a valid input." << std::endl;
}
else
{
break;
}
} while (true);
std::cout << std::endl << "You have selected:" << std::endl
<< "Campaign: " << modconfig["campaigns"][campaign_selection-1]["name"].GetString() << std::endl
<< "Turns: " << modconfig["turns"][turn_selection-1]["name"].GetString() << std::endl << std::endl;
/* PACKS SELECTION */
std::cout << "PACK SELECTION" << std::endl
<< "==============" << std::endl;
std::vector<bool> pack_vector;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
// std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
for (rapidjson::SizeType i = 0; i < modconfig["packs"].Size(); i++)
{
std::cout << std::endl << modconfig["packs"][i]["name"].GetString() << std::endl
<< modconfig["packs"][i]["desc"].GetString() << std::endl;
if (yn_query("Do you want to install this pack?", true))
{
pack_vector.insert(pack_vector.end(), true);
}
else pack_vector.insert(pack_vector.end(), false);
std::cin.clear();
}
/* SELECTION SUMMARY */
std::cout << "SELECTION SUMMARY" << std::endl
<< "=================" << std::endl;
std::cout << "Campaign: " << modconfig["campaigns"][campaign_selection-1]["name"].GetString() << std::endl
<< "Turns: " << modconfig["turns"][turn_selection-1]["name"].GetString() << std::endl
<< "Packs: ";
for (rapidjson::SizeType i = 0; i < modconfig["packs"].Size(); i++)
{
if (pack_vector[i])
{
std::cout << modconfig["packs"][i]["name"].GetString();
if (i != (modconfig["packs"].Size() - 1))
{
std::cout << ", ";
}
}
}
std::cout << std::endl << std::endl;
if (!yn_query("Are you sure you want to install this selection?", true))
{
return 0;
}
return 0;
}