aboutsummaryrefslogtreecommitdiff
path: root/primedev/mods/autodownload/moddownloader.cpp
diff options
context:
space:
mode:
authorGeckoEidechse <40122905+GeckoEidechse@users.noreply.github.com>2024-11-20 21:34:21 +0100
committerGitHub <noreply@github.com>2024-11-20 21:34:21 +0100
commitb9ecae0389d09be94eb3b53a98ddcaab9b74e702 (patch)
tree9648d03f52fdfbcef7a219afa8df88247cee3da6 /primedev/mods/autodownload/moddownloader.cpp
parent04b7527fb0bdfce61d39c9d7de57f8c1e21ae660 (diff)
parent3e40fa3c9a589b7fc5088c43ead2b32bf68c6bbe (diff)
downloadNorthstarLauncher-b9ecae0389d09be94eb3b53a98ddcaab9b74e702.tar.gz
NorthstarLauncher-b9ecae0389d09be94eb3b53a98ddcaab9b74e702.zip
Merge branch 'main' into feat/whitelist-safeio-file-extensions
Diffstat (limited to 'primedev/mods/autodownload/moddownloader.cpp')
-rw-r--r--primedev/mods/autodownload/moddownloader.cpp42
1 files changed, 26 insertions, 16 deletions
diff --git a/primedev/mods/autodownload/moddownloader.cpp b/primedev/mods/autodownload/moddownloader.cpp
index 8e533dec..c20a3adb 100644
--- a/primedev/mods/autodownload/moddownloader.cpp
+++ b/primedev/mods/autodownload/moddownloader.cpp
@@ -103,23 +103,23 @@ void ModDownloader::FetchModsListFromAPI()
for (auto i = verifiedModsJson.MemberBegin(); i != verifiedModsJson.MemberEnd(); ++i)
{
// Format testing
- if (!i->value.HasMember("DependencyPrefix") || !i->value.HasMember("Versions"))
+ if (!i->value.HasMember("Repository") || !i->value.HasMember("Versions"))
{
spdlog::warn("Verified mods manifesto format is unrecognized, skipping loading.");
return;
}
std::string name = i->name.GetString();
- std::string dependency = i->value["DependencyPrefix"].GetString();
-
std::unordered_map<std::string, VerifiedModVersion> modVersions;
+
rapidjson::Value& versions = i->value["Versions"];
assert(versions.IsArray());
for (auto& attribute : versions.GetArray())
{
assert(attribute.IsObject());
// Format testing
- if (!attribute.HasMember("Version") || !attribute.HasMember("Checksum"))
+ if (!attribute.HasMember("Version") || !attribute.HasMember("Checksum") || !attribute.HasMember("DownloadLink") ||
+ !attribute.HasMember("Platform"))
{
spdlog::warn("Verified mods manifesto format is unrecognized, skipping loading.");
return;
@@ -127,10 +127,14 @@ void ModDownloader::FetchModsListFromAPI()
std::string version = attribute["Version"].GetString();
std::string checksum = attribute["Checksum"].GetString();
- modVersions.insert({version, {.checksum = checksum}});
+ std::string downloadLink = attribute["DownloadLink"].GetString();
+ std::string platformValue = attribute["Platform"].GetString();
+ VerifiedModPlatform platform =
+ platformValue.compare("thunderstore") == 0 ? VerifiedModPlatform::Thunderstore : VerifiedModPlatform::Unknown;
+ modVersions.insert({version, {.checksum = checksum, .downloadLink = downloadLink, .platform = platform}});
}
- VerifiedModDetails modConfig = {.dependencyPrefix = dependency, .versions = modVersions};
+ VerifiedModDetails modConfig = {.versions = modVersions};
verifiedMods.insert({name, modConfig});
spdlog::info("==> Loaded configuration for mod \"" + name + "\"");
}
@@ -164,13 +168,10 @@ int ModDownloader::ModFetchingProgressCallback(
return 0;
}
-std::optional<fs::path> ModDownloader::FetchModFromDistantStore(std::string_view modName, std::string_view modVersion)
+std::optional<fs::path> ModDownloader::FetchModFromDistantStore(std::string_view modName, VerifiedModVersion version)
{
- // Retrieve mod prefix from local mods list, or use mod name as mod prefix if bypass flag is set
- std::string modPrefix = strstr(GetCommandLineA(), VERIFICATION_FLAG) ? modName.data() : verifiedMods[modName.data()].dependencyPrefix;
- // Build archive distant URI
- std::string archiveName = std::format("{}-{}.zip", modPrefix, modVersion.data());
- std::string url = STORE_URL + archiveName;
+ std::string url = version.downloadLink;
+ std::string archiveName = fs::path(url).filename().generic_string();
spdlog::info(std::format("Fetching mod archive from {}", url));
// Download destination
@@ -390,7 +391,7 @@ int GetModArchiveSize(unzFile file, unz_global_info64 info)
return totalSize;
}
-void ModDownloader::ExtractMod(fs::path modPath)
+void ModDownloader::ExtractMod(fs::path modPath, VerifiedModPlatform platform)
{
unzFile file;
std::string name;
@@ -428,6 +429,14 @@ void ModDownloader::ExtractMod(fs::path modPath)
modState.total = GetModArchiveSize(file, gi);
modState.progress = 0;
+ // Right now, we only know how to extract Thunderstore mods
+ if (platform != VerifiedModPlatform::Thunderstore)
+ {
+ spdlog::error("Failed extracting mod from unknown platform (value: {}).", platform);
+ modState.state = UNKNOWN_PLATFORM;
+ return;
+ }
+
// Mod directory name (removing the ".zip" fom the archive name)
name = modPath.filename().string();
name = name.substr(0, name.length() - 4);
@@ -598,8 +607,9 @@ void ModDownloader::DownloadMod(std::string modName, std::string modVersion)
});
// Download mod archive
- std::string expectedHash = verifiedMods[modName].versions[modVersion].checksum;
- std::optional<fs::path> fetchingResult = FetchModFromDistantStore(std::string_view(modName), std::string_view(modVersion));
+ VerifiedModVersion fullVersion = verifiedMods[modName].versions[modVersion];
+ std::string expectedHash = fullVersion.checksum;
+ std::optional<fs::path> fetchingResult = FetchModFromDistantStore(std::string_view(modName), fullVersion);
if (!fetchingResult.has_value())
{
spdlog::error("Something went wrong while fetching archive, aborting.");
@@ -615,7 +625,7 @@ void ModDownloader::DownloadMod(std::string modName, std::string modVersion)
}
// Extract downloaded mod archive
- ExtractMod(archiveLocation);
+ ExtractMod(archiveLocation, fullVersion.platform);
});
requestThread.detach();