Merge pull request #567 from Scrumplex/quilt-metadata
Support `quilt.mod.json` metadata
This commit is contained in:
		@@ -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))
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user