aboutsummaryrefslogtreecommitdiff
path: root/launcher/minecraft/mod/tasks
diff options
context:
space:
mode:
authorflow <flowlnlnln@gmail.com>2022-07-18 12:40:25 -0300
committerGitHub <noreply@github.com>2022-07-18 12:40:25 -0300
commitdec81c4f274dd8388d442062cf9fa18600aa850d (patch)
tree11bf89a63035e4bf52b4d875a63cf5872da69bdc /launcher/minecraft/mod/tasks
parent56085310cb066c7b3899684c3e3f39fe9fd311c4 (diff)
parent54b335711acac5e57e94bc9cb81c751c9b2872c5 (diff)
downloadPrismLauncher-dec81c4f274dd8388d442062cf9fa18600aa850d.tar.gz
PrismLauncher-dec81c4f274dd8388d442062cf9fa18600aa850d.tar.bz2
PrismLauncher-dec81c4f274dd8388d442062cf9fa18600aa850d.zip
Merge pull request #588 from flowln/mod_update
Implement mod updater (:sunglasses:)
Diffstat (limited to 'launcher/minecraft/mod/tasks')
-rw-r--r--launcher/minecraft/mod/tasks/LocalModParseTask.cpp9
-rw-r--r--launcher/minecraft/mod/tasks/LocalModUpdateTask.cpp17
-rw-r--r--launcher/minecraft/mod/tasks/LocalModUpdateTask.h3
-rw-r--r--launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp33
-rw-r--r--launcher/minecraft/mod/tasks/ModFolderLoadTask.h2
5 files changed, 42 insertions, 22 deletions
diff --git a/launcher/minecraft/mod/tasks/LocalModParseTask.cpp b/launcher/minecraft/mod/tasks/LocalModParseTask.cpp
index 3354732b..1519f49d 100644
--- a/launcher/minecraft/mod/tasks/LocalModParseTask.cpp
+++ b/launcher/minecraft/mod/tasks/LocalModParseTask.cpp
@@ -4,6 +4,7 @@
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
+#include <QString>
#include <quazip/quazip.h>
#include <quazip/quazipfile.h>
#include <toml.h>
@@ -71,7 +72,13 @@ std::shared_ptr<ModDetails> ReadMCModInfo(QByteArray contents)
if(val.isUndefined()) {
val = jsonDoc.object().value("modListVersion");
}
- int version = val.toDouble();
+
+ int version = Json::ensureInteger(val, -1);
+
+ // Some mods set the number with "", so it's a String instead
+ if (version < 0)
+ version = Json::ensureString(val, "").toInt();
+
if (version != 2)
{
qCritical() << "BAD stuff happened to mod json:";
diff --git a/launcher/minecraft/mod/tasks/LocalModUpdateTask.cpp b/launcher/minecraft/mod/tasks/LocalModUpdateTask.cpp
index 1bdecb8c..4b878918 100644
--- a/launcher/minecraft/mod/tasks/LocalModUpdateTask.cpp
+++ b/launcher/minecraft/mod/tasks/LocalModUpdateTask.cpp
@@ -44,10 +44,21 @@ void LocalModUpdateTask::executeTask()
{
setStatus(tr("Updating index for mod:\n%1").arg(m_mod.name));
- auto pw_mod = Metadata::create(m_index_dir, m_mod, m_mod_version);
- Metadata::update(m_index_dir, pw_mod);
+ auto old_metadata = Metadata::get(m_index_dir, m_mod.addonId);
+ if (old_metadata.isValid()) {
+ emit hasOldMod(old_metadata.name, old_metadata.filename);
+ if (m_mod.slug.isEmpty())
+ m_mod.slug = old_metadata.slug;
+ }
- emitSucceeded();
+ auto pw_mod = Metadata::create(m_index_dir, m_mod, m_mod_version);
+ if (pw_mod.isValid()) {
+ Metadata::update(m_index_dir, pw_mod);
+ emitSucceeded();
+ } else {
+ qCritical() << "Tried to update an invalid mod!";
+ emitFailed(tr("Invalid metadata"));
+ }
}
auto LocalModUpdateTask::abort() -> bool
diff --git a/launcher/minecraft/mod/tasks/LocalModUpdateTask.h b/launcher/minecraft/mod/tasks/LocalModUpdateTask.h
index 2db183e0..1d2f06a6 100644
--- a/launcher/minecraft/mod/tasks/LocalModUpdateTask.h
+++ b/launcher/minecraft/mod/tasks/LocalModUpdateTask.h
@@ -37,6 +37,9 @@ class LocalModUpdateTask : public Task {
//! Entry point for tasks.
void executeTask() override;
+ signals:
+ void hasOldMod(QString name, QString filename);
+
private:
QDir m_index_dir;
ModPlatform::IndexedPack& m_mod;
diff --git a/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp b/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp
index 276414e4..a2e055ba 100644
--- a/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp
+++ b/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp
@@ -36,7 +36,6 @@
#include "ModFolderLoadTask.h"
-#include "Application.h"
#include "minecraft/mod/MetadataHandler.h"
ModFolderLoadTask::ModFolderLoadTask(QDir& mods_dir, QDir& index_dir, bool is_indexed)
@@ -53,33 +52,33 @@ void ModFolderLoadTask::run()
// Read JAR files that don't have metadata
m_mods_dir.refresh();
for (auto entry : m_mods_dir.entryInfoList()) {
- Mod mod(entry);
+ Mod::Ptr mod(new Mod(entry));
- if (mod.enabled()) {
- if (m_result->mods.contains(mod.internal_id())) {
- m_result->mods[mod.internal_id()].setStatus(ModStatus::Installed);
+ if (mod->enabled()) {
+ if (m_result->mods.contains(mod->internal_id())) {
+ m_result->mods[mod->internal_id()]->setStatus(ModStatus::Installed);
}
else {
- m_result->mods[mod.internal_id()] = mod;
- m_result->mods[mod.internal_id()].setStatus(ModStatus::NoMetadata);
+ m_result->mods[mod->internal_id()] = mod;
+ m_result->mods[mod->internal_id()]->setStatus(ModStatus::NoMetadata);
}
}
else {
- QString chopped_id = mod.internal_id().chopped(9);
+ QString chopped_id = mod->internal_id().chopped(9);
if (m_result->mods.contains(chopped_id)) {
- m_result->mods[mod.internal_id()] = mod;
+ m_result->mods[mod->internal_id()] = mod;
- auto metadata = m_result->mods[chopped_id].metadata();
+ auto metadata = m_result->mods[chopped_id]->metadata();
if (metadata) {
- mod.setMetadata(new Metadata::ModStruct(*metadata));
+ mod->setMetadata(*metadata);
- m_result->mods[mod.internal_id()].setStatus(ModStatus::Installed);
+ m_result->mods[mod->internal_id()]->setStatus(ModStatus::Installed);
m_result->mods.remove(chopped_id);
}
}
else {
- m_result->mods[mod.internal_id()] = mod;
- m_result->mods[mod.internal_id()].setStatus(ModStatus::NoMetadata);
+ m_result->mods[mod->internal_id()] = mod;
+ m_result->mods[mod->internal_id()]->setStatus(ModStatus::NoMetadata);
}
}
}
@@ -97,8 +96,8 @@ void ModFolderLoadTask::getFromMetadata()
return;
}
- Mod mod(m_mods_dir, metadata);
- mod.setStatus(ModStatus::NotInstalled);
- m_result->mods[mod.internal_id()] = mod;
+ auto* mod = new Mod(m_mods_dir, metadata);
+ mod->setStatus(ModStatus::NotInstalled);
+ m_result->mods[mod->internal_id()] = mod;
}
}
diff --git a/launcher/minecraft/mod/tasks/ModFolderLoadTask.h b/launcher/minecraft/mod/tasks/ModFolderLoadTask.h
index 088f873e..0b6bb6cc 100644
--- a/launcher/minecraft/mod/tasks/ModFolderLoadTask.h
+++ b/launcher/minecraft/mod/tasks/ModFolderLoadTask.h
@@ -48,7 +48,7 @@ class ModFolderLoadTask : public QObject, public QRunnable
Q_OBJECT
public:
struct Result {
- QMap<QString, Mod> mods;
+ QMap<QString, Mod::Ptr> mods;
};
using ResultPtr = std::shared_ptr<Result>;
ResultPtr result() const {