075d900d45
Fixes #206 partially. Although we don't list mods that have no compatibility with the mod loader we are using, mods that have support for both loaders still show up, and the versions for both the loaders are still shown. Also simplifies a little the logic in FlameModIndex::loadIndexedPackVersions
103 lines
3.8 KiB
C++
103 lines
3.8 KiB
C++
#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();
|
|
|
|
auto versionArray = Json::requireArray(obj, "gameVersion");
|
|
if (versionArray.isEmpty()) {
|
|
continue;
|
|
}
|
|
|
|
FlameMod::IndexedVersion file;
|
|
for(auto mcVer : versionArray){
|
|
file.mcVersion.append(mcVer.toString());
|
|
}
|
|
|
|
file.addonId = pack.addonId;
|
|
file.fileId = Json::requireInteger(obj, "id");
|
|
file.date = Json::requireString(obj, "fileDate");
|
|
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 is_valid_fabric_version = false;
|
|
for(auto m : modules){
|
|
auto fname = Json::requireString(m.toObject(),"foldername");
|
|
// FIXME: This does not work properly when a mod supports more than one mod loader, since
|
|
// they bundle the meta files for all of them in the same arquive, even when that version
|
|
// doesn't support the given mod loader.
|
|
if(hasFabric){
|
|
if(fname == "fabric.mod.json"){
|
|
is_valid_fabric_version = true;
|
|
break;
|
|
}
|
|
}
|
|
else if(fname == "mcmod.info"){ //this cannot check for the recent mcmod.toml formats
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(hasFabric && !is_valid_fabric_version)
|
|
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;
|
|
}
|