aboutsummaryrefslogtreecommitdiff
path: root/launcher/modplatform
diff options
context:
space:
mode:
authorTrial97 <alexandru.tripon97@gmail.com>2023-06-24 01:05:49 +0300
committerTrial97 <alexandru.tripon97@gmail.com>2023-06-24 01:05:49 +0300
commitcf94adb363c1ae791ebd6f0149899f63c78bfb1b (patch)
tree806dd1121012566c4ff4e90fc520901102d827f4 /launcher/modplatform
parent31aaa6d1da65b5dbe57a44e5c5fd5ea2e104c235 (diff)
downloadPrismLauncher-cf94adb363c1ae791ebd6f0149899f63c78bfb1b.tar.gz
PrismLauncher-cf94adb363c1ae791ebd6f0149899f63c78bfb1b.tar.bz2
PrismLauncher-cf94adb363c1ae791ebd6f0149899f63c78bfb1b.zip
Added some warnings
Signed-off-by: Trial97 <alexandru.tripon97@gmail.com>
Diffstat (limited to 'launcher/modplatform')
-rw-r--r--launcher/modplatform/ModIndex.cpp9
-rw-r--r--launcher/modplatform/ModIndex.h1
-rw-r--r--launcher/modplatform/flame/FlamePackExportTask.cpp124
-rw-r--r--launcher/modplatform/flame/FlamePackExportTask.h7
-rw-r--r--launcher/modplatform/helpers/ExportModsToStringTask.cpp22
5 files changed, 129 insertions, 34 deletions
diff --git a/launcher/modplatform/ModIndex.cpp b/launcher/modplatform/ModIndex.cpp
index 6a507caf..c68333c5 100644
--- a/launcher/modplatform/ModIndex.cpp
+++ b/launcher/modplatform/ModIndex.cpp
@@ -70,11 +70,18 @@ auto ProviderCapabilities::hash(ResourceProvider p, QIODevice* device, QString t
}
QCryptographicHash hash(algo);
- if(!hash.addData(device))
+ if (!hash.addData(device))
qCritical() << "Failed to read JAR to create hash!";
Q_ASSERT(hash.result().length() == hash.hashLength(algo));
return { hash.result().toHex() };
}
+QString getMetaURL(ResourceProvider provider, QString slug)
+{
+ return ((provider == ModPlatform::ResourceProvider::FLAME) ? "https://www.curseforge.com/minecraft/mc-mods/"
+ : "https://modrinth.com/mod/") +
+ slug.remove(".pw.toml");
+}
+
} // namespace ModPlatform
diff --git a/launcher/modplatform/ModIndex.h b/launcher/modplatform/ModIndex.h
index 82da2ab2..7d8199b3 100644
--- a/launcher/modplatform/ModIndex.h
+++ b/launcher/modplatform/ModIndex.h
@@ -118,6 +118,7 @@ struct IndexedPack {
return std::any_of(versions.constBegin(), versions.constEnd(), [](auto const& v) { return v.is_currently_selected; });
}
};
+QString getMetaURL(ResourceProvider provider, QString slug);
} // namespace ModPlatform
diff --git a/launcher/modplatform/flame/FlamePackExportTask.cpp b/launcher/modplatform/flame/FlamePackExportTask.cpp
index 880d4324..2f1201e1 100644
--- a/launcher/modplatform/flame/FlamePackExportTask.cpp
+++ b/launcher/modplatform/flame/FlamePackExportTask.cpp
@@ -24,13 +24,14 @@
#include <QFileInfo>
#include <QMessageBox>
#include <QtConcurrentRun>
+#include <algorithm>
#include <memory>
#include "Json.h"
#include "MMCZip.h"
#include "minecraft/PackProfile.h"
#include "minecraft/mod/ModFolderModel.h"
#include "modplatform/ModIndex.h"
-#include "modplatform/helpers/ExportModsToStringTask.h"
+#include "modplatform/flame/FlameModIndex.h"
#include "modplatform/helpers/HashUtils.h"
#include "tasks/Task.h"
@@ -40,6 +41,7 @@ FlamePackExportTask::FlamePackExportTask(const QString& name,
const QString& version,
const QString& author,
const QVariant& projectID,
+ const bool generateModList,
InstancePtr instance,
const QString& output,
MMCZip::FilterFunction filter)
@@ -52,6 +54,7 @@ FlamePackExportTask::FlamePackExportTask(const QString& name,
, gameRoot(instance->gameRoot())
, output(output)
, filter(filter)
+ , generateModList(generateModList)
{}
void FlamePackExportTask::executeTask()
@@ -116,7 +119,8 @@ void FlamePackExportTask::collectHashes()
}
if (mod->metadata() && mod->metadata()->provider == ModPlatform::ResourceProvider::FLAME) {
resolvedFiles.insert(mod->fileinfo().absoluteFilePath(),
- { mod->metadata()->project_id.toInt(), mod->metadata()->file_id.toInt(), mod->enabled() });
+ { mod->metadata()->project_id.toInt(), mod->metadata()->file_id.toInt(), mod->enabled(),
+ mod->metadata()->name, mod->metadata()->slug, mod->authors().join(", ") });
setProgress(m_progress + 1, mods.count());
continue;
}
@@ -195,10 +199,10 @@ void FlamePackExportTask::makeApiRequest()
}
setStatus(tr("Parsing API response from CurseForge for '%1'...").arg((*mod)->name()));
-
- resolvedFiles.insert(
- mod.value()->fileinfo().absoluteFilePath(),
- { Json::requireInteger(file_obj, "modId"), Json::requireInteger(file_obj, "modId"), mod.value()->enabled() });
+ if (Json::ensureBoolean(file_obj, "isAvailable", false))
+ resolvedFiles.insert(
+ mod.value()->fileinfo().absoluteFilePath(),
+ { Json::requireInteger(file_obj, "modId"), Json::requireInteger(file_obj, "id"), mod.value()->enabled() });
}
} catch (Json::JsonException& e) {
@@ -206,13 +210,94 @@ void FlamePackExportTask::makeApiRequest()
qDebug() << doc;
}
pendingHashes.clear();
- buildZip();
});
-
+ connect(task.get(), &Task::finished, this, &FlamePackExportTask::getProjectsInfo);
connect(task.get(), &NetJob::failed, this, &FlamePackExportTask::emitFailed);
task->start();
}
+void FlamePackExportTask::getProjectsInfo()
+{
+ if (!generateModList) {
+ buildZip();
+ return;
+ }
+ setStatus(tr("Find project info from curseforge..."));
+ QList<QString> addonIds;
+ for (auto resolved : resolvedFiles) {
+ if (resolved.slug.isEmpty()) {
+ addonIds << QString::number(resolved.addonId);
+ }
+ }
+
+ auto response = std::make_shared<QByteArray>();
+ Task::Ptr proj_task;
+
+ if (addonIds.isEmpty()) {
+ buildZip();
+ return;
+ } else if (addonIds.size() == 1) {
+ proj_task = api.getProject(*addonIds.begin(), response);
+ } else {
+ proj_task = api.getProjects(addonIds, response);
+ }
+
+ connect(proj_task.get(), &Task::succeeded, this, [this, response, addonIds] {
+ QJsonParseError parse_error{};
+ auto doc = QJsonDocument::fromJson(*response, &parse_error);
+ if (parse_error.error != QJsonParseError::NoError) {
+ qWarning() << "Error while parsing JSON response from Modrinth projects task at " << parse_error.offset
+ << " reason: " << parse_error.errorString();
+ qWarning() << *response;
+ return;
+ }
+
+ try {
+ QJsonArray entries;
+ if (addonIds.size() == 1)
+ entries = { Json::requireObject(Json::requireObject(doc), "data") };
+ else
+ entries = Json::requireArray(Json::requireObject(doc), "data");
+
+ size_t progress = 0;
+ for (auto entry : entries) {
+ setProgress(progress++, entries.count());
+ auto entry_obj = Json::requireObject(entry);
+
+ try {
+ setStatus(tr("Parsing API response from CurseForge for '%1'...").arg(Json::requireString(entry_obj, "name")));
+
+ ModPlatform::IndexedPack pack;
+ FlameMod::loadIndexedPack(pack, entry_obj);
+ for (auto key : resolvedFiles.keys()) {
+ auto val = resolvedFiles.value(key);
+ if (val.addonId == pack.addonId) {
+ val.name = pack.name;
+ val.slug = pack.slug;
+ QStringList authors;
+ for (auto author : pack.authors)
+ authors << author.name;
+
+ val.authors = authors.join(", ");
+ resolvedFiles[key] = val;
+ }
+ }
+
+ } catch (Json::JsonException& e) {
+ qDebug() << e.cause();
+ qDebug() << entries;
+ }
+ }
+ } catch (Json::JsonException& e) {
+ qDebug() << e.cause();
+ qDebug() << doc;
+ }
+ buildZip();
+ });
+ task.reset(proj_task);
+ task->start();
+}
+
void FlamePackExportTask::buildZip()
{
setStatus(tr("Adding files..."));
@@ -234,14 +319,23 @@ void FlamePackExportTask::buildZip()
}
indexFile.write(generateIndex());
- QuaZipFile modlist(&zip);
- if (!modlist.open(QIODevice::WriteOnly, QuaZipNewInfo("modlist.html"))) {
- QFile::remove(output);
- return BuildZipResult(tr("Could not create index"));
+ if (generateModList) {
+ QuaZipFile modlist(&zip);
+ if (!modlist.open(QIODevice::WriteOnly, QuaZipNewInfo("modlist.html"))) {
+ QFile::remove(output);
+ return BuildZipResult(tr("Could not create index"));
+ }
+ QString content = "";
+ for (auto mod : resolvedFiles) {
+ content += QString(TEMPLATE)
+ .replace("{name}", mod.name)
+ .replace("{url}", ModPlatform::getMetaURL(ModPlatform::ResourceProvider::FLAME, mod.slug))
+ .replace("{authors}", mod.authors) +
+ "\n";
+ }
+ content = "<ul>" + content + "</ul>";
+ modlist.write(content.toUtf8());
}
- QString content = ExportToString::ExportModsToStringTask(mcInstance->loaderModList()->allMods(), TEMPLATE);
- content = "<ul>" + content + "</ul>";
- modlist.write(content.toUtf8());
size_t progress = 0;
for (const QFileInfo& file : files) {
diff --git a/launcher/modplatform/flame/FlamePackExportTask.h b/launcher/modplatform/flame/FlamePackExportTask.h
index f0069678..7f27e0d0 100644
--- a/launcher/modplatform/flame/FlamePackExportTask.h
+++ b/launcher/modplatform/flame/FlamePackExportTask.h
@@ -32,6 +32,7 @@ class FlamePackExportTask : public Task {
const QString& version,
const QString& author,
const QVariant& projectID,
+ const bool generateModList,
InstancePtr instance,
const QString& output,
MMCZip::FilterFunction filter);
@@ -51,12 +52,17 @@ class FlamePackExportTask : public Task {
const QDir gameRoot;
const QString output;
const MMCZip::FilterFunction filter;
+ const bool generateModList;
typedef std::optional<QString> BuildZipResult;
struct ResolvedFile {
int addonId;
int version;
bool enabled;
+
+ QString name;
+ QString slug;
+ QString authors;
};
FlameAPI api;
@@ -71,6 +77,7 @@ class FlamePackExportTask : public Task {
void collectFiles();
void collectHashes();
void makeApiRequest();
+ void getProjectsInfo();
void buildZip();
void finish();
diff --git a/launcher/modplatform/helpers/ExportModsToStringTask.cpp b/launcher/modplatform/helpers/ExportModsToStringTask.cpp
index e7be5ce1..03e1f4ba 100644
--- a/launcher/modplatform/helpers/ExportModsToStringTask.cpp
+++ b/launcher/modplatform/helpers/ExportModsToStringTask.cpp
@@ -19,6 +19,7 @@
#include "modplatform/ModIndex.h"
namespace ExportToString {
+
QString ExportModsToStringTask(QList<Mod*> mods, Formats format, OptionalData extraData)
{
switch (format) {
@@ -28,12 +29,7 @@ QString ExportModsToStringTask(QList<Mod*> mods, Formats format, OptionalData ex
auto meta = mod->metadata();
auto modName = mod->name();
if (extraData & Url) {
- auto url = mod->homeurl();
- if (meta != nullptr) {
- url = (meta->provider == ModPlatform::ResourceProvider::FLAME ? "https://www.curseforge.com/minecraft/mc-mods/"
- : "https://modrinth.com/mod/") +
- meta->slug.remove(".pw.toml");
- }
+ auto url = mod->metaurl();
if (!url.isEmpty())
modName = QString("<a href=\"%1\">%2</a>").arg(url, modName);
}
@@ -57,12 +53,7 @@ QString ExportModsToStringTask(QList<Mod*> mods, Formats format, OptionalData ex
auto meta = mod->metadata();
auto modName = mod->name();
if (extraData & Url) {
- auto url = mod->homeurl();
- if (meta != nullptr) {
- url = (meta->provider == ModPlatform::ResourceProvider::FLAME ? "https://www.curseforge.com/minecraft/mc-mods/"
- : "https://modrinth.com/mod/") +
- meta->slug.remove(".pw.toml");
- }
+ auto url = mod->metaurl();
if (!url.isEmpty())
modName = QString("[%1](%2)").arg(modName, url);
}
@@ -93,12 +84,7 @@ QString ExportModsToStringTask(QList<Mod*> mods, QString lineTemplate)
auto meta = mod->metadata();
auto modName = mod->name();
- auto url = mod->homeurl();
- if (meta != nullptr) {
- url = (meta->provider == ModPlatform::ResourceProvider::FLAME ? "https://www.curseforge.com/minecraft/mc-mods/"
- : "https://modrinth.com/mod/") +
- meta->slug.remove(".pw.toml");
- }
+ auto url = mod->metaurl();
auto ver = mod->version();
if (ver.isEmpty() && meta != nullptr)
ver = meta->version().toString();