aboutsummaryrefslogtreecommitdiff
path: root/launcher/modplatform
diff options
context:
space:
mode:
Diffstat (limited to 'launcher/modplatform')
-rw-r--r--launcher/modplatform/CheckUpdateTask.h6
-rw-r--r--launcher/modplatform/EnsureMetadataTask.cpp80
-rw-r--r--launcher/modplatform/EnsureMetadataTask.h20
-rw-r--r--launcher/modplatform/flame/FlameCheckUpdate.cpp34
-rw-r--r--launcher/modplatform/flame/FlameCheckUpdate.h2
-rw-r--r--launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp34
-rw-r--r--launcher/modplatform/modrinth/ModrinthCheckUpdate.h2
7 files changed, 93 insertions, 85 deletions
diff --git a/launcher/modplatform/CheckUpdateTask.h b/launcher/modplatform/CheckUpdateTask.h
index d96fc340..94ee19b3 100644
--- a/launcher/modplatform/CheckUpdateTask.h
+++ b/launcher/modplatform/CheckUpdateTask.h
@@ -12,7 +12,7 @@ class CheckUpdateTask : public Task {
Q_OBJECT
public:
- CheckUpdateTask(std::list<Mod>& mods, std::list<Version>& mcVersions, ModAPI::ModLoaderTypes loaders, std::shared_ptr<ModFolderModel> mods_folder)
+ CheckUpdateTask(std::list<Mod*>& mods, std::list<Version>& mcVersions, ModAPI::ModLoaderTypes loaders, std::shared_ptr<ModFolderModel> mods_folder)
: Task(nullptr), m_mods(mods), m_game_versions(mcVersions), m_loaders(loaders), m_mods_folder(mods_folder) {};
struct UpdatableMod {
@@ -39,10 +39,10 @@ class CheckUpdateTask : public Task {
void executeTask() override = 0;
signals:
- void checkFailed(Mod failed, QString reason, QUrl recover_url = {});
+ void checkFailed(Mod* failed, QString reason, QUrl recover_url = {});
protected:
- std::list<Mod>& m_mods;
+ std::list<Mod*>& m_mods;
std::list<Version>& m_game_versions;
ModAPI::ModLoaderTypes m_loaders;
std::shared_ptr<ModFolderModel> m_mods_folder;
diff --git a/launcher/modplatform/EnsureMetadataTask.cpp b/launcher/modplatform/EnsureMetadataTask.cpp
index 19e44ce0..7c153511 100644
--- a/launcher/modplatform/EnsureMetadataTask.cpp
+++ b/launcher/modplatform/EnsureMetadataTask.cpp
@@ -19,7 +19,7 @@ static ModPlatform::ProviderCapabilities ProviderCaps;
static ModrinthAPI modrinth_api;
static FlameAPI flame_api;
-EnsureMetadataTask::EnsureMetadataTask(Mod& mod, QDir dir, ModPlatform::Provider prov) : Task(nullptr), m_index_dir(dir), m_provider(prov)
+EnsureMetadataTask::EnsureMetadataTask(Mod* mod, QDir dir, ModPlatform::Provider prov) : Task(nullptr), m_index_dir(dir), m_provider(prov)
{
auto hash = getHash(mod);
if (hash.isEmpty())
@@ -28,11 +28,11 @@ EnsureMetadataTask::EnsureMetadataTask(Mod& mod, QDir dir, ModPlatform::Provider
m_mods.insert(hash, mod);
}
-EnsureMetadataTask::EnsureMetadataTask(std::list<Mod>& mods, QDir dir, ModPlatform::Provider prov)
+EnsureMetadataTask::EnsureMetadataTask(std::list<Mod*>& mods, QDir dir, ModPlatform::Provider prov)
: Task(nullptr), m_index_dir(dir), m_provider(prov)
{
- for (auto& mod : mods) {
- if (!mod.valid()) {
+ for (auto* mod : mods) {
+ if (!mod->valid()) {
emitFail(mod);
continue;
}
@@ -47,14 +47,14 @@ EnsureMetadataTask::EnsureMetadataTask(std::list<Mod>& mods, QDir dir, ModPlatfo
}
}
-QString EnsureMetadataTask::getHash(Mod& mod)
+QString EnsureMetadataTask::getHash(Mod* mod)
{
/* Here we create a mapping hash -> mod, because we need that relationship to parse the API routes */
QByteArray jar_data;
try {
- jar_data = FS::read(mod.fileinfo().absoluteFilePath());
+ jar_data = FS::read(mod->fileinfo().absoluteFilePath());
} catch (FS::FileSystemException& e) {
- qCritical() << QString("Failed to open / read JAR file of %1").arg(mod.name());
+ qCritical() << QString("Failed to open / read JAR file of %1").arg(mod->name());
qCritical() << QString("Reason: ") << e.cause();
return {};
@@ -95,19 +95,19 @@ void EnsureMetadataTask::executeTask()
{
setStatus(tr("Checking if mods have metadata..."));
- for (auto mod : m_mods) {
- if (!mod.valid())
+ for (auto* mod : m_mods) {
+ if (!mod->valid())
continue;
// They already have the right metadata :o
- if (mod.status() != ModStatus::NoMetadata && mod.metadata() && mod.metadata()->provider == m_provider) {
- qDebug() << "Mod" << mod.name() << "already has metadata!";
+ if (mod->status() != ModStatus::NoMetadata && mod->metadata() && mod->metadata()->provider == m_provider) {
+ qDebug() << "Mod" << mod->name() << "already has metadata!";
emitReady(mod);
return;
}
// Folders don't have metadata
- if (mod.type() == Mod::MOD_FOLDER) {
+ if (mod->type() == Mod::MOD_FOLDER) {
emitReady(mod);
return;
}
@@ -125,7 +125,7 @@ void EnsureMetadataTask::executeTask()
}
auto invalidade_leftover = [this] {
- QMutableHashIterator<QString, Mod> mods_iter(m_mods);
+ QMutableHashIterator<QString, Mod*> mods_iter(m_mods);
while (mods_iter.hasNext()) {
auto mod = mods_iter.next();
emitFail(mod.value());
@@ -170,23 +170,23 @@ void EnsureMetadataTask::executeTask()
setStatus(tr("Requesting metadata information from %1...").arg(ProviderCaps.readableName(m_provider)));
else if (!m_mods.empty())
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_mods.begin().value()->name()));
m_current_task = version_task.get();
version_task->start();
}
-void EnsureMetadataTask::emitReady(Mod& m)
+void EnsureMetadataTask::emitReady(Mod* m)
{
- qDebug() << QString("Generated metadata for %1").arg(m.name());
+ qDebug() << QString("Generated metadata for %1").arg(m->name());
emit metadataReady(m);
m_mods.remove(getHash(m));
}
-void EnsureMetadataTask::emitFail(Mod& m)
+void EnsureMetadataTask::emitFail(Mod* m)
{
- qDebug() << QString("Failed to generate metadata for %1").arg(m.name());
+ qDebug() << QString("Failed to generate metadata for %1").arg(m->name());
emit metadataFailed(m);
m_mods.remove(getHash(m));
@@ -224,8 +224,8 @@ NetJob::Ptr EnsureMetadataTask::modrinthVersionsTask()
try {
auto entry = Json::requireObject(entries, hash);
- setStatus(tr("Parsing API response from Modrinth for '%1'...").arg(mod.name()));
- qDebug() << "Getting version for" << mod.name() << "from Modrinth";
+ setStatus(tr("Parsing API response from Modrinth for '%1'...").arg(mod->name()));
+ qDebug() << "Getting version for" << mod->name() << "from Modrinth";
m_temp_versions.insert(hash, Modrinth::loadIndexedPackVersion(entry));
} catch (Json::JsonException& e) {
@@ -284,17 +284,22 @@ NetJob::Ptr EnsureMetadataTask::modrinthProjectsTask()
for (auto entry : entries) {
auto entry_obj = Json::requireObject(entry);
- auto entry_id = Json::requireString(entry_obj, "id");
- auto hash = addonIds.find(entry_id).value();
+ ModPlatform::IndexedPack pack;
+ Modrinth::loadIndexedPack(pack, entry_obj);
- auto mod = m_mods.find(hash).value();
+ auto hash = addonIds.find(pack.addonId.toString()).value();
- try {
- setStatus(tr("Parsing API response from Modrinth for '%1'...").arg(mod.name()));
+ auto mod_iter = m_mods.find(hash);
+ if (mod_iter == m_mods.end()) {
+ qWarning() << "Invalid project id from the API response.";
+ continue;
+ }
- ModPlatform::IndexedPack pack;
- Modrinth::loadIndexedPack(pack, entry_obj);
+ auto* mod = mod_iter.value();
+
+ try {
+ setStatus(tr("Parsing API response from Modrinth for '%1'...").arg(mod->name()));
modrinthCallback(pack, m_temp_versions.find(hash).value(), mod);
} catch (Json::JsonException& e) {
@@ -365,7 +370,7 @@ NetJob::Ptr EnsureMetadataTask::flameVersionsTask()
continue;
}
- setStatus(tr("Parsing API response from CurseForge for '%1'...").arg(mod->name()));
+ setStatus(tr("Parsing API response from CurseForge for '%1'...").arg((*mod)->name()));
m_temp_versions.insert(fingerprint, FlameMod::loadIndexedPackVersion(file_obj));
}
@@ -385,7 +390,10 @@ NetJob::Ptr EnsureMetadataTask::flameProjectsTask()
for (auto const& hash : m_mods.keys()) {
if (m_temp_versions.contains(hash)) {
auto const& data = m_temp_versions.find(hash).value();
- addonIds.insert(data.addonId.toString(), hash);
+
+ auto id_str = data.addonId.toString();
+ if (!id_str.isEmpty())
+ addonIds.insert(data.addonId.toString(), hash);
}
}
@@ -429,7 +437,7 @@ NetJob::Ptr EnsureMetadataTask::flameProjectsTask()
auto mod = m_mods.find(hash).value();
try {
- setStatus(tr("Parsing API response from CurseForge for '%1'...").arg(mod.name()));
+ setStatus(tr("Parsing API response from CurseForge for '%1'...").arg(mod->name()));
ModPlatform::IndexedPack pack;
FlameMod::loadIndexedPack(pack, entry_obj);
@@ -451,10 +459,10 @@ NetJob::Ptr EnsureMetadataTask::flameProjectsTask()
return proj_task;
}
-void EnsureMetadataTask::modrinthCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Mod& mod)
+void EnsureMetadataTask::modrinthCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Mod* mod)
{
// Prevent file name mismatch
- ver.fileName = mod.fileinfo().fileName();
+ ver.fileName = mod->fileinfo().fileName();
if (ver.fileName.endsWith(".disabled"))
ver.fileName.chop(9);
@@ -479,16 +487,16 @@ void EnsureMetadataTask::modrinthCallback(ModPlatform::IndexedPack& pack, ModPla
return;
}
- mod.setMetadata(metadata);
+ mod->setMetadata(metadata);
emitReady(mod);
}
-void EnsureMetadataTask::flameCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Mod& mod)
+void EnsureMetadataTask::flameCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Mod* mod)
{
try {
// Prevent file name mismatch
- ver.fileName = mod.fileinfo().fileName();
+ ver.fileName = mod->fileinfo().fileName();
if (ver.fileName.endsWith(".disabled"))
ver.fileName.chop(9);
@@ -513,7 +521,7 @@ void EnsureMetadataTask::flameCallback(ModPlatform::IndexedPack& pack, ModPlatfo
return;
}
- mod.setMetadata(metadata);
+ mod->setMetadata(metadata);
emitReady(mod);
} catch (Json::JsonException& e) {
diff --git a/launcher/modplatform/EnsureMetadataTask.h b/launcher/modplatform/EnsureMetadataTask.h
index 880503b9..d40a972e 100644
--- a/launcher/modplatform/EnsureMetadataTask.h
+++ b/launcher/modplatform/EnsureMetadataTask.h
@@ -12,8 +12,8 @@ class EnsureMetadataTask : public Task {
Q_OBJECT
public:
- EnsureMetadataTask(Mod&, QDir, ModPlatform::Provider = ModPlatform::Provider::MODRINTH);
- EnsureMetadataTask(std::list<Mod>&, QDir, ModPlatform::Provider = ModPlatform::Provider::MODRINTH);
+ EnsureMetadataTask(Mod*, QDir, ModPlatform::Provider = ModPlatform::Provider::MODRINTH);
+ EnsureMetadataTask(std::list<Mod*>&, QDir, ModPlatform::Provider = ModPlatform::Provider::MODRINTH);
~EnsureMetadataTask() = default;
@@ -31,21 +31,21 @@ class EnsureMetadataTask : public Task {
auto flameProjectsTask() -> NetJob::Ptr;
// Helpers
- void emitReady(Mod&);
- void emitFail(Mod&);
+ void emitReady(Mod*);
+ void emitFail(Mod*);
- auto getHash(Mod&) -> QString;
+ auto getHash(Mod*) -> QString;
private slots:
- void modrinthCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Mod&);
- void flameCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Mod&);
+ void modrinthCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Mod*);
+ void flameCallback(ModPlatform::IndexedPack& pack, ModPlatform::IndexedVersion& ver, Mod*);
signals:
- void metadataReady(Mod&);
- void metadataFailed(Mod&);
+ void metadataReady(Mod*);
+ void metadataFailed(Mod*);
private:
- QHash<QString, Mod> m_mods;
+ QHash<QString, Mod*> m_mods;
QDir m_index_dir;
ModPlatform::Provider m_provider;
diff --git a/launcher/modplatform/flame/FlameCheckUpdate.cpp b/launcher/modplatform/flame/FlameCheckUpdate.cpp
index be12dee3..68a4589b 100644
--- a/launcher/modplatform/flame/FlameCheckUpdate.cpp
+++ b/launcher/modplatform/flame/FlameCheckUpdate.cpp
@@ -117,16 +117,16 @@ void FlameCheckUpdate::executeTask()
setStatus(tr("Preparing mods for CurseForge..."));
int i = 0;
- for (auto mod : m_mods) {
- if (!mod.enabled()) {
+ for (auto* mod : m_mods) {
+ if (!mod->enabled()) {
emit checkFailed(mod, tr("Disabled mods won't be updated, to prevent mod duplication issues!"));
continue;
}
- setStatus(tr("Getting API response from CurseForge for '%1'").arg(mod.name()));
+ setStatus(tr("Getting API response from CurseForge for '%1'").arg(mod->name()));
setProgress(i++, m_mods.size());
- auto latest_ver = api.getLatestVersion({ mod.metadata()->project_id.toString(), m_game_versions, m_loaders });
+ auto latest_ver = api.getLatestVersion({ mod->metadata()->project_id.toString(), m_game_versions, m_loaders });
// Check if we were aborted while getting the latest version
if (m_was_aborted) {
@@ -134,7 +134,7 @@ void FlameCheckUpdate::executeTask()
return;
}
- setStatus(tr("Parsing the API response from CurseForge for '%1'...").arg(mod.name()));
+ setStatus(tr("Parsing the API response from CurseForge for '%1'...").arg(mod->name()));
if (!latest_ver.addonId.isValid()) {
emit checkFailed(mod, tr("No valid version found for this mod. It's probably unavailable for the current game "
@@ -142,7 +142,7 @@ void FlameCheckUpdate::executeTask()
continue;
}
- if (latest_ver.downloadUrl.isEmpty() && latest_ver.fileId != mod.metadata()->file_id) {
+ if (latest_ver.downloadUrl.isEmpty() && latest_ver.fileId != mod->metadata()->file_id) {
auto pack = getProjectInfo(latest_ver);
auto recover_url = QString("%1/download/%2").arg(pack.websiteUrl, latest_ver.fileId.toString());
emit checkFailed(mod, tr("Mod has a new update available, but is opted-out on CurseForge"), recover_url);
@@ -150,26 +150,26 @@ void FlameCheckUpdate::executeTask()
continue;
}
- if (!latest_ver.hash.isEmpty() && (mod.metadata()->hash != latest_ver.hash || mod.status() == ModStatus::NotInstalled)) {
+ if (!latest_ver.hash.isEmpty() && (mod->metadata()->hash != latest_ver.hash || mod->status() == ModStatus::NotInstalled)) {
// Fake pack with the necessary info to pass to the download task :)
ModPlatform::IndexedPack pack;
- pack.name = mod.name();
- pack.slug = mod.metadata()->slug;
- pack.addonId = mod.metadata()->project_id;
- pack.websiteUrl = mod.homeurl();
- for (auto& author : mod.authors())
+ pack.name = mod->name();
+ pack.slug = mod->metadata()->slug;
+ pack.addonId = mod->metadata()->project_id;
+ pack.websiteUrl = mod->homeurl();
+ for (auto& author : mod->authors())
pack.authors.append({ author });
- pack.description = mod.description();
+ pack.description = mod->description();
pack.provider = ModPlatform::Provider::FLAME;
- auto old_version = mod.version();
- if (old_version.isEmpty() && mod.status() != ModStatus::NotInstalled) {
- auto current_ver = getFileInfo(latest_ver.addonId.toInt(), mod.metadata()->file_id.toInt());
+ auto old_version = mod->version();
+ if (old_version.isEmpty() && mod->status() != ModStatus::NotInstalled) {
+ auto current_ver = getFileInfo(latest_ver.addonId.toInt(), mod->metadata()->file_id.toInt());
old_version = current_ver.version;
}
auto download_task = new ModDownloadTask(pack, latest_ver, m_mods_folder);
- m_updatable.emplace_back(mod.name(), mod.metadata()->hash, old_version, latest_ver.version,
+ m_updatable.emplace_back(pack.name, mod->metadata()->hash, old_version, latest_ver.version,
api.getModFileChangelog(latest_ver.addonId.toInt(), latest_ver.fileId.toInt()),
ModPlatform::Provider::FLAME, download_task);
}
diff --git a/launcher/modplatform/flame/FlameCheckUpdate.h b/launcher/modplatform/flame/FlameCheckUpdate.h
index f068f08f..0891891d 100644
--- a/launcher/modplatform/flame/FlameCheckUpdate.h
+++ b/launcher/modplatform/flame/FlameCheckUpdate.h
@@ -8,7 +8,7 @@ class FlameCheckUpdate : public CheckUpdateTask {
Q_OBJECT
public:
- FlameCheckUpdate(std::list<Mod>& mods, std::list<Version>& mcVersions, ModAPI::ModLoaderTypes loaders, std::shared_ptr<ModFolderModel> mods_folder)
+ FlameCheckUpdate(std::list<Mod*>& mods, std::list<Version>& mcVersions, ModAPI::ModLoaderTypes loaders, std::shared_ptr<ModFolderModel> mods_folder)
: CheckUpdateTask(mods, mcVersions, loaders, mods_folder)
{}
diff --git a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp
index 5d936fec..79d8edf7 100644
--- a/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp
+++ b/launcher/modplatform/modrinth/ModrinthCheckUpdate.cpp
@@ -27,29 +27,29 @@ void ModrinthCheckUpdate::executeTask()
setStatus(tr("Preparing mods for Modrinth..."));
setProgress(0, 3);
- QHash<QString, Mod> mappings;
+ QHash<QString, Mod*> mappings;
// Create all hashes
QStringList hashes;
auto best_hash_type = ProviderCaps.hashType(ModPlatform::Provider::MODRINTH).first();
- for (auto mod : m_mods) {
- if (!mod.enabled()) {
+ for (auto* mod : m_mods) {
+ if (!mod->enabled()) {
emit checkFailed(mod, tr("Disabled mods won't be updated, to prevent mod duplication issues!"));
continue;
}
- auto hash = mod.metadata()->hash;
+ auto hash = mod->metadata()->hash;
// Sadly the API can only handle one hash type per call, se we
// need to generate a new hash if the current one is innadequate
// (though it will rarely happen, if at all)
- if (mod.metadata()->hash_format != best_hash_type) {
+ if (mod->metadata()->hash_format != best_hash_type) {
QByteArray jar_data;
try {
- jar_data = FS::read(mod.fileinfo().absoluteFilePath());
+ jar_data = FS::read(mod->fileinfo().absoluteFilePath());
} catch (FS::FileSystemException& e) {
- qCritical() << QString("Failed to open / read JAR file of %1").arg(mod.name());
+ qCritical() << QString("Failed to open / read JAR file of %1").arg(mod->name());
qCritical() << QString("Reason: ") << e.cause();
failed(e.what());
@@ -90,7 +90,7 @@ void ModrinthCheckUpdate::executeTask()
// If the returned project is empty, but we have Modrinth metadata,
// it means this specific version is not available
if (project_obj.isEmpty()) {
- qDebug() << "Mod " << mappings.find(hash).value().name() << " got an empty response.";
+ qDebug() << "Mod " << mappings.find(hash).value()->name() << " got an empty response.";
qDebug() << "Hash: " << hash;
emit checkFailed(
@@ -134,24 +134,24 @@ void ModrinthCheckUpdate::executeTask()
auto mod = *mod_iter;
auto key = project_ver.hash;
- if ((key != hash && project_ver.is_preferred) || (mod.status() == ModStatus::NotInstalled)) {
- if (mod.version() == project_ver.version_number)
+ if ((key != hash && project_ver.is_preferred) || (mod->status() == ModStatus::NotInstalled)) {
+ if (mod->version() == project_ver.version_number)
continue;
// Fake pack with the necessary info to pass to the download task :)
ModPlatform::IndexedPack pack;
- pack.name = mod.name();
- pack.slug = mod.metadata()->slug;
- pack.addonId = mod.metadata()->project_id;
- pack.websiteUrl = mod.homeurl();
- for (auto& author : mod.authors())
+ pack.name = mod->name();
+ pack.slug = mod->metadata()->slug;
+ pack.addonId = mod->metadata()->project_id;
+ pack.websiteUrl = mod->homeurl();
+ for (auto& author : mod->authors())
pack.authors.append({ author });
- pack.description = mod.description();
+ pack.description = mod->description();
pack.provider = ModPlatform::Provider::MODRINTH;
auto download_task = new ModDownloadTask(pack, project_ver, m_mods_folder);
- m_updatable.emplace_back(mod.name(), hash, mod.version(), project_ver.version_number, project_ver.changelog,
+ m_updatable.emplace_back(pack.name, hash, mod->version(), project_ver.version_number, project_ver.changelog,
ModPlatform::Provider::MODRINTH, download_task);
}
}
diff --git a/launcher/modplatform/modrinth/ModrinthCheckUpdate.h b/launcher/modplatform/modrinth/ModrinthCheckUpdate.h
index 7e685a6d..d61667f5 100644
--- a/launcher/modplatform/modrinth/ModrinthCheckUpdate.h
+++ b/launcher/modplatform/modrinth/ModrinthCheckUpdate.h
@@ -8,7 +8,7 @@ class ModrinthCheckUpdate : public CheckUpdateTask {
Q_OBJECT
public:
- ModrinthCheckUpdate(std::list<Mod>& mods, std::list<Version>& mcVersions, ModAPI::ModLoaderTypes loaders, std::shared_ptr<ModFolderModel> mods_folder)
+ ModrinthCheckUpdate(std::list<Mod*>& mods, std::list<Version>& mcVersions, ModAPI::ModLoaderTypes loaders, std::shared_ptr<ModFolderModel> mods_folder)
: CheckUpdateTask(mods, mcVersions, loaders, mods_folder)
{}