aboutsummaryrefslogtreecommitdiff
path: root/launcher
diff options
context:
space:
mode:
authorSefa Eyeoglu <contact@scrumplex.net>2022-05-17 16:08:59 +0200
committerGitHub <noreply@github.com>2022-05-17 16:08:59 +0200
commit1012912272d14d8cc8eb1e009579a997b7a35b7f (patch)
tree2e180e52d6f32998de51cd2ab19d8bb288eb58ae /launcher
parent9b387d73e55c0ed793224a6d4d5ab7aa3f0b0406 (diff)
parentedbd90a4e671486bdc1ca6f8f051445ae473fdcc (diff)
downloadPrismLauncher-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')
-rw-r--r--launcher/minecraft/mod/LocalModParseTask.cpp54
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))