mirror of
https://github.com/PrismLauncher/PrismLauncher.git
synced 2025-08-04 03:47:57 -04:00
fix:resource update with loaders
Signed-off-by: Trial97 <alexandru.tripon97@gmail.com>
This commit is contained in:
parent
a75713897d
commit
bd570aa5d1
@ -218,9 +218,19 @@ QList<ModPlatform::Category> FlameAPI::loadModCategories(std::shared_ptr<QByteAr
|
|||||||
|
|
||||||
std::optional<ModPlatform::IndexedVersion> FlameAPI::getLatestVersion(QList<ModPlatform::IndexedVersion> versions,
|
std::optional<ModPlatform::IndexedVersion> FlameAPI::getLatestVersion(QList<ModPlatform::IndexedVersion> versions,
|
||||||
QList<ModPlatform::ModLoaderType> instanceLoaders,
|
QList<ModPlatform::ModLoaderType> instanceLoaders,
|
||||||
ModPlatform::ModLoaderTypes modLoaders)
|
ModPlatform::ModLoaderTypes modLoaders,
|
||||||
|
bool checkLoaders)
|
||||||
{
|
{
|
||||||
static const auto noLoader = ModPlatform::ModLoaderType(0);
|
static const auto noLoader = ModPlatform::ModLoaderType(0);
|
||||||
|
if (!checkLoaders) {
|
||||||
|
std::optional<ModPlatform::IndexedVersion> ver;
|
||||||
|
for (auto file_tmp : versions) {
|
||||||
|
if (!ver.has_value() || file_tmp.date > ver->date) {
|
||||||
|
ver = file_tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ver;
|
||||||
|
}
|
||||||
QHash<ModPlatform::ModLoaderType, ModPlatform::IndexedVersion> bestMatch;
|
QHash<ModPlatform::ModLoaderType, ModPlatform::IndexedVersion> bestMatch;
|
||||||
auto checkVersion = [&bestMatch](const ModPlatform::IndexedVersion& version, const ModPlatform::ModLoaderType& loader) {
|
auto checkVersion = [&bestMatch](const ModPlatform::IndexedVersion& version, const ModPlatform::ModLoaderType& loader) {
|
||||||
if (bestMatch.contains(loader)) {
|
if (bestMatch.contains(loader)) {
|
||||||
|
@ -18,7 +18,8 @@ class FlameAPI : public NetworkResourceAPI {
|
|||||||
|
|
||||||
std::optional<ModPlatform::IndexedVersion> getLatestVersion(QList<ModPlatform::IndexedVersion> versions,
|
std::optional<ModPlatform::IndexedVersion> getLatestVersion(QList<ModPlatform::IndexedVersion> versions,
|
||||||
QList<ModPlatform::ModLoaderType> instanceLoaders,
|
QList<ModPlatform::ModLoaderType> instanceLoaders,
|
||||||
ModPlatform::ModLoaderTypes fallback);
|
ModPlatform::ModLoaderTypes fallback,
|
||||||
|
bool checkLoaders);
|
||||||
|
|
||||||
Task::Ptr getProjects(QStringList addonIds, std::shared_ptr<QByteArray> response) const override;
|
Task::Ptr getProjects(QStringList addonIds, std::shared_ptr<QByteArray> response) const override;
|
||||||
Task::Ptr matchFingerprints(const QList<uint>& fingerprints, std::shared_ptr<QByteArray> response);
|
Task::Ptr matchFingerprints(const QList<uint>& fingerprints, std::shared_ptr<QByteArray> response);
|
||||||
|
@ -87,7 +87,7 @@ void FlameCheckUpdate::getLatestVersionCallback(Resource* resource, std::shared_
|
|||||||
qCritical() << e.what();
|
qCritical() << e.what();
|
||||||
qDebug() << doc;
|
qDebug() << doc;
|
||||||
}
|
}
|
||||||
auto latest_ver = api.getLatestVersion(pack->versions, m_loadersList, resource->metadata()->loaders);
|
auto latest_ver = api.getLatestVersion(pack->versions, m_loadersList, resource->metadata()->loaders, !m_loadersList.isEmpty());
|
||||||
|
|
||||||
setStatus(tr("Parsing the API response from CurseForge for '%1'...").arg(resource->name()));
|
setStatus(tr("Parsing the API response from CurseForge for '%1'...").arg(resource->name()));
|
||||||
|
|
||||||
|
@ -15,6 +15,26 @@
|
|||||||
|
|
||||||
static ModrinthAPI api;
|
static ModrinthAPI api;
|
||||||
|
|
||||||
|
ModrinthCheckUpdate::ModrinthCheckUpdate(QList<Resource*>& resources,
|
||||||
|
std::list<Version>& mcVersions,
|
||||||
|
QList<ModPlatform::ModLoaderType> loadersList,
|
||||||
|
std::shared_ptr<ResourceFolderModel> resourceModel)
|
||||||
|
: CheckUpdateTask(resources, mcVersions, std::move(loadersList), std::move(resourceModel))
|
||||||
|
, m_hashType(ModPlatform::ProviderCapabilities::hashType(ModPlatform::ResourceProvider::MODRINTH).first())
|
||||||
|
{
|
||||||
|
if (!m_loadersList.isEmpty()) { // this is for mods so append all the other posible loaders to the initial list
|
||||||
|
m_initialSize = m_loadersList.length();
|
||||||
|
ModPlatform::ModLoaderTypes modLoaders;
|
||||||
|
for (auto m : resources) {
|
||||||
|
modLoaders |= m->metadata()->loaders;
|
||||||
|
}
|
||||||
|
for (auto l : m_loadersList) {
|
||||||
|
modLoaders &= ~l;
|
||||||
|
}
|
||||||
|
m_loadersList.append(ModPlatform::modLoaderTypesToList(modLoaders));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool ModrinthCheckUpdate::abort()
|
bool ModrinthCheckUpdate::abort()
|
||||||
{
|
{
|
||||||
if (m_job)
|
if (m_job)
|
||||||
@ -34,6 +54,7 @@ void ModrinthCheckUpdate::executeTask()
|
|||||||
|
|
||||||
auto hashing_task =
|
auto hashing_task =
|
||||||
makeShared<ConcurrentTask>("MakeModrinthHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt());
|
makeShared<ConcurrentTask>("MakeModrinthHashesTask", APPLICATION->settings()->get("NumberOfConcurrentTasks").toInt());
|
||||||
|
bool startHasing = false;
|
||||||
for (auto* resource : m_resources) {
|
for (auto* resource : m_resources) {
|
||||||
auto hash = resource->metadata()->hash;
|
auto hash = resource->metadata()->hash;
|
||||||
|
|
||||||
@ -45,23 +66,37 @@ void ModrinthCheckUpdate::executeTask()
|
|||||||
connect(hash_task.get(), &Hashing::Hasher::resultsReady, [this, resource](QString hash) { m_mappings.insert(hash, resource); });
|
connect(hash_task.get(), &Hashing::Hasher::resultsReady, [this, resource](QString hash) { m_mappings.insert(hash, resource); });
|
||||||
connect(hash_task.get(), &Task::failed, [this] { failed("Failed to generate hash"); });
|
connect(hash_task.get(), &Task::failed, [this] { failed("Failed to generate hash"); });
|
||||||
hashing_task->addTask(hash_task);
|
hashing_task->addTask(hash_task);
|
||||||
|
startHasing = true;
|
||||||
} else {
|
} else {
|
||||||
m_mappings.insert(hash, resource);
|
m_mappings.insert(hash, resource);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (startHasing) {
|
||||||
connect(hashing_task.get(), &Task::finished, this, &ModrinthCheckUpdate::checkNextLoader);
|
connect(hashing_task.get(), &Task::finished, this, &ModrinthCheckUpdate::checkNextLoader);
|
||||||
m_job = hashing_task;
|
m_job = hashing_task;
|
||||||
hashing_task->start();
|
hashing_task->start();
|
||||||
|
} else {
|
||||||
|
checkNextLoader();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModrinthCheckUpdate::getUpdateModsForLoader(std::optional<ModPlatform::ModLoaderTypes> loader)
|
void ModrinthCheckUpdate::getUpdateModsForLoader(std::optional<ModPlatform::ModLoaderTypes> loader, bool forceModLoaderCheck)
|
||||||
{
|
{
|
||||||
setStatus(tr("Waiting for the API response from Modrinth..."));
|
setStatus(tr("Waiting for the API response from Modrinth..."));
|
||||||
setProgress(m_progress + 1, m_progressTotal);
|
setProgress(m_progress + 1, m_progressTotal);
|
||||||
|
|
||||||
auto response = std::make_shared<QByteArray>();
|
auto response = std::make_shared<QByteArray>();
|
||||||
QStringList hashes = m_mappings.keys();
|
QStringList hashes;
|
||||||
|
if (forceModLoaderCheck && loader.has_value()) {
|
||||||
|
for (auto hash : m_mappings.keys()) {
|
||||||
|
if (m_mappings[hash]->metadata()->loaders & loader.value()) {
|
||||||
|
hashes.append(hash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
hashes = m_mappings.keys();
|
||||||
|
}
|
||||||
auto job = api.latestVersions(hashes, m_hashType, m_gameVersions, loader, response);
|
auto job = api.latestVersions(hashes, m_hashType, m_gameVersions, loader, response);
|
||||||
|
|
||||||
connect(job.get(), &Task::succeeded, this, [this, response, loader] { checkVersionsResponse(response, loader); });
|
connect(job.get(), &Task::succeeded, this, [this, response, loader] { checkVersionsResponse(response, loader); });
|
||||||
@ -69,6 +104,7 @@ void ModrinthCheckUpdate::getUpdateModsForLoader(std::optional<ModPlatform::ModL
|
|||||||
connect(job.get(), &Task::failed, this, &ModrinthCheckUpdate::checkNextLoader);
|
connect(job.get(), &Task::failed, this, &ModrinthCheckUpdate::checkNextLoader);
|
||||||
|
|
||||||
m_job = job;
|
m_job = job;
|
||||||
|
m_loaderIdx++;
|
||||||
job->start();
|
job->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -165,16 +201,11 @@ void ModrinthCheckUpdate::checkNextLoader()
|
|||||||
emitSucceeded();
|
emitSucceeded();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (m_loaderIdx < m_loadersList.size()) { // this are mods so check with loades
|
||||||
if (m_loadersList.isEmpty() && m_loaderIdx == 0) {
|
getUpdateModsForLoader(m_loadersList.at(m_loaderIdx), m_loaderIdx > m_initialSize);
|
||||||
getUpdateModsForLoader({});
|
|
||||||
m_loaderIdx++;
|
|
||||||
return;
|
return;
|
||||||
}
|
} else if (m_loadersList.isEmpty() && m_loaderIdx == 0) { // this are other resources no need to check more than once with empty loader
|
||||||
|
getUpdateModsForLoader();
|
||||||
if (m_loaderIdx < m_loadersList.size()) {
|
|
||||||
getUpdateModsForLoader(m_loadersList.at(m_loaderIdx));
|
|
||||||
m_loaderIdx++;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,17 +9,14 @@ class ModrinthCheckUpdate : public CheckUpdateTask {
|
|||||||
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, std::move(loadersList), std::move(resourceModel))
|
|
||||||
, m_hashType(ModPlatform::ProviderCapabilities::hashType(ModPlatform::ResourceProvider::MODRINTH).first())
|
|
||||||
{}
|
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
bool abort() override;
|
bool abort() override;
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
void executeTask() override;
|
void executeTask() override;
|
||||||
void getUpdateModsForLoader(std::optional<ModPlatform::ModLoaderTypes> loader);
|
void getUpdateModsForLoader(std::optional<ModPlatform::ModLoaderTypes> loader = {}, bool forceModLoaderCheck = false);
|
||||||
void checkVersionsResponse(std::shared_ptr<QByteArray> response, std::optional<ModPlatform::ModLoaderTypes> loader);
|
void checkVersionsResponse(std::shared_ptr<QByteArray> response, std::optional<ModPlatform::ModLoaderTypes> loader);
|
||||||
void checkNextLoader();
|
void checkNextLoader();
|
||||||
|
|
||||||
@ -28,4 +25,5 @@ class ModrinthCheckUpdate : public CheckUpdateTask {
|
|||||||
QHash<QString, Resource*> m_mappings;
|
QHash<QString, Resource*> m_mappings;
|
||||||
QString m_hashType;
|
QString m_hashType;
|
||||||
int m_loaderIdx = 0;
|
int m_loaderIdx = 0;
|
||||||
|
int m_initialSize = 0;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user