diff options
author | Sefa Eyeoglu <contact@scrumplex.net> | 2022-05-15 11:48:09 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-15 11:48:09 +0200 |
commit | 8e764fc8fb2adcc4c1e7fc9895133fc1a23b2fba (patch) | |
tree | 8f43ab1f58a6b0fe35bdc472aae0fa9342e69be0 /launcher/modplatform/modrinth/ModrinthPackManifest.cpp | |
parent | 31988f0529f6c316d6a9ba3e66cf981a807ed710 (diff) | |
parent | 4745ed28186f46de60de155826c8f2bfb54f45cb (diff) | |
download | PrismLauncher-8e764fc8fb2adcc4c1e7fc9895133fc1a23b2fba.tar.gz PrismLauncher-8e764fc8fb2adcc4c1e7fc9895133fc1a23b2fba.tar.bz2 PrismLauncher-8e764fc8fb2adcc4c1e7fc9895133fc1a23b2fba.zip |
Merge pull request #4 from flowln/modrinth_pack
Diffstat (limited to 'launcher/modplatform/modrinth/ModrinthPackManifest.cpp')
-rw-r--r-- | launcher/modplatform/modrinth/ModrinthPackManifest.cpp | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/launcher/modplatform/modrinth/ModrinthPackManifest.cpp b/launcher/modplatform/modrinth/ModrinthPackManifest.cpp index 2100aaf9..88ca808a 100644 --- a/launcher/modplatform/modrinth/ModrinthPackManifest.cpp +++ b/launcher/modplatform/modrinth/ModrinthPackManifest.cpp @@ -14,3 +14,96 @@ */ #include "ModrinthPackManifest.h" +#include "Json.h" + +#include "minecraft/MinecraftInstance.h" +#include "minecraft/PackProfile.h" + +namespace Modrinth { + +void loadIndexedPack(Modpack& pack, QJsonObject& obj) +{ + pack.id = Json::ensureString(obj, "project_id"); + + pack.name = Json::ensureString(obj, "title"); + pack.description = Json::ensureString(obj, "description"); + pack.authors << Json::ensureString(obj, "author"); + pack.iconName = QString("modrinth_%1").arg(Json::ensureString(obj, "slug")); + pack.iconUrl = Json::ensureString(obj, "icon_url"); +} + +void loadIndexedInfo(Modpack& pack, QJsonObject& obj) +{ + pack.extra.body = Json::ensureString(obj, "body"); + pack.extra.projectUrl = QString("https://modrinth.com/modpack/%1").arg(Json::ensureString(obj, "slug")); + pack.extra.sourceUrl = Json::ensureString(obj, "source_url"); + pack.extra.wikiUrl = Json::ensureString(obj, "wiki_url"); + + pack.extraInfoLoaded = true; +} + +void loadIndexedVersions(Modpack& pack, QJsonDocument& doc) +{ + QVector<ModpackVersion> unsortedVersions; + + auto arr = Json::requireArray(doc); + + for (auto versionIter : arr) { + auto obj = Json::requireObject(versionIter); + auto file = loadIndexedVersion(obj); + + if(!file.id.isEmpty()) // Heuristic to check if the returned value is valid + unsortedVersions.append(file); + } + auto orderSortPredicate = [](const ModpackVersion& a, const ModpackVersion& b) -> bool { + // dates are in RFC 3339 format + return a.date > b.date; + }; + + std::sort(unsortedVersions.begin(), unsortedVersions.end(), orderSortPredicate); + + pack.versions.swap(unsortedVersions); + + pack.versionsLoaded = true; +} + +auto loadIndexedVersion(QJsonObject &obj) -> ModpackVersion +{ + ModpackVersion file; + + file.name = Json::requireString(obj, "name"); + file.version = Json::requireString(obj, "version_number"); + + file.id = Json::requireString(obj, "id"); + file.project_id = Json::requireString(obj, "project_id"); + + file.date = Json::requireString(obj, "date_published"); + + auto files = Json::requireArray(obj, "files"); + + qWarning() << files; + + for (auto file_iter : files) { + File indexed_file; + auto parent = Json::requireObject(file_iter); + auto is_primary = Json::ensureBoolean(parent, "primary", false); + if (!is_primary) { + auto filename = Json::ensureString(parent, "filename"); + // Checking suffix here is fine because it's the response from Modrinth, + // so one would assume it will always be in English. + if(!filename.endsWith("mrpack") && !filename.endsWith("zip")) + continue; + } + + file.download_url = Json::requireString(parent, "url"); + if(is_primary) + break; + } + + if(file.download_url.isEmpty()) + return {}; + + return file; +} + +} // namespace Modrinth |