aboutsummaryrefslogtreecommitdiff
path: root/launcher/modplatform
diff options
context:
space:
mode:
authorflow <thiagodonato300@gmail.com>2022-03-07 16:22:57 -0300
committerflow <thiagodonato300@gmail.com>2022-03-07 16:22:57 -0300
commitf714adf6d2cc94f20ba37f2776d0d61e22267f0e (patch)
treea72a3f07b0edc45e8c07f97daa8b2786d7cf3ad3 /launcher/modplatform
parent39bd04f06ff42623f7349096d707c4a877fc7cd7 (diff)
downloadPrismLauncher-f714adf6d2cc94f20ba37f2776d0d61e22267f0e.tar.gz
PrismLauncher-f714adf6d2cc94f20ba37f2776d0d61e22267f0e.tar.bz2
PrismLauncher-f714adf6d2cc94f20ba37f2776d0d61e22267f0e.zip
refactor: move NetJob away from ModModel to ModAPI
This is done so that 1. ModAPI behaves more like an actual API instead of just a helper, and 2. Allows for more easily creating other mod providers that may or may not use network tasks (foreshadowing lol)
Diffstat (limited to 'launcher/modplatform')
-rw-r--r--launcher/modplatform/ModAPI.h35
-rw-r--r--launcher/modplatform/flame/FlameAPI.h93
-rw-r--r--launcher/modplatform/modrinth/ModrinthAPI.h117
3 files changed, 190 insertions, 55 deletions
diff --git a/launcher/modplatform/ModAPI.h b/launcher/modplatform/ModAPI.h
index 4d22a63d..8503d7fc 100644
--- a/launcher/modplatform/ModAPI.h
+++ b/launcher/modplatform/ModAPI.h
@@ -1,21 +1,30 @@
#pragma once
+#include <QJsonDocument>
#include <QString>
+namespace ModPlatform {
+class ListModel;
+}
+
class ModAPI {
- public:
- virtual ~ModAPI() = default;
+ protected:
+ using CallerType = ModPlatform::ListModel;
+
+ public:
+ virtual ~ModAPI() = default;
+
+ // https://docs.curseforge.com/?http#tocS_ModLoaderType
+ enum ModLoaderType { Any = 0, Forge = 1, Cauldron = 2, LiteLoader = 3, Fabric = 4 };
- // https://docs.curseforge.com/?http#tocS_ModLoaderType
- enum ModLoaderType {
- Any = 0,
- Forge = 1,
- Cauldron = 2,
- LiteLoader = 3,
- Fabric = 4
- };
+ struct SearchArgs {
+ int offset;
+ QString search;
+ QString sorting;
+ ModLoaderType mod_loader;
+ QString version;
+ };
- inline virtual QString getModSearchURL(int, QString, QString, ModLoaderType, QString) const { return ""; };
- inline virtual QString getVersionsURL(const QString& addonId) const { return ""; };
- inline virtual QString getAuthorURL(const QString& name) const { return ""; };
+ inline virtual void searchMods(CallerType* caller, SearchArgs&& args) const {};
+ inline virtual void getVersions(CallerType* caller, const QString& addonId, const QString& debugName = "") const {};
};
diff --git a/launcher/modplatform/flame/FlameAPI.h b/launcher/modplatform/flame/FlameAPI.h
index b49aeb24..be88df65 100644
--- a/launcher/modplatform/flame/FlameAPI.h
+++ b/launcher/modplatform/flame/FlameAPI.h
@@ -1,28 +1,93 @@
#pragma once
#include "modplatform/ModAPI.h"
+#include "ui/pages/modplatform/ModModel.h"
+
+#include "Application.h"
+#include "net/NetJob.h"
class FlameAPI : public ModAPI {
public:
-
- inline QString getModSearchURL(int index, QString searchFilter, QString sort, ModLoaderType modLoader, QString version) const override
+ inline void searchMods(CallerType* caller, SearchArgs&& args) const override
{
- return QString("https://addons-ecs.forgesvc.net/api/v2/addon/search?"
- "gameId=432&" "categoryId=0&" "sectionId=6&"
-
- "index=%1&" "pageSize=25&" "searchFilter=%2&"
- "sort=%3&" "modLoaderType=%4&" "gameVersion=%5")
- .arg(index)
- .arg(searchFilter)
- .arg(sort)
- .arg(modLoader)
- .arg(version);
+ auto netJob = new NetJob(QString("Flame::Search"), APPLICATION->network());
+ auto searchUrl = getModSearchURL(args);
+
+ auto response = new QByteArray();
+ netJob->addNetAction(Net::Download::makeByteArray(QUrl(searchUrl), response));
+
+ QObject::connect(netJob, &NetJob::started, caller, [caller, netJob]{ caller->setActiveJob(netJob); });
+ QObject::connect(netJob, &NetJob::failed, caller, &CallerType::searchRequestFailed);
+ QObject::connect(netJob, &NetJob::succeeded, caller, [caller, response] {
+ QJsonParseError parse_error;
+ QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error);
+ if (parse_error.error != QJsonParseError::NoError) {
+ qWarning() << "Error while parsing JSON response from Modrinth at " << parse_error.offset
+ << " reason: " << parse_error.errorString();
+ qWarning() << *response;
+ return;
+ }
+
+ caller->searchRequestFinished(doc);
+ });
+
+ netJob->start();
+ };
+
+ inline void getVersions(CallerType* caller, const QString& addonId, const QString& debugName = "Flame") const override
+ {
+ auto netJob = new NetJob(QString("%1::ModVersions(%2)").arg(debugName).arg(addonId), APPLICATION->network());
+ auto response = new QByteArray();
+
+ netJob->addNetAction(Net::Download::makeByteArray(getVersionsURL(addonId), response));
+
+ QObject::connect(netJob, &NetJob::succeeded, caller, [response, debugName, caller, addonId] {
+ QJsonParseError parse_error;
+ QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error);
+ if (parse_error.error != QJsonParseError::NoError) {
+ qWarning() << "Error while parsing JSON response from " << debugName << " at " << parse_error.offset
+ << " reason: " << parse_error.errorString();
+ qWarning() << *response;
+ return;
+ }
+
+ caller->versionRequestSucceeded(doc, addonId);
+ });
+
+ QObject::connect(netJob, &NetJob::finished, caller, [response, netJob] {
+ netJob->deleteLater();
+ delete response;
+ });
+
+ netJob->start();
+ };
+
+ private:
+ inline QString getModSearchURL(SearchArgs& args) const
+ {
+ return QString(
+ "https://addons-ecs.forgesvc.net/api/v2/addon/search?"
+ "gameId=432&"
+ "categoryId=0&"
+ "sectionId=6&"
+
+ "index=%1&"
+ "pageSize=25&"
+ "searchFilter=%2&"
+ "sort=%3&"
+ "modLoaderType=%4&"
+ "gameVersion=%5")
+ .arg(args.offset)
+ .arg(args.search)
+ .arg(args.sorting)
+ .arg(args.mod_loader)
+ .arg(args.version);
};
- inline QString getVersionsURL(const QString& addonId) const override
+ inline QString getVersionsURL(const QString& addonId) const
{
return QString("https://addons-ecs.forgesvc.net/api/v2/addon/%1/files").arg(addonId);
};
- inline QString getAuthorURL(const QString& name) const override { return ""; };
+ inline QString getAuthorURL(const QString& name) const { return ""; };
};
diff --git a/launcher/modplatform/modrinth/ModrinthAPI.h b/launcher/modplatform/modrinth/ModrinthAPI.h
index 44a362c8..84cc561b 100644
--- a/launcher/modplatform/modrinth/ModrinthAPI.h
+++ b/launcher/modplatform/modrinth/ModrinthAPI.h
@@ -1,50 +1,111 @@
#pragma once
#include "modplatform/ModAPI.h"
+#include "ui/pages/modplatform/ModModel.h"
+
+#include "Application.h"
+#include "net/NetJob.h"
#include <QDebug>
class ModrinthAPI : public ModAPI {
public:
- inline QString getModSearchURL(int offset, QString query, QString sort, ModLoaderType modLoader, QString version) const override
- {
- if(!validateModLoader(modLoader)){
+ inline void searchMods(CallerType* caller, SearchArgs&& args) const override
+ {
+ auto netJob = new NetJob(QString("Modrinth::Search"), APPLICATION->network());
+ auto searchUrl = getModSearchURL(args);
+
+ auto response = new QByteArray();
+ netJob->addNetAction(Net::Download::makeByteArray(QUrl(searchUrl), response));
+
+ QObject::connect(netJob, &NetJob::started, caller, [caller, netJob]{ caller->setActiveJob(netJob); });
+ QObject::connect(netJob, &NetJob::failed, caller, &CallerType::searchRequestFailed);
+ QObject::connect(netJob, &NetJob::succeeded, caller, [caller, response] {
+ QJsonParseError parse_error;
+ QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error);
+ if (parse_error.error != QJsonParseError::NoError) {
+ qWarning() << "Error while parsing JSON response from Modrinth at " << parse_error.offset
+ << " reason: " << parse_error.errorString();
+ qWarning() << *response;
+ return;
+ }
+
+ caller->searchRequestFinished(doc);
+ });
+
+ netJob->start();
+ };
+
+ inline void getVersions(CallerType* caller, const QString& addonId, const QString& debugName = "Modrinth") const override
+ {
+ auto netJob = new NetJob(QString("%1::ModVersions(%2)").arg(debugName).arg(addonId), APPLICATION->network());
+ auto response = new QByteArray();
+
+ netJob->addNetAction(Net::Download::makeByteArray(getVersionsURL(addonId), response));
+
+ QObject::connect(netJob, &NetJob::succeeded, caller, [response, debugName, caller, addonId] {
+ QJsonParseError parse_error;
+ QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error);
+ if (parse_error.error != QJsonParseError::NoError) {
+ qWarning() << "Error while parsing JSON response from " << debugName << " at " << parse_error.offset
+ << " reason: " << parse_error.errorString();
+ qWarning() << *response;
+ return;
+ }
+
+ caller->versionRequestSucceeded(doc, addonId);
+ });
+
+ QObject::connect(netJob, &NetJob::finished, caller, [response, netJob] {
+ netJob->deleteLater();
+ delete response;
+ });
+
+ netJob->start();
+ };
+
+ inline QString getAuthorURL(const QString& name) const { return "https://modrinth.com/user/" + name; };
+
+ private:
+ inline QString getModSearchURL(SearchArgs& args) const
+ {
+ if (!validateModLoader(args.mod_loader)) {
qWarning() << "Modrinth only have Forge and Fabric-compatible mods!";
return "";
}
- return QString("https://api.modrinth.com/v2/search?"
- "offset=%1&" "limit=25&" "query=%2&" "index=%3&"
- "facets=[[\"categories:%4\"],[\"versions:%5\"],[\"project_type:mod\"]]")
- .arg(offset)
- .arg(query)
- .arg(sort)
- .arg(getModLoaderString(modLoader))
- .arg(version);
+ return QString(
+ "https://api.modrinth.com/v2/search?"
+ "offset=%1&"
+ "limit=25&"
+ "query=%2&"
+ "index=%3&"
+ "facets=[[\"categories:%4\"],[\"versions:%5\"],[\"project_type:mod\"]]")
+ .arg(args.offset)
+ .arg(args.search)
+ .arg(args.sorting)
+ .arg(getModLoaderString(args.mod_loader))
+ .arg(args.version);
};
- inline QString getVersionsURL(const QString& addonId) const override
+ inline QString getVersionsURL(const QString& addonId) const
{
return QString("https://api.modrinth.com/v2/project/%1/version").arg(addonId);
};
- inline QString getAuthorURL(const QString& name) const override { return "https://modrinth.com/user/" + name; };
-
- private:
- inline bool validateModLoader(ModLoaderType modLoader) const{
- return modLoader == Any || modLoader == Forge || modLoader == Fabric;
- }
+ inline bool validateModLoader(ModLoaderType modLoader) const { return modLoader == Any || modLoader == Forge || modLoader == Fabric; }
- inline QString getModLoaderString(ModLoaderType modLoader) const{
- switch(modLoader){
- case Any:
- return "fabric, forge";
- case Forge:
- return "forge";
- case Fabric:
- return "fabric";
- default:
- return "";
+ inline QString getModLoaderString(ModLoaderType modLoader) const
+ {
+ switch (modLoader) {
+ case Any:
+ return "fabric, forge";
+ case Forge:
+ return "forge";
+ case Fabric:
+ return "fabric";
+ default:
+ return "";
}
}
};