Added curseforge selection
This commit is contained in:
		
							
								
								
									
										99
									
								
								launcher/modplatform/flame/FlameModIndex.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								launcher/modplatform/flame/FlameModIndex.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,99 @@
 | 
			
		||||
#include <QObject>
 | 
			
		||||
#include "FlameModIndex.h"
 | 
			
		||||
#include "Json.h"
 | 
			
		||||
#include "net/NetJob.h"
 | 
			
		||||
#include "BaseInstance.h"
 | 
			
		||||
#include "minecraft/MinecraftInstance.h"
 | 
			
		||||
#include "minecraft/PackProfile.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void FlameMod::loadIndexedPack(FlameMod::IndexedPack & pack, QJsonObject & obj)
 | 
			
		||||
{
 | 
			
		||||
    pack.addonId = Json::requireInteger(obj, "id");
 | 
			
		||||
    pack.name = Json::requireString(obj, "name");
 | 
			
		||||
    pack.websiteUrl = Json::ensureString(obj, "websiteUrl", "");
 | 
			
		||||
    pack.description = Json::ensureString(obj, "summary", "");
 | 
			
		||||
 | 
			
		||||
    bool thumbnailFound = false;
 | 
			
		||||
    auto attachments = Json::requireArray(obj, "attachments");
 | 
			
		||||
    for(auto attachmentRaw: attachments) {
 | 
			
		||||
        auto attachmentObj = Json::requireObject(attachmentRaw);
 | 
			
		||||
        bool isDefault = attachmentObj.value("isDefault").toBool(false);
 | 
			
		||||
        if(isDefault) {
 | 
			
		||||
            thumbnailFound = true;
 | 
			
		||||
            pack.logoName = Json::requireString(attachmentObj, "title");
 | 
			
		||||
            pack.logoUrl = Json::requireString(attachmentObj, "thumbnailUrl");
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if(!thumbnailFound) {
 | 
			
		||||
        throw JSONValidationError(QString("Pack without an icon, skipping: %1").arg(pack.name));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    auto authors = Json::requireArray(obj, "authors");
 | 
			
		||||
    for(auto authorIter: authors) {
 | 
			
		||||
        auto author = Json::requireObject(authorIter);
 | 
			
		||||
        FlameMod::ModpackAuthor packAuthor;
 | 
			
		||||
        packAuthor.name = Json::requireString(author, "name");
 | 
			
		||||
        packAuthor.url = Json::requireString(author, "url");
 | 
			
		||||
        pack.authors.append(packAuthor);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void FlameMod::loadIndexedPackVersions(FlameMod::IndexedPack & pack, QJsonArray & arr, const shared_qobject_ptr<QNetworkAccessManager>& network, BaseInstance * inst)
 | 
			
		||||
{
 | 
			
		||||
    QVector<FlameMod::IndexedVersion> unsortedVersions;
 | 
			
		||||
    bool hasFabric = !((MinecraftInstance *)inst)->getPackProfile()->getComponentVersion("net.fabricmc.fabric-loader").isEmpty();
 | 
			
		||||
    QString mcVersion = ((MinecraftInstance *)inst)->getPackProfile()->getComponentVersion("net.minecraft");
 | 
			
		||||
 | 
			
		||||
    for(auto versionIter: arr) {
 | 
			
		||||
        auto obj = versionIter.toObject();
 | 
			
		||||
        FlameMod::IndexedVersion file;
 | 
			
		||||
        file.addonId = pack.addonId;
 | 
			
		||||
        file.fileId = Json::requireInteger(obj, "id");
 | 
			
		||||
        file.date = Json::requireString(obj, "fileDate");
 | 
			
		||||
        auto versionArray = Json::requireArray(obj, "gameVersion");
 | 
			
		||||
        if (versionArray.empty()) {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        for(auto mcVer : versionArray){
 | 
			
		||||
            file.mcVersion.append(mcVer.toString());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        file.version = Json::requireString(obj, "displayName");
 | 
			
		||||
        file.downloadUrl = Json::requireString(obj, "downloadUrl");
 | 
			
		||||
        file.fileName = Json::requireString(obj, "fileName");
 | 
			
		||||
 | 
			
		||||
        auto modules = Json::requireArray(obj, "modules");
 | 
			
		||||
        bool valid = false;
 | 
			
		||||
        for(auto m : modules){
 | 
			
		||||
            auto fname = Json::requireString(m.toObject(),"foldername");
 | 
			
		||||
            if(hasFabric){
 | 
			
		||||
                if(fname == "fabric.mod.json"){
 | 
			
		||||
                    valid = true;
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
            }else{
 | 
			
		||||
                if(fname == "mcmod.info"){
 | 
			
		||||
                    valid = true;
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if(!valid){
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        unsortedVersions.append(file);
 | 
			
		||||
    }
 | 
			
		||||
    auto orderSortPredicate = [](const IndexedVersion & a, const IndexedVersion & b) -> bool
 | 
			
		||||
    {
 | 
			
		||||
        //dates are in RFC 3339 format
 | 
			
		||||
        return a.date > b.date;
 | 
			
		||||
    };
 | 
			
		||||
    std::sort(unsortedVersions.begin(), unsortedVersions.end(), orderSortPredicate);
 | 
			
		||||
    pack.versions = unsortedVersions;
 | 
			
		||||
    pack.versionsLoaded = true;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										50
									
								
								launcher/modplatform/flame/FlameModIndex.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								launcher/modplatform/flame/FlameModIndex.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,50 @@
 | 
			
		||||
//
 | 
			
		||||
// Created by timoreo on 16/01/2022.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <QList>
 | 
			
		||||
#include <QMetaType>
 | 
			
		||||
#include <QString>
 | 
			
		||||
#include <QVector>
 | 
			
		||||
#include <QNetworkAccessManager>
 | 
			
		||||
#include <QObjectPtr.h>
 | 
			
		||||
#include "net/NetJob.h"
 | 
			
		||||
#include "BaseInstance.h"
 | 
			
		||||
 | 
			
		||||
namespace FlameMod {
 | 
			
		||||
    struct ModpackAuthor {
 | 
			
		||||
        QString name;
 | 
			
		||||
        QString url;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    struct IndexedVersion {
 | 
			
		||||
        int addonId;
 | 
			
		||||
        int fileId;
 | 
			
		||||
        QString version;
 | 
			
		||||
        QVector<QString> mcVersion;
 | 
			
		||||
        QString downloadUrl;
 | 
			
		||||
        QString date;
 | 
			
		||||
        QString fileName;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    struct IndexedPack
 | 
			
		||||
    {
 | 
			
		||||
        int addonId;
 | 
			
		||||
        QString name;
 | 
			
		||||
        QString description;
 | 
			
		||||
        QList<ModpackAuthor> authors;
 | 
			
		||||
        QString logoName;
 | 
			
		||||
        QString logoUrl;
 | 
			
		||||
        QString websiteUrl;
 | 
			
		||||
 | 
			
		||||
        bool versionsLoaded = false;
 | 
			
		||||
        QVector<IndexedVersion> versions;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    void loadIndexedPack(IndexedPack & m, QJsonObject & obj);
 | 
			
		||||
    void loadIndexedPackVersions(IndexedPack &pack, QJsonArray &arr, const shared_qobject_ptr<QNetworkAccessManager> &network, BaseInstance *inst);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Q_DECLARE_METATYPE(FlameMod::IndexedPack)
 | 
			
		||||
		Reference in New Issue
	
	Block a user