mirror of
https://github.com/PrismLauncher/PrismLauncher.git
synced 2025-05-09 11:04:39 +02:00
Try to fix ModrinthCheckUpdate (not working)
Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
This commit is contained in:
parent
4b66320f63
commit
f13e875f0d
@ -21,7 +21,8 @@ class CheckUpdateTask : public Task {
|
|||||||
, m_resources(resources)
|
, m_resources(resources)
|
||||||
, m_game_versions(mcVersions)
|
, m_game_versions(mcVersions)
|
||||||
, m_loaders_list(std::move(loadersList))
|
, m_loaders_list(std::move(loadersList))
|
||||||
, m_resource_model(resourceModel){};
|
, m_resource_model(std::move(resourceModel))
|
||||||
|
{}
|
||||||
|
|
||||||
struct Update {
|
struct Update {
|
||||||
QString name;
|
QString name;
|
||||||
|
@ -12,7 +12,7 @@ class FlameCheckUpdate : public CheckUpdateTask {
|
|||||||
std::list<Version>& mcVersions,
|
std::list<Version>& mcVersions,
|
||||||
QList<ModPlatform::ModLoaderType> loadersList,
|
QList<ModPlatform::ModLoaderType> loadersList,
|
||||||
std::shared_ptr<ResourceFolderModel> resourceModel)
|
std::shared_ptr<ResourceFolderModel> resourceModel)
|
||||||
: CheckUpdateTask(resources, mcVersions, loadersList, resourceModel)
|
: CheckUpdateTask(resources, mcVersions, std::move(loadersList), std::move(resourceModel))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
@ -29,7 +29,7 @@ bool ModrinthCheckUpdate::abort()
|
|||||||
void ModrinthCheckUpdate::executeTask()
|
void ModrinthCheckUpdate::executeTask()
|
||||||
{
|
{
|
||||||
setStatus(tr("Preparing resources for Modrinth..."));
|
setStatus(tr("Preparing resources for Modrinth..."));
|
||||||
setProgress(0, 9);
|
setProgress(0, (m_loaders_list.isEmpty() ? 1 : m_loaders_list.length()) * 2 + 1);
|
||||||
|
|
||||||
auto hashing_task =
|
auto hashing_task =
|
||||||
makeShared<ConcurrentTask>(this, "MakeModrinthHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt());
|
makeShared<ConcurrentTask>(this, "MakeModrinthHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt());
|
||||||
@ -54,10 +54,30 @@ void ModrinthCheckUpdate::executeTask()
|
|||||||
hashing_task->start();
|
hashing_task->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModrinthCheckUpdate::checkVersionsResponse(std::shared_ptr<QByteArray> response,
|
void ModrinthCheckUpdate::getUpdateModsForLoader(std::optional<ModPlatform::ModLoaderTypes> loader)
|
||||||
ModPlatform::ModLoaderTypes loader,
|
|
||||||
bool forceModLoaderCheck)
|
|
||||||
{
|
{
|
||||||
|
setStatus(tr("Waiting for the API response from Modrinth..."));
|
||||||
|
setProgress(m_progress + 1, m_progressTotal);
|
||||||
|
|
||||||
|
auto response = std::make_shared<QByteArray>();
|
||||||
|
QStringList hashes = m_mappings.keys();
|
||||||
|
auto job = api.latestVersions(hashes, m_hash_type, m_game_versions, loader, response);
|
||||||
|
|
||||||
|
connect(job.get(), &Task::succeeded, this,
|
||||||
|
[this, response, loader] { checkVersionsResponse(response, loader); });
|
||||||
|
|
||||||
|
connect(job.get(), &Task::failed, this, &ModrinthCheckUpdate::checkNextLoader);
|
||||||
|
|
||||||
|
m_job = job;
|
||||||
|
job->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ModrinthCheckUpdate::checkVersionsResponse(std::shared_ptr<QByteArray> response,
|
||||||
|
std::optional<ModPlatform::ModLoaderTypes> loader)
|
||||||
|
{
|
||||||
|
setStatus(tr("Parsing the API response from Modrinth..."));
|
||||||
|
setProgress(m_progress + 1, m_progressTotal);
|
||||||
|
|
||||||
QJsonParseError parse_error{};
|
QJsonParseError parse_error{};
|
||||||
QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error);
|
QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error);
|
||||||
if (parse_error.error != QJsonParseError::NoError) {
|
if (parse_error.error != QJsonParseError::NoError) {
|
||||||
@ -69,17 +89,11 @@ void ModrinthCheckUpdate::checkVersionsResponse(std::shared_ptr<QByteArray> resp
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
setStatus(tr("Parsing the API response from Modrinth..."));
|
|
||||||
setProgress(m_next_loader_idx * 2, 9);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
for (auto iter = m_mappings.begin(); iter != m_mappings.end(); iter++) {
|
for (auto iter = m_mappings.begin(); iter != m_mappings.end(); iter++) {
|
||||||
const QString& hash = iter.key();
|
const QString& hash = iter.key();
|
||||||
Resource* resource = iter.value();
|
Resource* resource = iter.value();
|
||||||
|
|
||||||
if (forceModLoaderCheck && !(resource->metadata()->loaders & loader))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
auto project_obj = doc[hash].toObject();
|
auto project_obj = doc[hash].toObject();
|
||||||
|
|
||||||
// If the returned project is empty, but we have Modrinth metadata,
|
// If the returned project is empty, but we have Modrinth metadata,
|
||||||
@ -97,7 +111,7 @@ void ModrinthCheckUpdate::checkVersionsResponse(std::shared_ptr<QByteArray> resp
|
|||||||
static auto flags = { ModPlatform::ModLoaderType::NeoForge, ModPlatform::ModLoaderType::Forge,
|
static auto flags = { ModPlatform::ModLoaderType::NeoForge, ModPlatform::ModLoaderType::Forge,
|
||||||
ModPlatform::ModLoaderType::Quilt, ModPlatform::ModLoaderType::Fabric };
|
ModPlatform::ModLoaderType::Quilt, ModPlatform::ModLoaderType::Fabric };
|
||||||
for (auto flag : flags) {
|
for (auto flag : flags) {
|
||||||
if (loader.testFlag(flag)) {
|
if (loader.has_value() && loader->testFlag(flag)) {
|
||||||
loader_filter = ModPlatform::getModLoaderAsString(flag);
|
loader_filter = ModPlatform::getModLoaderAsString(flag);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -153,63 +167,38 @@ void ModrinthCheckUpdate::checkVersionsResponse(std::shared_ptr<QByteArray> resp
|
|||||||
checkNextLoader();
|
checkNextLoader();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModrinthCheckUpdate::getUpdateModsForLoader(ModPlatform::ModLoaderTypes loader, bool forceModLoaderCheck)
|
|
||||||
{
|
|
||||||
auto response = std::make_shared<QByteArray>();
|
|
||||||
QStringList hashes;
|
|
||||||
if (forceModLoaderCheck) {
|
|
||||||
for (auto hash : m_mappings.keys()) {
|
|
||||||
if (m_mappings[hash]->metadata()->loaders & loader) {
|
|
||||||
hashes.append(hash);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
hashes = m_mappings.keys();
|
|
||||||
}
|
|
||||||
auto job = api.latestVersions(hashes, m_hash_type, m_game_versions, loader, response);
|
|
||||||
|
|
||||||
connect(job.get(), &Task::succeeded, this,
|
|
||||||
[this, response, loader, forceModLoaderCheck] { checkVersionsResponse(response, loader, forceModLoaderCheck); });
|
|
||||||
|
|
||||||
connect(job.get(), &Task::failed, this, &ModrinthCheckUpdate::checkNextLoader);
|
|
||||||
|
|
||||||
setStatus(tr("Waiting for the API response from Modrinth..."));
|
|
||||||
setProgress(m_next_loader_idx * 2 - 1, 9);
|
|
||||||
|
|
||||||
m_job = job;
|
|
||||||
job->start();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ModrinthCheckUpdate::checkNextLoader()
|
void ModrinthCheckUpdate::checkNextLoader()
|
||||||
{
|
{
|
||||||
if (m_mappings.isEmpty()) {
|
if (m_mappings.isEmpty()) {
|
||||||
emitSucceeded();
|
emitSucceeded();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (m_next_loader_idx < m_loaders_list.size()) {
|
|
||||||
getUpdateModsForLoader(m_loaders_list.at(m_next_loader_idx));
|
if (m_loaders_list.size() == 0) {
|
||||||
m_next_loader_idx++;
|
if (m_loader_idx == 0) {
|
||||||
return;
|
getUpdateModsForLoader({});
|
||||||
}
|
m_loader_idx++;
|
||||||
static auto flags = { ModPlatform::ModLoaderType::NeoForge, ModPlatform::ModLoaderType::Forge, ModPlatform::ModLoaderType::Quilt,
|
return;
|
||||||
ModPlatform::ModLoaderType::Fabric };
|
|
||||||
for (auto flag : flags) {
|
|
||||||
if (!m_loaders_list.contains(flag)) {
|
|
||||||
m_loaders_list.append(flag);
|
|
||||||
m_next_loader_idx++;
|
|
||||||
setProgress(m_next_loader_idx * 2 - 1, 9);
|
|
||||||
for (auto resource : m_mappings) {
|
|
||||||
if (resource->metadata()->loaders & flag) {
|
|
||||||
getUpdateModsForLoader(flag, true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
setProgress(m_next_loader_idx * 2, 9);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (auto m : m_mappings) {
|
if (m_loader_idx < m_loaders_list.size()) {
|
||||||
emit checkFailed(m,
|
getUpdateModsForLoader(m_loaders_list.at(m_loader_idx));
|
||||||
tr("No valid version found for this mod. It's probably unavailable for the current game version / mod loader."));
|
m_loader_idx++;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (auto resource : m_mappings) {
|
||||||
|
QString reason;
|
||||||
|
|
||||||
|
if (dynamic_cast<Mod*>(resource) != nullptr)
|
||||||
|
reason =
|
||||||
|
tr("No valid version found for this resource. It's probably unavailable for the current game "
|
||||||
|
"version / mod loader.");
|
||||||
|
else
|
||||||
|
reason = tr("No valid version found for this resource. It's probably unavailable for the current game version.");
|
||||||
|
|
||||||
|
emit checkFailed(resource, reason);
|
||||||
|
}
|
||||||
|
|
||||||
emitSucceeded();
|
emitSucceeded();
|
||||||
}
|
}
|
||||||
|
@ -7,10 +7,10 @@ class ModrinthCheckUpdate : public CheckUpdateTask {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
ModrinthCheckUpdate(QList<Resource*>& resources,
|
ModrinthCheckUpdate(QList<Resource*>& resources,
|
||||||
std::list<Version>& mcVersions,
|
std::list<Version>& mcVersions,
|
||||||
QList<ModPlatform::ModLoaderType> loadersList,
|
QList<ModPlatform::ModLoaderType> loadersList,
|
||||||
std::shared_ptr<ResourceFolderModel> resourceModel)
|
std::shared_ptr<ResourceFolderModel> resourceModel)
|
||||||
: CheckUpdateTask(resources, mcVersions, loadersList, resourceModel)
|
: CheckUpdateTask(resources, mcVersions, std::move(loadersList), std::move(resourceModel))
|
||||||
, m_hash_type(ModPlatform::ProviderCapabilities::hashType(ModPlatform::ResourceProvider::MODRINTH).first())
|
, m_hash_type(ModPlatform::ProviderCapabilities::hashType(ModPlatform::ResourceProvider::MODRINTH).first())
|
||||||
{}
|
{}
|
||||||
|
|
||||||
@ -19,13 +19,13 @@ class ModrinthCheckUpdate : public CheckUpdateTask {
|
|||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
void executeTask() override;
|
void executeTask() override;
|
||||||
void getUpdateModsForLoader(ModPlatform::ModLoaderTypes loader, bool forceModLoaderCheck = false);
|
void getUpdateModsForLoader(std::optional<ModPlatform::ModLoaderTypes> loader);
|
||||||
void checkVersionsResponse(std::shared_ptr<QByteArray> response, ModPlatform::ModLoaderTypes loader, bool forceModLoaderCheck = false);
|
void checkVersionsResponse(std::shared_ptr<QByteArray> response, std::optional<ModPlatform::ModLoaderTypes> loader);
|
||||||
void checkNextLoader();
|
void checkNextLoader();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Task::Ptr m_job = nullptr;
|
Task::Ptr m_job = nullptr;
|
||||||
QHash<QString, Resource*> m_mappings;
|
QHash<QString, Resource*> m_mappings;
|
||||||
QString m_hash_type;
|
QString m_hash_type;
|
||||||
int m_next_loader_idx = 0;
|
int m_loader_idx = 0;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user