From 6bd2605a79bec9267740f223c87d56d2263d98b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Thu, 20 Apr 2017 05:22:04 +0200 Subject: NOISSUE add import from curse zip packs Does not actually grab mods, but resolves them and prints the results in logs. --- api/logic/InstanceImportTask.cpp | 88 +++++++++++++++++++++++++++++++++++----- 1 file changed, 77 insertions(+), 11 deletions(-) (limited to 'api/logic/InstanceImportTask.cpp') diff --git a/api/logic/InstanceImportTask.cpp b/api/logic/InstanceImportTask.cpp index 23897778..1b44ec7a 100644 --- a/api/logic/InstanceImportTask.cpp +++ b/api/logic/InstanceImportTask.cpp @@ -1,3 +1,4 @@ +#include "minecraft/onesix/OneSixInstance.h" #include "InstanceImportTask.h" #include "BaseInstance.h" @@ -9,6 +10,9 @@ #include "settings/INISettingsObject.h" #include "icons/IIconList.h" #include +#include "minecraft/curse/FileResolvingTask.h" +#include "minecraft/curse/PackManifest.h" +#include "Json.h" InstanceImportTask::InstanceImportTask(SettingsObjectPtr settings, const QUrl sourceUrl, BaseInstanceProvider * target, const QString &instName, const QString &instIcon, const QString &instGroup) @@ -107,18 +111,87 @@ void InstanceImportTask::extractFinished() } QDir extractDir(m_stagingPath); const QFileInfo instanceCfgFile = findRecursive(extractDir.absolutePath(), "instance.cfg"); - if (!instanceCfgFile.isFile() || !instanceCfgFile.exists()) + const QFileInfo curseJson = findRecursive(extractDir.absolutePath(), "manifest.json"); + if (instanceCfgFile.isFile()) + { + processMultiMC(instanceCfgFile); + } + else if (curseJson.isFile()) + { + processCurse(curseJson); + } + else { m_target->destroyStagingPath(m_stagingPath); - emitFailed(tr("Archive does not contain instance.cfg")); + emitFailed(tr("Archive does not contain a recognized modpack type.")); + } +} + +void InstanceImportTask::extractAborted() +{ + m_target->destroyStagingPath(m_stagingPath); + emitFailed(tr("Instance import has been aborted.")); + return; +} + +void InstanceImportTask::processCurse(const QFileInfo & manifest) +{ + Curse::Manifest pack; + try + { + Curse::loadManifest(pack, manifest.absoluteFilePath()); + } + catch (JSONValidationError & e) + { + emitFailed(tr("Could not understand curse manifest:\n") + e.cause()); return; } + m_packRoot = manifest.absolutePath(); + QString configPath = FS::PathCombine(m_packRoot, "instance.cfg"); + auto instanceSettings = std::make_shared(configPath); + instanceSettings->registerSetting("InstanceType", "Legacy"); + instanceSettings->set("InstanceType", "OneSix"); + OneSixInstance instance(m_globalSettings, instanceSettings, m_packRoot); + instance.setIntendedVersionId(pack.minecraft.version); + instance.setName(m_instName); + instance.setIconKey(m_instIcon); + m_curseResolver.reset(new Curse::FileResolvingTask(pack.files)); + connect(m_curseResolver.get(), &Curse::FileResolvingTask::succeeded, this, &InstanceImportTask::curseResolvingSucceeded); + connect(m_curseResolver.get(), &Curse::FileResolvingTask::failed, this, &InstanceImportTask::curseResolvingFailed); + m_curseResolver->start(); +} +void InstanceImportTask::curseResolvingFailed(QString reason) +{ + m_target->destroyStagingPath(m_stagingPath); + m_curseResolver.reset(); + emitFailed(tr("Unable to resolve Curse mod IDs:\n") + reason); +} + +void InstanceImportTask::curseResolvingSucceeded() +{ + auto results = m_curseResolver->getResults(); + for(auto result: results) + { + qDebug() << result.fileName << " = " << result.url; + } + m_curseResolver.reset(); + if (!m_target->commitStagedInstance(m_stagingPath, m_packRoot, m_instName, m_instGroup)) + { + m_target->destroyStagingPath(m_stagingPath); + emitFailed(tr("Unable to commit instance")); + return; + } + emitSucceeded(); +} + +void InstanceImportTask::processMultiMC(const QFileInfo & config) +{ // FIXME: copy from FolderInstanceProvider!!! FIX IT!!! - auto instanceSettings = std::make_shared(instanceCfgFile.absoluteFilePath()); + auto instanceSettings = std::make_shared(config.absoluteFilePath()); instanceSettings->registerSetting("InstanceType", "Legacy"); - QString actualDir = instanceCfgFile.absolutePath(); + QString actualDir = config.absolutePath(); NullInstance instance(m_globalSettings, instanceSettings, actualDir); // reset time played on import... because packs. @@ -155,10 +228,3 @@ void InstanceImportTask::extractFinished() } emitSucceeded(); } - -void InstanceImportTask::extractAborted() -{ - m_target->destroyStagingPath(m_stagingPath); - emitFailed(tr("Instance import has been aborted.")); - return; -} -- cgit v1.2.3