aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--launcher/CMakeLists.txt1
-rw-r--r--launcher/modplatform/flame/FlameAPI.cpp125
-rw-r--r--launcher/modplatform/flame/FlameAPI.h8
-rw-r--r--launcher/modplatform/flame/FlameModIndex.cpp2
4 files changed, 135 insertions, 1 deletions
diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt
index 085cc211..6dcea8e2 100644
--- a/launcher/CMakeLists.txt
+++ b/launcher/CMakeLists.txt
@@ -483,6 +483,7 @@ set(API_SOURCES
modplatform/ModAPI.h
modplatform/flame/FlameAPI.h
+ modplatform/flame/FlameAPI.cpp
modplatform/modrinth/ModrinthAPI.h
modplatform/modrinth/ModrinthAPI.cpp
modplatform/helpers/NetworkModAPI.h
diff --git a/launcher/modplatform/flame/FlameAPI.cpp b/launcher/modplatform/flame/FlameAPI.cpp
new file mode 100644
index 00000000..983e09fd
--- /dev/null
+++ b/launcher/modplatform/flame/FlameAPI.cpp
@@ -0,0 +1,125 @@
+#include "FlameAPI.h"
+#include "FlameModIndex.h"
+
+#include "Application.h"
+#include "BuildConfig.h"
+#include "Json.h"
+
+#include "net/Upload.h"
+
+auto FlameAPI::matchFingerprints(const std::list<uint>& fingerprints, QByteArray* response) -> NetJob::Ptr
+{
+ auto* netJob = new NetJob(QString("Flame::MatchFingerprints"), APPLICATION->network());
+
+ QJsonObject body_obj;
+ QJsonArray fingerprints_arr;
+ for (auto& fp : fingerprints) {
+ fingerprints_arr.append(QString("%1").arg(fp));
+ }
+
+ body_obj["fingerprints"] = fingerprints_arr;
+
+ QJsonDocument body(body_obj);
+ auto body_raw = body.toJson();
+
+ netJob->addNetAction(Net::Upload::makeByteArray(QString("https://api.curseforge.com/v1/fingerprints"), response, body_raw));
+
+ QObject::connect(netJob, &NetJob::finished, [response] { delete response; });
+
+ return netJob;
+}
+
+auto FlameAPI::getModFileChangelog(int modId, int fileId) -> QString
+{
+ QEventLoop lock;
+ QString changelog;
+
+ auto* netJob = new NetJob(QString("Flame::FileChangelog"), APPLICATION->network());
+ auto* response = new QByteArray();
+ netJob->addNetAction(Net::Download::makeByteArray(
+ QString("https://api.curseforge.com/v1/mods/%1/files/%2/changelog")
+ .arg(QString::fromStdString(std::to_string(modId)), QString::fromStdString(std::to_string(fileId))),
+ response));
+
+ QObject::connect(netJob, &NetJob::succeeded, [netJob, response, &changelog] {
+ QJsonParseError parse_error{};
+ QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error);
+ if (parse_error.error != QJsonParseError::NoError) {
+ qWarning() << "Error while parsing JSON response from Flame::FileChangelog at " << parse_error.offset
+ << " reason: " << parse_error.errorString();
+ qWarning() << *response;
+
+ netJob->failed(parse_error.errorString());
+ return;
+ }
+
+ changelog = Json::ensureString(doc.object(), "data");
+ });
+
+ QObject::connect(netJob, &NetJob::finished, [response, &lock] {
+ delete response;
+ lock.quit();
+ });
+
+ netJob->start();
+ lock.exec();
+
+ return changelog;
+}
+
+auto FlameAPI::getLatestVersion(VersionSearchArgs&& args) -> ModPlatform::IndexedVersion
+{
+ QEventLoop loop;
+
+ auto netJob = new NetJob(QString("Flame::GetLatestVersion(%1)").arg(args.addonId), APPLICATION->network());
+ auto response = new QByteArray();
+ ModPlatform::IndexedVersion ver;
+
+ netJob->addNetAction(Net::Download::makeByteArray(getVersionsURL(args), response));
+
+ QObject::connect(netJob, &NetJob::succeeded, [response, args, &ver] {
+ QJsonParseError parse_error{};
+ QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error);
+ if (parse_error.error != QJsonParseError::NoError) {
+ qWarning() << "Error while parsing JSON response from latest mod version at " << parse_error.offset
+ << " reason: " << parse_error.errorString();
+ qWarning() << *response;
+ return;
+ }
+
+ try {
+ auto obj = Json::requireObject(doc);
+ auto arr = Json::requireArray(obj, "data");
+
+ QJsonObject latest_file_obj;
+ ModPlatform::IndexedVersion ver_tmp;
+
+ for (auto file : arr) {
+ auto file_obj = Json::requireObject(file);
+ auto file_tmp = FlameMod::loadIndexedPackVersion(file_obj);
+ if(file_tmp.date > ver_tmp.date) {
+ ver_tmp = file_tmp;
+ latest_file_obj = file_obj;
+ }
+ }
+
+ ver = FlameMod::loadIndexedPackVersion(latest_file_obj);
+ } catch (Json::JsonException& e) {
+ qCritical() << "Failed to parse response from a version request.";
+ qCritical() << e.what();
+ qDebug() << doc;
+ }
+ });
+
+ QObject::connect(netJob, &NetJob::finished, [response, netJob, &loop] {
+ netJob->deleteLater();
+ delete response;
+ loop.quit();
+ });
+
+ netJob->start();
+
+ loop.exec();
+
+ return ver;
+}
diff --git a/launcher/modplatform/flame/FlameAPI.h b/launcher/modplatform/flame/FlameAPI.h
index aea76ff1..e45b5cb1 100644
--- a/launcher/modplatform/flame/FlameAPI.h
+++ b/launcher/modplatform/flame/FlameAPI.h
@@ -3,7 +3,15 @@
#include "modplatform/ModIndex.h"
#include "modplatform/helpers/NetworkModAPI.h"
+#include "net/NetJob.h"
+
class FlameAPI : public NetworkModAPI {
+ public:
+ auto matchFingerprints(const std::list<uint>& fingerprints, QByteArray* response) -> NetJob::Ptr;
+ auto getModFileChangelog(int modId, int fileId) -> QString;
+
+ auto getLatestVersion(VersionSearchArgs&& args) -> ModPlatform::IndexedVersion;
+
private:
inline auto getSortFieldInt(QString sortString) const -> int
{
diff --git a/launcher/modplatform/flame/FlameModIndex.cpp b/launcher/modplatform/flame/FlameModIndex.cpp
index b99bfb26..0ad1d4ba 100644
--- a/launcher/modplatform/flame/FlameModIndex.cpp
+++ b/launcher/modplatform/flame/FlameModIndex.cpp
@@ -110,7 +110,7 @@ auto FlameMod::loadIndexedPackVersion(QJsonObject& obj) -> ModPlatform::IndexedV
file.fileId = Json::requireInteger(obj, "id");
file.date = Json::requireString(obj, "fileDate");
file.version = Json::requireString(obj, "displayName");
- file.downloadUrl = Json::requireString(obj, "downloadUrl");
+ file.downloadUrl = Json::ensureString(obj, "downloadUrl");
file.fileName = Json::requireString(obj, "fileName");
auto hash_list = Json::ensureArray(obj, "hashes");