mirror of
https://github.com/HamletDuFromage/aio-switch-updater.git
synced 2024-11-28 12:22:02 +00:00
improve cheats extraction, now suports multicontent games
This commit is contained in:
parent
3964a2281e
commit
8e761e7009
2 changed files with 38 additions and 101 deletions
2
Makefile
2
Makefile
|
@ -50,7 +50,7 @@ CFLAGS += $(INCLUDE) -D__SWITCH__ \
|
||||||
-DAPP_TITLE="\"$(APP_TITLE)\"" -DAPP_TITLE_LOWER="\"$(TARGET)\""
|
-DAPP_TITLE="\"$(APP_TITLE)\"" -DAPP_TITLE_LOWER="\"$(TARGET)\""
|
||||||
|
|
||||||
|
|
||||||
CXXFLAGS := $(CFLAGS) -std=gnu++17 -fexceptions -Wno-reorder
|
CXXFLAGS := $(CFLAGS) -std=gnu++20 -fexceptions -Wno-reorder
|
||||||
|
|
||||||
ASFLAGS := -g $(ARCH)
|
ASFLAGS := -g $(ARCH)
|
||||||
LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
|
LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
#include <ranges>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -179,93 +180,51 @@ namespace extract {
|
||||||
return diff;
|
return diff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int computeOffset(CFW cfw)
|
||||||
|
{
|
||||||
|
switch (cfw) {
|
||||||
|
case CFW::ams:
|
||||||
|
std::filesystem::create_directory(AMS_PATH);
|
||||||
|
std::filesystem::create_directory(AMS_CONTENTS);
|
||||||
|
chdir(AMS_PATH);
|
||||||
|
return std::string(CONTENTS_PATH).length();
|
||||||
|
break;
|
||||||
|
case CFW::rnx:
|
||||||
|
std::filesystem::create_directory(REINX_PATH);
|
||||||
|
std::filesystem::create_directory(REINX_CONTENTS);
|
||||||
|
chdir(REINX_PATH);
|
||||||
|
return std::string(CONTENTS_PATH).length();
|
||||||
|
break;
|
||||||
|
case CFW::sxos:
|
||||||
|
std::filesystem::create_directory(SXOS_PATH);
|
||||||
|
std::filesystem::create_directory(SXOS_TITLES);
|
||||||
|
chdir(SXOS_PATH);
|
||||||
|
return std::string(TITLES_PATH).length();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void extractCheats(const std::string& zipPath, std::vector<std::string> titles, CFW cfw, bool credits)
|
void extractCheats(const std::string& zipPath, std::vector<std::string> titles, CFW cfw, bool credits)
|
||||||
{
|
{
|
||||||
zipper::Unzipper unzipper(zipPath);
|
zipper::Unzipper unzipper(zipPath);
|
||||||
std::vector<zipper::ZipEntry> entries = unzipper.entries();
|
std::vector<zipper::ZipEntry> entries = unzipper.entries();
|
||||||
//std::set<std::string> extractedTitles;
|
int offset = computeOffset(cfw);
|
||||||
int offset = 0;
|
|
||||||
switch (cfw) {
|
|
||||||
case CFW::ams:
|
|
||||||
offset = std::string(CONTENTS_PATH).length();
|
|
||||||
std::filesystem::create_directory(AMS_PATH);
|
|
||||||
std::filesystem::create_directory(AMS_CONTENTS);
|
|
||||||
chdir(AMS_PATH);
|
|
||||||
break;
|
|
||||||
case CFW::rnx:
|
|
||||||
offset = std::string(CONTENTS_PATH).length();
|
|
||||||
std::filesystem::create_directory(REINX_PATH);
|
|
||||||
std::filesystem::create_directory(REINX_CONTENTS);
|
|
||||||
chdir(REINX_PATH);
|
|
||||||
break;
|
|
||||||
case CFW::sxos:
|
|
||||||
offset = std::string(TITLES_PATH).length();
|
|
||||||
std::filesystem::create_directory(SXOS_PATH);
|
|
||||||
std::filesystem::create_directory(SXOS_TITLES);
|
|
||||||
chdir(SXOS_PATH);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<std::string> entriesNames;
|
ProgressEvent::instance().setTotalSteps(titles.size() + 1);
|
||||||
std::vector<int> parentIndexes;
|
for (const auto& title : titles) {
|
||||||
for (size_t i = 1; i < entries.size(); i++) {
|
|
||||||
entriesNames.push_back(entries[i].name);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::sort(entriesNames.begin(), entriesNames.end(), caselessCompare);
|
|
||||||
|
|
||||||
std::vector<std::string> parents;
|
|
||||||
std::vector<std::vector<std::string>> children;
|
|
||||||
std::vector<std::string> tempChildren;
|
|
||||||
|
|
||||||
size_t k = 0;
|
|
||||||
while (k < entriesNames.size()) {
|
|
||||||
if (entriesNames[k].length() == (size_t)(offset + 17)) {
|
|
||||||
parents.push_back(entriesNames[k]);
|
|
||||||
k++;
|
|
||||||
while (entriesNames[k].length() != (size_t)(offset + 17) && k < entriesNames.size()) {
|
|
||||||
if (credits == false) {
|
|
||||||
if (strcasecmp(entriesNames[k].substr(offset + 16, 7).c_str(), "/cheats") == 0) {
|
|
||||||
tempChildren.push_back(entriesNames[k]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
tempChildren.push_back(entriesNames[k]);
|
|
||||||
}
|
|
||||||
k++;
|
|
||||||
}
|
|
||||||
children.push_back(tempChildren);
|
|
||||||
tempChildren.clear();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
k++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t lastL = 0;
|
|
||||||
std::string id;
|
|
||||||
ProgressEvent::instance().setTotalSteps(titles.size());
|
|
||||||
for (size_t j = 0; j < titles.size(); j++) {
|
|
||||||
if (ProgressEvent::instance().getInterupt()) {
|
if (ProgressEvent::instance().getInterupt()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
for (size_t l = lastL; l < parents.size(); l++) {
|
auto matches = entries | std::views::filter([&title, offset](zipper::ZipEntry entry) {
|
||||||
if (strcasecmp((titles[j]).c_str(), parents[l].substr(offset, 16).c_str()) == 0) {
|
return strcasecmp((title.substr(0, 13)).c_str(), entry.name.substr(offset, 13).c_str()) == 0 && strcasecmp(entry.name.substr(offset + 16, 7).c_str(), "/cheats") == 0;
|
||||||
unzipper.extractEntry(parents[l]);
|
});
|
||||||
for (auto& e : children[l]) {
|
for (const auto& match : matches) {
|
||||||
unzipper.extractEntry(e);
|
unzipper.extractEntry(match.name);
|
||||||
//extractedTitles.insert(id);
|
ProgressEvent::instance().incrementStep(1);
|
||||||
ProgressEvent::instance().setStep(j);
|
|
||||||
id = e.substr(offset, 16);
|
|
||||||
std::transform(id.begin(), id.end(), id.begin(), ::toupper);
|
|
||||||
}
|
|
||||||
lastL = l;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
unzipper.close();
|
unzipper.close();
|
||||||
//writeTitlesToFile(extractedTitles, UPDATED_TITLES_PATH);
|
|
||||||
download::downloadFile(CHEATS_URL_VERSION, CHEATS_VERSION, OFF);
|
download::downloadFile(CHEATS_URL_VERSION, CHEATS_VERSION, OFF);
|
||||||
ProgressEvent::instance().setStep(ProgressEvent::instance().getMax());
|
ProgressEvent::instance().setStep(ProgressEvent::instance().getMax());
|
||||||
}
|
}
|
||||||
|
@ -274,41 +233,19 @@ namespace extract {
|
||||||
{
|
{
|
||||||
zipper::Unzipper unzipper(zipPath);
|
zipper::Unzipper unzipper(zipPath);
|
||||||
std::vector<zipper::ZipEntry> entries = unzipper.entries();
|
std::vector<zipper::ZipEntry> entries = unzipper.entries();
|
||||||
|
int offset = computeOffset(cfw);
|
||||||
|
|
||||||
int offset = 0;
|
ProgressEvent::instance().setTotalSteps(entries.size() + 1);
|
||||||
switch (cfw) {
|
|
||||||
case CFW::ams:
|
|
||||||
offset = std::string(CONTENTS_PATH).length() + 17 + 7;
|
|
||||||
std::filesystem::create_directory(AMS_PATH);
|
|
||||||
std::filesystem::create_directory(AMS_CONTENTS);
|
|
||||||
chdir(AMS_PATH);
|
|
||||||
break;
|
|
||||||
case CFW::rnx:
|
|
||||||
offset = std::string(CONTENTS_PATH).length() + 17 + 7;
|
|
||||||
std::filesystem::create_directory(REINX_PATH);
|
|
||||||
std::filesystem::create_directory(REINX_CONTENTS);
|
|
||||||
chdir(REINX_PATH);
|
|
||||||
break;
|
|
||||||
case CFW::sxos:
|
|
||||||
offset = std::string(TITLES_PATH).length() + 17 + 7;
|
|
||||||
std::filesystem::create_directory(SXOS_PATH);
|
|
||||||
std::filesystem::create_directory(SXOS_TITLES);
|
|
||||||
chdir(SXOS_PATH);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
ProgressEvent::instance().setTotalSteps(entries.size());
|
|
||||||
for (const auto& entry : entries) {
|
for (const auto& entry : entries) {
|
||||||
if (ProgressEvent::instance().getInterupt()) {
|
if (ProgressEvent::instance().getInterupt()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (((int)entry.name.size() == offset + 16 + 4) && (isBID(entry.name.substr(offset, 16)))) {
|
if (((int)entry.name.size() == offset + 16 + 4) && (isBID(entry.name.substr(offset, 16)))) {
|
||||||
//extractedTitles.insert(util::upperCase(entry.name.substr(offset - 24, 16)));
|
|
||||||
unzipper.extractEntry(entry.name);
|
unzipper.extractEntry(entry.name);
|
||||||
}
|
}
|
||||||
ProgressEvent::instance().incrementStep(1);
|
ProgressEvent::instance().incrementStep(1);
|
||||||
}
|
}
|
||||||
unzipper.close();
|
unzipper.close();
|
||||||
//writeTitlesToFile(extractedTitles, UPDATED_TITLES_PATH);
|
|
||||||
download::downloadFile(CHEATS_URL_VERSION, CHEATS_VERSION, OFF);
|
download::downloadFile(CHEATS_URL_VERSION, CHEATS_VERSION, OFF);
|
||||||
ProgressEvent::instance().setStep(ProgressEvent::instance().getMax());
|
ProgressEvent::instance().setStep(ProgressEvent::instance().getMax());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue