diff options
author | Sefa Eyeoglu <contact@scrumplex.net> | 2022-05-17 16:08:59 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-17 16:08:59 +0200 |
commit | 1012912272d14d8cc8eb1e009579a997b7a35b7f (patch) | |
tree | 2e180e52d6f32998de51cd2ab19d8bb288eb58ae /launcher/minecraft | |
parent | 9b387d73e55c0ed793224a6d4d5ab7aa3f0b0406 (diff) | |
parent | edbd90a4e671486bdc1ca6f8f051445ae473fdcc (diff) | |
download | PrismLauncher-1012912272d14d8cc8eb1e009579a997b7a35b7f.tar.gz PrismLauncher-1012912272d14d8cc8eb1e009579a997b7a35b7f.tar.bz2 PrismLauncher-1012912272d14d8cc8eb1e009579a997b7a35b7f.zip |
Merge pull request #567 from Scrumplex/quilt-metadata
Support `quilt.mod.json` metadata
Diffstat (limited to 'launcher/minecraft')
-rw-r--r-- | launcher/minecraft/mod/LocalModParseTask.cpp | 54 |
1 files changed, 53 insertions, 1 deletions
diff --git a/launcher/minecraft/mod/LocalModParseTask.cpp b/launcher/minecraft/mod/LocalModParseTask.cpp index f01da8ae..631c3abb 100644 --- a/launcher/minecraft/mod/LocalModParseTask.cpp +++ b/launcher/minecraft/mod/LocalModParseTask.cpp @@ -8,6 +8,7 @@ #include <quazip/quazipfile.h> #include <toml.h> +#include "Json.h" #include "settings/INIFile.h" #include "FileSystem.h" @@ -262,6 +263,44 @@ std::shared_ptr<ModDetails> ReadFabricModInfo(QByteArray contents) return details; } +// https://github.com/QuiltMC/rfcs/blob/master/specification/0002-quilt.mod.json.md +std::shared_ptr<ModDetails> ReadQuiltModInfo(QByteArray contents) +{ + QJsonParseError jsonError; + QJsonDocument jsonDoc = QJsonDocument::fromJson(contents, &jsonError); + auto object = Json::requireObject(jsonDoc, "quilt.mod.json"); + auto schemaVersion = Json::ensureInteger(object.value("schema_version"), 0, "Quilt schema_version"); + + std::shared_ptr<ModDetails> details = std::make_shared<ModDetails>(); + + // https://github.com/QuiltMC/rfcs/blob/be6ba280d785395fefa90a43db48e5bfc1d15eb4/specification/0002-quilt.mod.json.md + if (schemaVersion == 1) + { + auto modInfo = Json::requireObject(object.value("quilt_loader"), "Quilt mod info"); + + details->mod_id = Json::requireString(modInfo.value("id"), "Mod ID"); + details->version = Json::requireString(modInfo.value("version"), "Mod version"); + + auto modMetadata = Json::ensureObject(modInfo.value("metadata")); + + details->name = Json::ensureString(modMetadata.value("name"), details->mod_id); + details->description = Json::ensureString(modMetadata.value("description")); + + auto modContributors = Json::ensureObject(modMetadata.value("contributors")); + + // We don't really care about the role of a contributor here + details->authors += modContributors.keys(); + + auto modContact = Json::ensureObject(modMetadata.value("contact")); + + if (modContact.contains("homepage")) + { + details->homeurl = Json::requireString(modContact.value("homepage")); + } + } + return details; +} + std::shared_ptr<ModDetails> ReadForgeInfo(QByteArray contents) { std::shared_ptr<ModDetails> details = std::make_shared<ModDetails>(); @@ -391,7 +430,7 @@ void LocalModParseTask::processAsZip() zip.close(); return; } - else if (zip.setCurrentFile("fabric.mod.json")) // TODO: Support quilt.mod.json + else if (zip.setCurrentFile("fabric.mod.json")) { if (!file.open(QIODevice::ReadOnly)) { @@ -404,6 +443,19 @@ void LocalModParseTask::processAsZip() zip.close(); return; } + else if (zip.setCurrentFile("quilt.mod.json")) + { + if (!file.open(QIODevice::ReadOnly)) + { + zip.close(); + return; + } + + m_result->details = ReadQuiltModInfo(file.readAll()); + file.close(); + zip.close(); + return; + } else if (zip.setCurrentFile("forgeversion.properties")) { if (!file.open(QIODevice::ReadOnly)) |