mirror of
https://github.com/PrismLauncher/PrismLauncher.git
synced 2025-06-13 05:37:42 +02:00
Resource metadata writing
Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
This commit is contained in:
@ -354,8 +354,8 @@ set(MINECRAFT_SOURCES
|
|||||||
minecraft/mod/tasks/ResourceFolderLoadTask.cpp
|
minecraft/mod/tasks/ResourceFolderLoadTask.cpp
|
||||||
minecraft/mod/tasks/LocalModParseTask.h
|
minecraft/mod/tasks/LocalModParseTask.h
|
||||||
minecraft/mod/tasks/LocalModParseTask.cpp
|
minecraft/mod/tasks/LocalModParseTask.cpp
|
||||||
minecraft/mod/tasks/LocalModUpdateTask.h
|
minecraft/mod/tasks/LocalResourceUpdateTask.h
|
||||||
minecraft/mod/tasks/LocalModUpdateTask.cpp
|
minecraft/mod/tasks/LocalResourceUpdateTask.cpp
|
||||||
minecraft/mod/tasks/LocalDataPackParseTask.h
|
minecraft/mod/tasks/LocalDataPackParseTask.h
|
||||||
minecraft/mod/tasks/LocalDataPackParseTask.cpp
|
minecraft/mod/tasks/LocalDataPackParseTask.cpp
|
||||||
minecraft/mod/tasks/LocalResourcePackParseTask.h
|
minecraft/mod/tasks/LocalResourcePackParseTask.h
|
||||||
|
@ -33,9 +33,9 @@ ResourceDownloadTask::ResourceDownloadTask(ModPlatform::IndexedPack::Ptr pack,
|
|||||||
QString custom_target_folder)
|
QString custom_target_folder)
|
||||||
: m_pack(std::move(pack)), m_pack_version(std::move(version)), m_pack_model(packs), m_custom_target_folder(custom_target_folder)
|
: m_pack(std::move(pack)), m_pack_version(std::move(version)), m_pack_model(packs), m_custom_target_folder(custom_target_folder)
|
||||||
{
|
{
|
||||||
if (auto model = dynamic_cast<ModFolderModel*>(m_pack_model.get()); model && is_indexed) {
|
if (is_indexed) {
|
||||||
m_update_task.reset(new LocalModUpdateTask(model->indexDir(), *m_pack, m_pack_version));
|
m_update_task.reset(new LocalResourceUpdateTask(m_pack_model->indexDir(), *m_pack, m_pack_version));
|
||||||
connect(m_update_task.get(), &LocalModUpdateTask::hasOldMod, this, &ResourceDownloadTask::hasOldResource);
|
connect(m_update_task.get(), &LocalResourceUpdateTask::hasOldResource, this, &ResourceDownloadTask::hasOldResource);
|
||||||
|
|
||||||
addTask(m_update_task);
|
addTask(m_update_task);
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#include "net/NetJob.h"
|
#include "net/NetJob.h"
|
||||||
#include "tasks/SequentialTask.h"
|
#include "tasks/SequentialTask.h"
|
||||||
|
|
||||||
#include "minecraft/mod/tasks/LocalModUpdateTask.h"
|
#include "minecraft/mod/tasks/LocalResourceUpdateTask.h"
|
||||||
#include "modplatform/ModIndex.h"
|
#include "modplatform/ModIndex.h"
|
||||||
|
|
||||||
class ResourceFolderModel;
|
class ResourceFolderModel;
|
||||||
@ -50,7 +50,7 @@ class ResourceDownloadTask : public SequentialTask {
|
|||||||
QString m_custom_target_folder;
|
QString m_custom_target_folder;
|
||||||
|
|
||||||
NetJob::Ptr m_filesNetJob;
|
NetJob::Ptr m_filesNetJob;
|
||||||
LocalModUpdateTask::Ptr m_update_task;
|
LocalResourceUpdateTask::Ptr m_update_task;
|
||||||
|
|
||||||
void downloadProgressChanged(qint64 current, qint64 total);
|
void downloadProgressChanged(qint64 current, qint64 total);
|
||||||
void downloadFailed(QString reason);
|
void downloadFailed(QString reason);
|
||||||
|
@ -53,7 +53,7 @@
|
|||||||
|
|
||||||
#include "Resource.h"
|
#include "Resource.h"
|
||||||
#include "minecraft/mod/tasks/LocalModParseTask.h"
|
#include "minecraft/mod/tasks/LocalModParseTask.h"
|
||||||
#include "minecraft/mod/tasks/LocalModUpdateTask.h"
|
#include "minecraft/mod/tasks/LocalResourceUpdateTask.h"
|
||||||
#include "modplatform/flame/FlameModIndex.h"
|
#include "modplatform/flame/FlameModIndex.h"
|
||||||
|
|
||||||
ModFolderModel::ModFolderModel(const QDir& dir, BaseInstance* instance, bool is_indexed, bool create_dir, QObject* parent)
|
ModFolderModel::ModFolderModel(const QDir& dir, BaseInstance* instance, bool is_indexed, bool create_dir, QObject* parent)
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
#include "minecraft/mod/tasks/ResourceFolderLoadTask.h"
|
#include "minecraft/mod/tasks/ResourceFolderLoadTask.h"
|
||||||
|
|
||||||
#include "Json.h"
|
#include "Json.h"
|
||||||
#include "minecraft/mod/tasks/LocalModUpdateTask.h"
|
#include "minecraft/mod/tasks/LocalResourceUpdateTask.h"
|
||||||
#include "modplatform/flame/FlameAPI.h"
|
#include "modplatform/flame/FlameAPI.h"
|
||||||
#include "modplatform/flame/FlameModIndex.h"
|
#include "modplatform/flame/FlameModIndex.h"
|
||||||
#include "settings/Setting.h"
|
#include "settings/Setting.h"
|
||||||
@ -192,7 +192,7 @@ bool ResourceFolderModel::installResource(QString path, ModPlatform::IndexedVers
|
|||||||
qDebug() << doc;
|
qDebug() << doc;
|
||||||
qWarning() << "Error while reading mod info: " << e.cause();
|
qWarning() << "Error while reading mod info: " << e.cause();
|
||||||
}
|
}
|
||||||
LocalModUpdateTask update_metadata(indexDir(), pack, vers);
|
LocalResourceUpdateTask update_metadata(indexDir(), pack, vers);
|
||||||
QObject::connect(&update_metadata, &Task::finished, &loop, &QEventLoop::quit);
|
QObject::connect(&update_metadata, &Task::finished, &loop, &QEventLoop::quit);
|
||||||
update_metadata.start();
|
update_metadata.start();
|
||||||
});
|
});
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "LocalModUpdateTask.h"
|
#include "LocalResourceUpdateTask.h"
|
||||||
|
|
||||||
#include "FileSystem.h"
|
#include "FileSystem.h"
|
||||||
#include "minecraft/mod/MetadataHandler.h"
|
#include "minecraft/mod/MetadataHandler.h"
|
||||||
@ -26,12 +26,12 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
LocalModUpdateTask::LocalModUpdateTask(QDir index_dir, ModPlatform::IndexedPack& mod, ModPlatform::IndexedVersion& mod_version)
|
LocalResourceUpdateTask::LocalResourceUpdateTask(QDir index_dir, ModPlatform::IndexedPack& project, ModPlatform::IndexedVersion& version)
|
||||||
: m_index_dir(index_dir), m_mod(mod), m_mod_version(mod_version)
|
: m_index_dir(index_dir), m_project(project), m_version(version)
|
||||||
{
|
{
|
||||||
// Ensure a '.index' folder exists in the mods folder, and create it if it does not
|
// Ensure a '.index' folder exists in the mods folder, and create it if it does not
|
||||||
if (!FS::ensureFolderPathExists(index_dir.path())) {
|
if (!FS::ensureFolderPathExists(index_dir.path())) {
|
||||||
emitFailed(QString("Unable to create index for mod %1!").arg(m_mod.name));
|
emitFailed(QString("Unable to create index directory at %1!").arg(index_dir.absolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef Q_OS_WIN32
|
#ifdef Q_OS_WIN32
|
||||||
@ -39,28 +39,28 @@ LocalModUpdateTask::LocalModUpdateTask(QDir index_dir, ModPlatform::IndexedPack&
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void LocalModUpdateTask::executeTask()
|
void LocalResourceUpdateTask::executeTask()
|
||||||
{
|
{
|
||||||
setStatus(tr("Updating index for mod:\n%1").arg(m_mod.name));
|
setStatus(tr("Updating index for resource:\n%1").arg(m_project.name));
|
||||||
|
|
||||||
auto old_metadata = Metadata::get(m_index_dir, m_mod.addonId);
|
auto old_metadata = Metadata::get(m_index_dir, m_project.addonId);
|
||||||
if (old_metadata.isValid()) {
|
if (old_metadata.isValid()) {
|
||||||
emit hasOldMod(old_metadata.name, old_metadata.filename);
|
emit hasOldResource(old_metadata.name, old_metadata.filename);
|
||||||
if (m_mod.slug.isEmpty())
|
if (m_project.slug.isEmpty())
|
||||||
m_mod.slug = old_metadata.slug;
|
m_project.slug = old_metadata.slug;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto pw_mod = Metadata::create(m_index_dir, m_mod, m_mod_version);
|
auto pw_mod = Metadata::create(m_index_dir, m_project, m_version);
|
||||||
if (pw_mod.isValid()) {
|
if (pw_mod.isValid()) {
|
||||||
Metadata::update(m_index_dir, pw_mod);
|
Metadata::update(m_index_dir, pw_mod);
|
||||||
emitSucceeded();
|
emitSucceeded();
|
||||||
} else {
|
} else {
|
||||||
qCritical() << "Tried to update an invalid mod!";
|
qCritical() << "Tried to update an invalid resource!";
|
||||||
emitFailed(tr("Invalid metadata"));
|
emitFailed(tr("Invalid metadata"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto LocalModUpdateTask::abort() -> bool
|
auto LocalResourceUpdateTask::abort() -> bool
|
||||||
{
|
{
|
||||||
emitAborted();
|
emitAborted();
|
||||||
return true;
|
return true;
|
@ -23,12 +23,12 @@
|
|||||||
#include "modplatform/ModIndex.h"
|
#include "modplatform/ModIndex.h"
|
||||||
#include "tasks/Task.h"
|
#include "tasks/Task.h"
|
||||||
|
|
||||||
class LocalModUpdateTask : public Task {
|
class LocalResourceUpdateTask : public Task {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
using Ptr = shared_qobject_ptr<LocalModUpdateTask>;
|
using Ptr = shared_qobject_ptr<LocalResourceUpdateTask>;
|
||||||
|
|
||||||
explicit LocalModUpdateTask(QDir index_dir, ModPlatform::IndexedPack& mod, ModPlatform::IndexedVersion& mod_version);
|
explicit LocalResourceUpdateTask(QDir index_dir, ModPlatform::IndexedPack& project, ModPlatform::IndexedVersion& version);
|
||||||
|
|
||||||
auto canAbort() const -> bool override { return true; }
|
auto canAbort() const -> bool override { return true; }
|
||||||
auto abort() -> bool override;
|
auto abort() -> bool override;
|
||||||
@ -38,10 +38,10 @@ class LocalModUpdateTask : public Task {
|
|||||||
void executeTask() override;
|
void executeTask() override;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void hasOldMod(QString name, QString filename);
|
void hasOldResource(QString name, QString filename);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QDir m_index_dir;
|
QDir m_index_dir;
|
||||||
ModPlatform::IndexedPack& m_mod;
|
ModPlatform::IndexedPack& m_project;
|
||||||
ModPlatform::IndexedVersion& m_mod_version;
|
ModPlatform::IndexedVersion& m_version;
|
||||||
};
|
};
|
@ -6,7 +6,7 @@
|
|||||||
#include "Json.h"
|
#include "Json.h"
|
||||||
|
|
||||||
#include "minecraft/mod/Mod.h"
|
#include "minecraft/mod/Mod.h"
|
||||||
#include "minecraft/mod/tasks/LocalModUpdateTask.h"
|
#include "minecraft/mod/tasks/LocalResourceUpdateTask.h"
|
||||||
|
|
||||||
#include "modplatform/flame/FlameAPI.h"
|
#include "modplatform/flame/FlameAPI.h"
|
||||||
#include "modplatform/flame/FlameModIndex.h"
|
#include "modplatform/flame/FlameModIndex.h"
|
||||||
@ -19,52 +19,52 @@ static ModPlatform::ProviderCapabilities ProviderCaps;
|
|||||||
static ModrinthAPI modrinth_api;
|
static ModrinthAPI modrinth_api;
|
||||||
static FlameAPI flame_api;
|
static FlameAPI flame_api;
|
||||||
|
|
||||||
EnsureMetadataTask::EnsureMetadataTask(Mod* mod, QDir dir, ModPlatform::ResourceProvider prov)
|
EnsureMetadataTask::EnsureMetadataTask(Resource* resource, QDir dir, ModPlatform::ResourceProvider prov)
|
||||||
: Task(nullptr), m_index_dir(dir), m_provider(prov), m_hashing_task(nullptr), m_current_task(nullptr)
|
: Task(nullptr), m_index_dir(dir), m_provider(prov), m_hashing_task(nullptr), m_current_task(nullptr)
|
||||||
{
|
{
|
||||||
auto hash_task = createNewHash(mod);
|
auto hash_task = createNewHash(resource);
|
||||||
if (!hash_task)
|
if (!hash_task)
|
||||||
return;
|
return;
|
||||||
connect(hash_task.get(), &Hashing::Hasher::resultsReady, [this, mod](QString hash) { m_mods.insert(hash, mod); });
|
connect(hash_task.get(), &Hashing::Hasher::resultsReady, [this, resource](QString hash) { m_resources.insert(hash, resource); });
|
||||||
connect(hash_task.get(), &Task::failed, [this, mod] { emitFail(mod, "", RemoveFromList::No); });
|
connect(hash_task.get(), &Task::failed, [this, resource] { emitFail(resource, "", RemoveFromList::No); });
|
||||||
hash_task->start();
|
hash_task->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
EnsureMetadataTask::EnsureMetadataTask(QList<Mod*>& mods, QDir dir, ModPlatform::ResourceProvider prov)
|
EnsureMetadataTask::EnsureMetadataTask(QList<Resource*>& resources, QDir dir, ModPlatform::ResourceProvider prov)
|
||||||
: Task(nullptr), m_index_dir(dir), m_provider(prov), m_current_task(nullptr)
|
: Task(nullptr), m_index_dir(dir), m_provider(prov), m_current_task(nullptr)
|
||||||
{
|
{
|
||||||
m_hashing_task.reset(new ConcurrentTask(this, "MakeHashesTask", 10));
|
m_hashing_task.reset(new ConcurrentTask(this, "MakeHashesTask", 10));
|
||||||
for (auto* mod : mods) {
|
for (auto* resource : resources) {
|
||||||
auto hash_task = createNewHash(mod);
|
auto hash_task = createNewHash(resource);
|
||||||
if (!hash_task)
|
if (!hash_task)
|
||||||
continue;
|
continue;
|
||||||
connect(hash_task.get(), &Hashing::Hasher::resultsReady, [this, mod](QString hash) { m_mods.insert(hash, mod); });
|
connect(hash_task.get(), &Hashing::Hasher::resultsReady, [this, resource](QString hash) { m_resources.insert(hash, resource); });
|
||||||
connect(hash_task.get(), &Task::failed, [this, mod] { emitFail(mod, "", RemoveFromList::No); });
|
connect(hash_task.get(), &Task::failed, [this, resource] { emitFail(resource, "", RemoveFromList::No); });
|
||||||
m_hashing_task->addTask(hash_task);
|
m_hashing_task->addTask(hash_task);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Hashing::Hasher::Ptr EnsureMetadataTask::createNewHash(Mod* mod)
|
Hashing::Hasher::Ptr EnsureMetadataTask::createNewHash(Resource* resource)
|
||||||
{
|
{
|
||||||
if (!mod || !mod->valid() || mod->type() == ResourceType::FOLDER)
|
if (!resource || !resource->valid() || resource->type() == ResourceType::FOLDER)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
return Hashing::createHasher(mod->fileinfo().absoluteFilePath(), m_provider);
|
return Hashing::createHasher(resource->fileinfo().absoluteFilePath(), m_provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString EnsureMetadataTask::getExistingHash(Mod* mod)
|
QString EnsureMetadataTask::getExistingHash(Resource* resource)
|
||||||
{
|
{
|
||||||
// Check for already computed hashes
|
// Check for already computed hashes
|
||||||
// (linear on the number of mods vs. linear on the size of the mod's JAR)
|
// (linear on the number of mods vs. linear on the size of the mod's JAR)
|
||||||
auto it = m_mods.keyValueBegin();
|
auto it = m_resources.keyValueBegin();
|
||||||
while (it != m_mods.keyValueEnd()) {
|
while (it != m_resources.keyValueEnd()) {
|
||||||
if ((*it).second == mod)
|
if ((*it).second == resource)
|
||||||
break;
|
break;
|
||||||
it++;
|
it++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We already have the hash computed
|
// We already have the hash computed
|
||||||
if (it != m_mods.keyValueEnd()) {
|
if (it != m_resources.keyValueEnd()) {
|
||||||
return (*it).first;
|
return (*it).first;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,25 +84,25 @@ bool EnsureMetadataTask::abort()
|
|||||||
|
|
||||||
void EnsureMetadataTask::executeTask()
|
void EnsureMetadataTask::executeTask()
|
||||||
{
|
{
|
||||||
setStatus(tr("Checking if mods have metadata..."));
|
setStatus(tr("Checking if resources have metadata..."));
|
||||||
|
|
||||||
for (auto* mod : m_mods) {
|
for (auto* resource : m_resources) {
|
||||||
if (!mod->valid()) {
|
if (!resource->valid()) {
|
||||||
qDebug() << "Mod" << mod->name() << "is invalid!";
|
qDebug() << "Resource" << resource->name() << "is invalid!";
|
||||||
emitFail(mod);
|
emitFail(resource);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// They already have the right metadata :o
|
// They already have the right metadata :o
|
||||||
if (mod->status() != ResourceStatus::NO_METADATA && mod->metadata() && mod->metadata()->provider == m_provider) {
|
if (resource->status() != ResourceStatus::NO_METADATA && resource->metadata() && resource->metadata()->provider == m_provider) {
|
||||||
qDebug() << "Mod" << mod->name() << "already has metadata!";
|
qDebug() << "Resource" << resource->name() << "already has metadata!";
|
||||||
emitReady(mod);
|
emitReady(resource);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Folders don't have metadata
|
// Folders don't have metadata
|
||||||
if (mod->type() == ResourceType::FOLDER) {
|
if (resource->type() == ResourceType::FOLDER) {
|
||||||
emitReady(mod);
|
emitReady(resource);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,9 +118,9 @@ void EnsureMetadataTask::executeTask()
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto invalidade_leftover = [this] {
|
auto invalidade_leftover = [this] {
|
||||||
for (auto mod = m_mods.constBegin(); mod != m_mods.constEnd(); mod++)
|
for (auto resource = m_resources.constBegin(); resource != m_resources.constEnd(); resource++)
|
||||||
emitFail(mod.value(), mod.key(), RemoveFromList::No);
|
emitFail(resource.value(), resource.key(), RemoveFromList::No);
|
||||||
m_mods.clear();
|
m_resources.clear();
|
||||||
|
|
||||||
emitSucceeded();
|
emitSucceeded();
|
||||||
};
|
};
|
||||||
@ -159,53 +159,53 @@ void EnsureMetadataTask::executeTask()
|
|||||||
m_current_task.reset();
|
m_current_task.reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
if (m_mods.size() > 1)
|
if (m_resources.size() > 1)
|
||||||
setStatus(tr("Requesting metadata information from %1...").arg(ProviderCaps.readableName(m_provider)));
|
setStatus(tr("Requesting metadata information from %1...").arg(ProviderCaps.readableName(m_provider)));
|
||||||
else if (!m_mods.empty())
|
else if (!m_resources.empty())
|
||||||
setStatus(tr("Requesting metadata information from %1 for '%2'...")
|
setStatus(tr("Requesting metadata information from %1 for '%2'...")
|
||||||
.arg(ProviderCaps.readableName(m_provider), m_mods.begin().value()->name()));
|
.arg(ProviderCaps.readableName(m_provider), m_resources.begin().value()->name()));
|
||||||
|
|
||||||
m_current_task = version_task;
|
m_current_task = version_task;
|
||||||
version_task->start();
|
version_task->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnsureMetadataTask::emitReady(Mod* m, QString key, RemoveFromList remove)
|
void EnsureMetadataTask::emitReady(Resource* resource, QString key, RemoveFromList remove)
|
||||||
{
|
{
|
||||||
if (!m) {
|
if (!resource) {
|
||||||
qCritical() << "Tried to mark a null mod as ready.";
|
qCritical() << "Tried to mark a null resource as ready.";
|
||||||
if (!key.isEmpty())
|
if (!key.isEmpty())
|
||||||
m_mods.remove(key);
|
m_resources.remove(key);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << QString("Generated metadata for %1").arg(m->name());
|
qDebug() << QString("Generated metadata for %1").arg(resource->name());
|
||||||
emit metadataReady(m);
|
emit metadataReady(resource);
|
||||||
|
|
||||||
if (remove == RemoveFromList::Yes) {
|
if (remove == RemoveFromList::Yes) {
|
||||||
if (key.isEmpty())
|
if (key.isEmpty())
|
||||||
key = getExistingHash(m);
|
key = getExistingHash(resource);
|
||||||
m_mods.remove(key);
|
m_resources.remove(key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnsureMetadataTask::emitFail(Mod* m, QString key, RemoveFromList remove)
|
void EnsureMetadataTask::emitFail(Resource* resource, QString key, RemoveFromList remove)
|
||||||
{
|
{
|
||||||
if (!m) {
|
if (!resource) {
|
||||||
qCritical() << "Tried to mark a null mod as failed.";
|
qCritical() << "Tried to mark a null resource as failed.";
|
||||||
if (!key.isEmpty())
|
if (!key.isEmpty())
|
||||||
m_mods.remove(key);
|
m_resources.remove(key);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << QString("Failed to generate metadata for %1").arg(m->name());
|
qDebug() << QString("Failed to generate metadata for %1").arg(resource->name());
|
||||||
emit metadataFailed(m);
|
emit metadataFailed(resource);
|
||||||
|
|
||||||
if (remove == RemoveFromList::Yes) {
|
if (remove == RemoveFromList::Yes) {
|
||||||
if (key.isEmpty())
|
if (key.isEmpty())
|
||||||
key = getExistingHash(m);
|
key = getExistingHash(resource);
|
||||||
m_mods.remove(key);
|
m_resources.remove(key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -216,7 +216,7 @@ Task::Ptr EnsureMetadataTask::modrinthVersionsTask()
|
|||||||
auto hash_type = ProviderCaps.hashType(ModPlatform::ResourceProvider::MODRINTH).first();
|
auto hash_type = ProviderCaps.hashType(ModPlatform::ResourceProvider::MODRINTH).first();
|
||||||
|
|
||||||
auto response = std::make_shared<QByteArray>();
|
auto response = std::make_shared<QByteArray>();
|
||||||
auto ver_task = modrinth_api.currentVersions(m_mods.keys(), hash_type, response);
|
auto ver_task = modrinth_api.currentVersions(m_resources.keys(), hash_type, response);
|
||||||
|
|
||||||
// Prevents unfortunate timings when aborting the task
|
// Prevents unfortunate timings when aborting the task
|
||||||
if (!ver_task)
|
if (!ver_task)
|
||||||
@ -236,20 +236,20 @@ Task::Ptr EnsureMetadataTask::modrinthVersionsTask()
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
auto entries = Json::requireObject(doc);
|
auto entries = Json::requireObject(doc);
|
||||||
for (auto& hash : m_mods.keys()) {
|
for (auto& hash : m_resources.keys()) {
|
||||||
auto mod = m_mods.find(hash).value();
|
auto resource = m_resources.find(hash).value();
|
||||||
try {
|
try {
|
||||||
auto entry = Json::requireObject(entries, hash);
|
auto entry = Json::requireObject(entries, hash);
|
||||||
|
|
||||||
setStatus(tr("Parsing API response from Modrinth for '%1'...").arg(mod->name()));
|
setStatus(tr("Parsing API response from Modrinth for '%1'...").arg(resource->name()));
|
||||||
qDebug() << "Getting version for" << mod->name() << "from Modrinth";
|
qDebug() << "Getting version for" << resource->name() << "from Modrinth";
|
||||||
|
|
||||||
m_temp_versions.insert(hash, Modrinth::loadIndexedPackVersion(entry));
|
m_temp_versions.insert(hash, Modrinth::loadIndexedPackVersion(entry));
|
||||||
} catch (Json::JsonException& e) {
|
} catch (Json::JsonException& e) {
|
||||||
qDebug() << e.cause();
|
qDebug() << e.cause();
|
||||||
qDebug() << entries;
|
qDebug() << entries;
|
||||||
|
|
||||||
emitFail(mod);
|
emitFail(resource);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Json::JsonException& e) {
|
} catch (Json::JsonException& e) {
|
||||||
@ -321,23 +321,23 @@ Task::Ptr EnsureMetadataTask::modrinthProjectsTask()
|
|||||||
|
|
||||||
auto hash = addonIds.find(pack.addonId.toString()).value();
|
auto hash = addonIds.find(pack.addonId.toString()).value();
|
||||||
|
|
||||||
auto mod_iter = m_mods.find(hash);
|
auto resource_iter = m_resources.find(hash);
|
||||||
if (mod_iter == m_mods.end()) {
|
if (resource_iter == m_resources.end()) {
|
||||||
qWarning() << "Invalid project id from the API response.";
|
qWarning() << "Invalid project id from the API response.";
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto* mod = mod_iter.value();
|
auto* resource = resource_iter.value();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
setStatus(tr("Parsing API response from Modrinth for '%1'...").arg(mod->name()));
|
setStatus(tr("Parsing API response from Modrinth for '%1'...").arg(resource->name()));
|
||||||
|
|
||||||
modrinthCallback(pack, m_temp_versions.find(hash).value(), mod);
|
modrinthCallback(pack, m_temp_versions.find(hash).value(), resource);
|
||||||
} catch (Json::JsonException& e) {
|
} catch (Json::JsonException& e) {
|
||||||
qDebug() << e.cause();
|
qDebug() << e.cause();
|
||||||
qDebug() << entries;
|
qDebug() << entries;
|
||||||
|
|
||||||
emitFail(mod);
|
emitFail(resource);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -351,7 +351,7 @@ Task::Ptr EnsureMetadataTask::flameVersionsTask()
|
|||||||
auto response = std::make_shared<QByteArray>();
|
auto response = std::make_shared<QByteArray>();
|
||||||
|
|
||||||
QList<uint> fingerprints;
|
QList<uint> fingerprints;
|
||||||
for (auto& murmur : m_mods.keys()) {
|
for (auto& murmur : m_resources.keys()) {
|
||||||
fingerprints.push_back(murmur.toUInt());
|
fingerprints.push_back(murmur.toUInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -391,13 +391,13 @@ Task::Ptr EnsureMetadataTask::flameVersionsTask()
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto fingerprint = QString::number(Json::ensureVariant(file_obj, "fileFingerprint").toUInt());
|
auto fingerprint = QString::number(Json::ensureVariant(file_obj, "fileFingerprint").toUInt());
|
||||||
auto mod = m_mods.find(fingerprint);
|
auto resource = m_resources.find(fingerprint);
|
||||||
if (mod == m_mods.end()) {
|
if (resource == m_resources.end()) {
|
||||||
qWarning() << "Invalid fingerprint from the API response.";
|
qWarning() << "Invalid fingerprint from the API response.";
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
setStatus(tr("Parsing API response from CurseForge for '%1'...").arg((*mod)->name()));
|
setStatus(tr("Parsing API response from CurseForge for '%1'...").arg((*resource)->name()));
|
||||||
|
|
||||||
m_temp_versions.insert(fingerprint, FlameMod::loadIndexedPackVersion(file_obj));
|
m_temp_versions.insert(fingerprint, FlameMod::loadIndexedPackVersion(file_obj));
|
||||||
}
|
}
|
||||||
@ -414,7 +414,7 @@ Task::Ptr EnsureMetadataTask::flameVersionsTask()
|
|||||||
Task::Ptr EnsureMetadataTask::flameProjectsTask()
|
Task::Ptr EnsureMetadataTask::flameProjectsTask()
|
||||||
{
|
{
|
||||||
QHash<QString, QString> addonIds;
|
QHash<QString, QString> addonIds;
|
||||||
for (auto const& hash : m_mods.keys()) {
|
for (auto const& hash : m_resources.keys()) {
|
||||||
if (m_temp_versions.contains(hash)) {
|
if (m_temp_versions.contains(hash)) {
|
||||||
auto data = m_temp_versions.find(hash).value();
|
auto data = m_temp_versions.find(hash).value();
|
||||||
|
|
||||||
@ -461,20 +461,20 @@ Task::Ptr EnsureMetadataTask::flameProjectsTask()
|
|||||||
|
|
||||||
auto id = QString::number(Json::requireInteger(entry_obj, "id"));
|
auto id = QString::number(Json::requireInteger(entry_obj, "id"));
|
||||||
auto hash = addonIds.find(id).value();
|
auto hash = addonIds.find(id).value();
|
||||||
auto mod = m_mods.find(hash).value();
|
auto resource = m_resources.find(hash).value();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
setStatus(tr("Parsing API response from CurseForge for '%1'...").arg(mod->name()));
|
setStatus(tr("Parsing API response from CurseForge for '%1'...").arg(resource->name()));
|
||||||
|
|
||||||
ModPlatform::IndexedPack pack;
|
ModPlatform::IndexedPack pack;
|
||||||
FlameMod::loadIndexedPack(pack, entry_obj);
|
FlameMod::loadIndexedPack(pack, entry_obj);
|
||||||
|
|
||||||
flameCallback(pack, m_temp_versions.find(hash).value(), mod);
|
flameCallback(pack, m_temp_versions.find(hash).value(), resource);
|
||||||
} catch (Json::JsonException& e) {
|
} catch (Json::JsonException& e) {
|
||||||
qDebug() << e.cause();
|
qDebug() << e.cause();
|
||||||
qDebug() << entries;
|
qDebug() << entries;
|
||||||
|
|
||||||
emitFail(mod);
|
emitFail(resource);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Json::JsonException& e) {
|
} catch (Json::JsonException& e) {
|
||||||
@ -486,17 +486,17 @@ Task::Ptr EnsureMetadataTask::flameProjectsTask()
|
|||||||
return proj_task;
|
return proj_task;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnsureMetadataTask::modrinthCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Mod* mod)
|
void EnsureMetadataTask::modrinthCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Resource* resource)
|
||||||
{
|
{
|
||||||
// Prevent file name mismatch
|
// Prevent file name mismatch
|
||||||
ver.fileName = mod->fileinfo().fileName();
|
ver.fileName = resource->fileinfo().fileName();
|
||||||
if (ver.fileName.endsWith(".disabled"))
|
if (ver.fileName.endsWith(".disabled"))
|
||||||
ver.fileName.chop(9);
|
ver.fileName.chop(9);
|
||||||
|
|
||||||
QDir tmp_index_dir(m_index_dir);
|
QDir tmp_index_dir(m_index_dir);
|
||||||
|
|
||||||
{
|
{
|
||||||
LocalModUpdateTask update_metadata(m_index_dir, pack, ver);
|
LocalResourceUpdateTask update_metadata(m_index_dir, pack, ver);
|
||||||
QEventLoop loop;
|
QEventLoop loop;
|
||||||
|
|
||||||
QObject::connect(&update_metadata, &Task::finished, &loop, &QEventLoop::quit);
|
QObject::connect(&update_metadata, &Task::finished, &loop, &QEventLoop::quit);
|
||||||
@ -510,27 +510,27 @@ void EnsureMetadataTask::modrinthCallback(ModPlatform::IndexedPack& pack, ModPla
|
|||||||
auto metadata = Metadata::get(tmp_index_dir, pack.slug);
|
auto metadata = Metadata::get(tmp_index_dir, pack.slug);
|
||||||
if (!metadata.isValid()) {
|
if (!metadata.isValid()) {
|
||||||
qCritical() << "Failed to generate metadata at last step!";
|
qCritical() << "Failed to generate metadata at last step!";
|
||||||
emitFail(mod);
|
emitFail(resource);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mod->setMetadata(metadata);
|
resource->setMetadata(metadata);
|
||||||
|
|
||||||
emitReady(mod);
|
emitReady(resource);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnsureMetadataTask::flameCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Mod* mod)
|
void EnsureMetadataTask::flameCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Resource* resource)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
// Prevent file name mismatch
|
// Prevent file name mismatch
|
||||||
ver.fileName = mod->fileinfo().fileName();
|
ver.fileName = resource->fileinfo().fileName();
|
||||||
if (ver.fileName.endsWith(".disabled"))
|
if (ver.fileName.endsWith(".disabled"))
|
||||||
ver.fileName.chop(9);
|
ver.fileName.chop(9);
|
||||||
|
|
||||||
QDir tmp_index_dir(m_index_dir);
|
QDir tmp_index_dir(m_index_dir);
|
||||||
|
|
||||||
{
|
{
|
||||||
LocalModUpdateTask update_metadata(m_index_dir, pack, ver);
|
LocalResourceUpdateTask update_metadata(m_index_dir, pack, ver);
|
||||||
QEventLoop loop;
|
QEventLoop loop;
|
||||||
|
|
||||||
QObject::connect(&update_metadata, &Task::finished, &loop, &QEventLoop::quit);
|
QObject::connect(&update_metadata, &Task::finished, &loop, &QEventLoop::quit);
|
||||||
@ -544,16 +544,16 @@ void EnsureMetadataTask::flameCallback(ModPlatform::IndexedPack& pack, ModPlatfo
|
|||||||
auto metadata = Metadata::get(tmp_index_dir, pack.slug);
|
auto metadata = Metadata::get(tmp_index_dir, pack.slug);
|
||||||
if (!metadata.isValid()) {
|
if (!metadata.isValid()) {
|
||||||
qCritical() << "Failed to generate metadata at last step!";
|
qCritical() << "Failed to generate metadata at last step!";
|
||||||
emitFail(mod);
|
emitFail(resource);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mod->setMetadata(metadata);
|
resource->setMetadata(metadata);
|
||||||
|
|
||||||
emitReady(mod);
|
emitReady(resource);
|
||||||
} catch (Json::JsonException& e) {
|
} catch (Json::JsonException& e) {
|
||||||
qDebug() << e.cause();
|
qDebug() << e.cause();
|
||||||
|
|
||||||
emitFail(mod);
|
emitFail(resource);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include "modplatform/helpers/HashUtils.h"
|
#include "modplatform/helpers/HashUtils.h"
|
||||||
|
|
||||||
|
#include "minecraft/mod/Resource.h"
|
||||||
#include "tasks/ConcurrentTask.h"
|
#include "tasks/ConcurrentTask.h"
|
||||||
|
|
||||||
class Mod;
|
class Mod;
|
||||||
@ -14,8 +15,8 @@ class EnsureMetadataTask : public Task {
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
EnsureMetadataTask(Mod*, QDir, ModPlatform::ResourceProvider = ModPlatform::ResourceProvider::MODRINTH);
|
EnsureMetadataTask(Resource*, QDir, ModPlatform::ResourceProvider = ModPlatform::ResourceProvider::MODRINTH);
|
||||||
EnsureMetadataTask(QList<Mod*>&, QDir, ModPlatform::ResourceProvider = ModPlatform::ResourceProvider::MODRINTH);
|
EnsureMetadataTask(QList<Resource*>&, QDir, ModPlatform::ResourceProvider = ModPlatform::ResourceProvider::MODRINTH);
|
||||||
|
|
||||||
~EnsureMetadataTask() = default;
|
~EnsureMetadataTask() = default;
|
||||||
|
|
||||||
@ -36,23 +37,23 @@ class EnsureMetadataTask : public Task {
|
|||||||
|
|
||||||
// Helpers
|
// Helpers
|
||||||
enum class RemoveFromList { Yes, No };
|
enum class RemoveFromList { Yes, No };
|
||||||
void emitReady(Mod*, QString key = {}, RemoveFromList = RemoveFromList::Yes);
|
void emitReady(Resource*, QString key = {}, RemoveFromList = RemoveFromList::Yes);
|
||||||
void emitFail(Mod*, QString key = {}, RemoveFromList = RemoveFromList::Yes);
|
void emitFail(Resource*, QString key = {}, RemoveFromList = RemoveFromList::Yes);
|
||||||
|
|
||||||
// Hashes and stuff
|
// Hashes and stuff
|
||||||
auto createNewHash(Mod*) -> Hashing::Hasher::Ptr;
|
auto createNewHash(Resource*) -> Hashing::Hasher::Ptr;
|
||||||
auto getExistingHash(Mod*) -> QString;
|
auto getExistingHash(Resource*) -> QString;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void modrinthCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Mod*);
|
void modrinthCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Resource*);
|
||||||
void flameCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Mod*);
|
void flameCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Resource*);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void metadataReady(Mod*);
|
void metadataReady(Resource*);
|
||||||
void metadataFailed(Mod*);
|
void metadataFailed(Resource*);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QHash<QString, Mod*> m_mods;
|
QHash<QString, Resource*> m_resources;
|
||||||
QDir m_index_dir;
|
QDir m_index_dir;
|
||||||
ModPlatform::ResourceProvider m_provider;
|
ModPlatform::ResourceProvider m_provider;
|
||||||
|
|
||||||
|
@ -48,6 +48,7 @@
|
|||||||
|
|
||||||
#include "minecraft/MinecraftInstance.h"
|
#include "minecraft/MinecraftInstance.h"
|
||||||
|
|
||||||
|
#include "Application.h"
|
||||||
#include "ui/dialogs/ResourceDownloadDialog.h"
|
#include "ui/dialogs/ResourceDownloadDialog.h"
|
||||||
#include "ui/pages/modplatform/ResourceModel.h"
|
#include "ui/pages/modplatform/ResourceModel.h"
|
||||||
#include "ui/widgets/ProjectItem.h"
|
#include "ui/widgets/ProjectItem.h"
|
||||||
@ -332,7 +333,8 @@ void ResourcePage::addResourceToPage(ModPlatform::IndexedPack::Ptr pack,
|
|||||||
ModPlatform::IndexedVersion& ver,
|
ModPlatform::IndexedVersion& ver,
|
||||||
const std::shared_ptr<ResourceFolderModel> base_model)
|
const std::shared_ptr<ResourceFolderModel> base_model)
|
||||||
{
|
{
|
||||||
m_model->addPack(pack, ver, base_model);
|
bool is_indexed = !APPLICATION->settings()->get("ModMetadataDisabled").toBool();
|
||||||
|
m_model->addPack(pack, ver, base_model, is_indexed);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourcePage::removeResourceFromPage(const QString& name)
|
void ResourcePage::removeResourceFromPage(const QString& name)
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
#include "ShaderPackModel.h"
|
#include "ShaderPackModel.h"
|
||||||
|
|
||||||
|
#include "Application.h"
|
||||||
#include "ui/dialogs/ResourceDownloadDialog.h"
|
#include "ui/dialogs/ResourceDownloadDialog.h"
|
||||||
|
|
||||||
#include <QRegularExpression>
|
#include <QRegularExpression>
|
||||||
@ -48,10 +49,11 @@ void ShaderPackResourcePage::addResourceToPage(ModPlatform::IndexedPack::Ptr pac
|
|||||||
ModPlatform::IndexedVersion& version,
|
ModPlatform::IndexedVersion& version,
|
||||||
const std::shared_ptr<ResourceFolderModel> base_model)
|
const std::shared_ptr<ResourceFolderModel> base_model)
|
||||||
{
|
{
|
||||||
|
bool is_indexed = !APPLICATION->settings()->get("ModMetadataDisabled").toBool();
|
||||||
QString custom_target_folder;
|
QString custom_target_folder;
|
||||||
if (version.loaders & ModPlatform::Cauldron)
|
if (version.loaders & ModPlatform::Cauldron)
|
||||||
custom_target_folder = QStringLiteral("resourcepacks");
|
custom_target_folder = QStringLiteral("resourcepacks");
|
||||||
m_model->addPack(pack, version, base_model, false, custom_target_folder);
|
m_model->addPack(pack, version, base_model, is_indexed, custom_target_folder);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ResourceDownload
|
} // namespace ResourceDownload
|
||||||
|
Reference in New Issue
Block a user