mirror of
https://github.com/PrismLauncher/PrismLauncher.git
synced 2026-06-29 01:54:20 +03:00
Modrith api optional changelog (#5197)
This commit is contained in:
commit
c7d43f1685
23 changed files with 322 additions and 198 deletions
|
|
@ -297,3 +297,46 @@ auto Resource::getOriginalFileName() const -> QString
|
|||
fileName.chop(9);
|
||||
return fileName;
|
||||
}
|
||||
|
||||
QDebug operator<<(QDebug debug, ResourceType type)
|
||||
{
|
||||
switch (type) {
|
||||
case ResourceType::ZIPFILE:
|
||||
debug << "ZIPFILE";
|
||||
break;
|
||||
case ResourceType::SINGLEFILE:
|
||||
debug << "SINGLEFILE";
|
||||
break;
|
||||
case ResourceType::FOLDER:
|
||||
debug << "FOLDER";
|
||||
break;
|
||||
case ResourceType::LITEMOD:
|
||||
debug << "LITEMOD";
|
||||
break;
|
||||
case ResourceType::UNKNOWN:
|
||||
default:
|
||||
debug << "UNKNOWN";
|
||||
break;
|
||||
};
|
||||
return debug;
|
||||
}
|
||||
|
||||
QDebug operator<<(QDebug debug, ResourceStatus status)
|
||||
{
|
||||
switch (status) {
|
||||
case ResourceStatus::INSTALLED:
|
||||
debug << "INSTALLED";
|
||||
break;
|
||||
case ResourceStatus::NOT_INSTALLED:
|
||||
debug << "NOT_INSTALLED";
|
||||
break;
|
||||
case ResourceStatus::NO_METADATA:
|
||||
debug << "NO_METADATA";
|
||||
break;
|
||||
case ResourceStatus::UNKNOWN:
|
||||
default:
|
||||
debug << "UNKNOWN";
|
||||
break;
|
||||
};
|
||||
return debug;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -53,6 +53,8 @@ enum class ResourceType {
|
|||
LITEMOD, //!< The resource is a litemod
|
||||
};
|
||||
|
||||
QDebug operator<<(QDebug debug, ResourceType type);
|
||||
|
||||
enum class ResourceStatus {
|
||||
INSTALLED, // Both JAR and Metadata are present
|
||||
NOT_INSTALLED, // Only the Metadata is present
|
||||
|
|
@ -60,6 +62,8 @@ enum class ResourceStatus {
|
|||
UNKNOWN, // Default status
|
||||
};
|
||||
|
||||
QDebug operator<<(QDebug debug, ResourceStatus status);
|
||||
|
||||
enum class SortType {
|
||||
NAME,
|
||||
DATE,
|
||||
|
|
@ -134,7 +138,7 @@ class Resource : public QObject {
|
|||
* = 0: 'this' is equal to 'other'
|
||||
* < 0: 'this' comes before 'other'
|
||||
*/
|
||||
virtual int compare(Resource const& other, SortType type = SortType::NAME) const;
|
||||
virtual int compare(const Resource& other, SortType type = SortType::NAME) const;
|
||||
|
||||
/** Returns whether the given filter should filter out 'this' (false),
|
||||
* or if such filter includes the Resource (true).
|
||||
|
|
|
|||
|
|
@ -74,13 +74,13 @@ void GetModDependenciesTask::prepare()
|
|||
ModPlatform::Dependency GetModDependenciesTask::getOverride(const ModPlatform::Dependency& dep,
|
||||
const ModPlatform::ResourceProvider providerName)
|
||||
{
|
||||
if (auto isQuilt = m_loaderType & ModPlatform::Quilt; isQuilt || m_loaderType & ModPlatform::Fabric) {
|
||||
if (auto isQuilt = (m_loaderType & ModPlatform::Quilt) != 0U; isQuilt || (m_loaderType & ModPlatform::Fabric) != 0U) {
|
||||
auto overide = ModPlatform::getOverrideDeps();
|
||||
auto over = std::find_if(overide.cbegin(), overide.cend(), [dep, providerName, isQuilt](const auto& o) {
|
||||
return o.provider == providerName && dep.addonId == (isQuilt ? o.fabric : o.quilt);
|
||||
});
|
||||
if (over != overide.cend()) {
|
||||
return { isQuilt ? over->quilt : over->fabric, dep.type };
|
||||
return { .addonId = isQuilt ? over->quilt : over->fabric, .type = dep.type, .version = "" };
|
||||
}
|
||||
}
|
||||
return dep;
|
||||
|
|
@ -91,40 +91,45 @@ QList<ModPlatform::Dependency> GetModDependenciesTask::getDependenciesForVersion
|
|||
{
|
||||
QList<ModPlatform::Dependency> c_dependencies;
|
||||
for (auto ver_dep : version.dependencies) {
|
||||
if (ver_dep.type != ModPlatform::DependencyType::REQUIRED)
|
||||
if (ver_dep.type != ModPlatform::DependencyType::REQUIRED) {
|
||||
continue;
|
||||
}
|
||||
ver_dep = getOverride(ver_dep, providerName);
|
||||
auto isOnlyVersion = providerName == ModPlatform::ResourceProvider::MODRINTH && ver_dep.addonId.toString().isEmpty();
|
||||
if (auto dep = std::find_if(c_dependencies.begin(), c_dependencies.end(),
|
||||
[&ver_dep, isOnlyVersion](const ModPlatform::Dependency& i) {
|
||||
return isOnlyVersion ? i.version == ver_dep.version : i.addonId == ver_dep.addonId;
|
||||
});
|
||||
dep != c_dependencies.end())
|
||||
dep != c_dependencies.end()) {
|
||||
continue; // check the current dependency list
|
||||
}
|
||||
|
||||
if (auto dep = std::find_if(m_selected.begin(), m_selected.end(),
|
||||
[&ver_dep, providerName, isOnlyVersion](std::shared_ptr<PackDependency> i) {
|
||||
[&ver_dep, providerName, isOnlyVersion](const std::shared_ptr<PackDependency>& i) {
|
||||
return i->pack->provider == providerName && (isOnlyVersion ? i->version.version == ver_dep.version
|
||||
: i->pack->addonId == ver_dep.addonId);
|
||||
});
|
||||
dep != m_selected.end())
|
||||
dep != m_selected.end()) {
|
||||
continue; // check the selected versions
|
||||
}
|
||||
|
||||
if (auto dep = std::find_if(m_mods.begin(), m_mods.end(),
|
||||
[&ver_dep, providerName, isOnlyVersion](std::shared_ptr<Metadata::ModStruct> i) {
|
||||
[&ver_dep, providerName, isOnlyVersion](const std::shared_ptr<Metadata::ModStruct>& i) {
|
||||
return i->provider == providerName &&
|
||||
(isOnlyVersion ? i->file_id == ver_dep.version : i->project_id == ver_dep.addonId);
|
||||
});
|
||||
dep != m_mods.end())
|
||||
dep != m_mods.end()) {
|
||||
continue; // check the existing mods
|
||||
}
|
||||
|
||||
if (auto dep = std::find_if(m_pack_dependencies.begin(), m_pack_dependencies.end(),
|
||||
[&ver_dep, providerName, isOnlyVersion](std::shared_ptr<PackDependency> i) {
|
||||
[&ver_dep, providerName, isOnlyVersion](const std::shared_ptr<PackDependency>& i) {
|
||||
return i->pack->provider == providerName && (isOnlyVersion ? i->version.version == ver_dep.addonId
|
||||
: i->pack->addonId == ver_dep.addonId);
|
||||
});
|
||||
dep != m_pack_dependencies.end()) // check loaded dependencies
|
||||
dep != m_pack_dependencies.end()) { // check loaded dependencies
|
||||
continue;
|
||||
}
|
||||
|
||||
c_dependencies.append(ver_dep);
|
||||
}
|
||||
|
|
@ -180,9 +185,11 @@ Task::Ptr GetModDependenciesTask::prepareDependencyTask(const ModPlatform::Depen
|
|||
tasks->addTask(getProjectInfoTask(pDep));
|
||||
}
|
||||
|
||||
ResourceAPI::DependencySearchArgs args = { dep, m_version, m_loaderType };
|
||||
ResourceAPI::DependencySearchArgs args = {
|
||||
.dependency = dep, .mcVersion = m_version, .loader = m_loaderType, .includeChangelog = true
|
||||
};
|
||||
ResourceAPI::Callback<ModPlatform::IndexedVersion> callbacks;
|
||||
callbacks.on_fail = [](QString reason, int) {
|
||||
callbacks.on_fail = [](const QString& reason, int) {
|
||||
qCritical() << tr("A network error occurred. Could not load project dependencies:%1").arg(reason);
|
||||
};
|
||||
callbacks.on_succeed = [dep, provider, pDep, level, this](auto& pack) {
|
||||
|
|
@ -191,10 +198,10 @@ Task::Ptr GetModDependenciesTask::prepareDependencyTask(const ModPlatform::Depen
|
|||
if (m_loaderType & ModPlatform::Quilt) { // falback for quilt
|
||||
auto overide = ModPlatform::getOverrideDeps();
|
||||
auto over = std::find_if(overide.cbegin(), overide.cend(),
|
||||
[dep, provider](auto o) { return o.provider == provider && dep.addonId == o.quilt; });
|
||||
[dep, provider](const auto& o) { return o.provider == provider && dep.addonId == o.quilt; });
|
||||
if (over != overide.cend()) {
|
||||
removePack(dep.addonId);
|
||||
addTask(prepareDependencyTask({ over->fabric, dep.type }, provider, level));
|
||||
addTask(prepareDependencyTask({ .addonId = over->fabric, .type = dep.type, .version = "" }, provider, level));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
@ -212,7 +219,7 @@ Task::Ptr GetModDependenciesTask::prepareDependencyTask(const ModPlatform::Depen
|
|||
}
|
||||
if (dep.addonId.toString().isEmpty() && !pDep->version.addonId.toString().isEmpty()) {
|
||||
pDep->pack->addonId = pDep->version.addonId;
|
||||
auto dep_ = getOverride({ pDep->version.addonId, pDep->dependency.type }, provider);
|
||||
auto dep_ = getOverride({ .addonId = pDep->version.addonId, .type = pDep->dependency.type, .version = "" }, provider);
|
||||
if (dep_.addonId != pDep->version.addonId) {
|
||||
removePack(pDep->version.addonId);
|
||||
addTask(prepareDependencyTask(dep_, provider, level));
|
||||
|
|
@ -224,7 +231,7 @@ Task::Ptr GetModDependenciesTask::prepareDependencyTask(const ModPlatform::Depen
|
|||
removePack(pDep->version.addonId);
|
||||
return;
|
||||
}
|
||||
for (auto dep_ : getDependenciesForVersion(pDep->version, provider)) {
|
||||
for (const auto& dep_ : getDependenciesForVersion(pDep->version, provider)) {
|
||||
addTask(prepareDependencyTask(dep_, provider, level - 1));
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@
|
|||
#include <QVariant>
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
|
||||
#include "minecraft/mod/MetadataHandler.h"
|
||||
#include "minecraft/mod/ModFolderModel.h"
|
||||
|
|
@ -44,15 +45,11 @@ class GetModDependenciesTask : public SequentialTask {
|
|||
ModPlatform::IndexedPack::Ptr pack;
|
||||
ModPlatform::IndexedVersion version;
|
||||
PackDependency() = default;
|
||||
PackDependency(const ModPlatform::IndexedPack::Ptr p, const ModPlatform::IndexedVersion& v)
|
||||
{
|
||||
pack = p;
|
||||
version = v;
|
||||
}
|
||||
PackDependency(ModPlatform::IndexedPack::Ptr p, ModPlatform::IndexedVersion v) : pack(std::move(p)), version(std::move(v)) {}
|
||||
};
|
||||
|
||||
struct PackDependencyExtraInfo {
|
||||
bool maybe_installed;
|
||||
bool maybe_installed{};
|
||||
QStringList required_by;
|
||||
};
|
||||
|
||||
|
|
@ -62,12 +59,12 @@ class GetModDependenciesTask : public SequentialTask {
|
|||
QHash<QString, PackDependencyExtraInfo> getExtraInfo();
|
||||
|
||||
private:
|
||||
inline ResourceAPI* getAPI(ModPlatform::ResourceProvider provider)
|
||||
ResourceAPI* getAPI(ModPlatform::ResourceProvider provider)
|
||||
{
|
||||
if (provider == ModPlatform::ResourceProvider::FLAME)
|
||||
if (provider == ModPlatform::ResourceProvider::FLAME) {
|
||||
return &m_flameAPI;
|
||||
else
|
||||
return &m_modrinthAPI;
|
||||
}
|
||||
return &m_modrinthAPI;
|
||||
}
|
||||
|
||||
protected slots:
|
||||
|
|
|
|||
|
|
@ -568,7 +568,7 @@ bool process(Mod& mod, ProcessingLevel level)
|
|||
case ResourceType::LITEMOD:
|
||||
return processLitemod(mod);
|
||||
default:
|
||||
qWarning() << "Invalid type for mod parse task!";
|
||||
qWarning() << "Invalid type" << mod.type() << "for mod parse task!";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue