From b66c634983d0150594f61f8fe489cc2445122230 Mon Sep 17 00:00:00 2001 From: Collecting Date: Fri, 16 Jan 2026 08:30:13 +0000 Subject: [PATCH] create: mod_service.cpp Signed-off-by: Collecting --- src/citron/mod_manager/mod_service.cpp | 77 ++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 src/citron/mod_manager/mod_service.cpp diff --git a/src/citron/mod_manager/mod_service.cpp b/src/citron/mod_manager/mod_service.cpp new file mode 100644 index 000000000..60c728205 --- /dev/null +++ b/src/citron/mod_manager/mod_service.cpp @@ -0,0 +1,77 @@ +// SPDX-FileCopyrightText: Copyright 2026 citron Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include +#include +#include +#include "citron/mod_manager/mod_service.h" + +namespace ModManager { + +ModService::ModService(QObject* parent) : QObject(parent) { + network_manager = std::make_unique(this); +} + +ModService::~ModService() = default; + +void ModService::FetchAvailableMods(const QString& title_id) { + QNetworkRequest request{QUrl(MANIFEST_URL)}; + QNetworkReply* reply = network_manager->get(request); + + connect(reply, &QNetworkReply::finished, this, [this, reply, title_id]() { + if (reply->error() != QNetworkReply::NoError) { + emit Error(reply->errorString()); + reply->deleteLater(); + return; + } + + QJsonDocument doc = QJsonDocument::fromJson(reply->readAll()); + QJsonObject root = doc.object(); + + // Convert title_id to uppercase to match your folder/manifest structure + QString tid_upper = title_id.toUpper(); + if (!root.contains(tid_upper)) { + emit Error(QStringLiteral("No mods found for this game in the repository.")); + reply->deleteLater(); + return; + } + + ModUpdateInfo info; + info.title_id = title_id; + + QJsonObject tid_obj = root.value(tid_upper).toObject(); + QJsonObject versions_obj = tid_obj.value(QStringLiteral("versions")).toObject(); + + // Loop through every version found for this game (e.g., 1.0.0, 2.0.0) + for (auto it = versions_obj.begin(); it != versions_obj.end(); ++it) { + QString v_name = it.key(); + QJsonObject v_data = it.value().toObject(); + QJsonArray patches_array = v_data.value(QStringLiteral("patches")).toArray(); + + std::vector patches; + for (const QJsonValue& val : patches_array) { + QJsonObject p_obj = val.toObject(); + ModPatch patch; + patch.name = p_obj.value(QStringLiteral("name")).toString(); + patch.type = p_obj.value(QStringLiteral("type")).toString(); + patch.rel_path = p_obj.value(QStringLiteral("rel_path")).toString(); + + QJsonArray files_arr = p_obj.value(QStringLiteral("files")).toArray(); + for (const QJsonValue& f : files_arr) { + patch.files << f.toString(); + } + + patches.push_back(patch); + } + // Add this version and its mods to the map + info.version_patches[v_name] = patches; + } + + emit ModsAvailable(info); + reply->deleteLater(); + }); +} + +} // namespace ModManager