Merge pull request #597 from Scrumplex/refactor-modloader-modapi

This commit is contained in:
Sefa Eyeoglu
2022-05-22 13:17:53 +02:00
committed by GitHub
13 changed files with 68 additions and 54 deletions

View File

@ -16,14 +16,21 @@ class ModAPI {
public:
virtual ~ModAPI() = default;
// https://docs.curseforge.com/?http#tocS_ModLoaderType
enum ModLoaderType { Unspecified = 0, Forge = 1, Cauldron = 2, LiteLoader = 3, Fabric = 4, Quilt = 5 };
enum ModLoaderType {
Unspecified = 0,
Forge = 1 << 0,
Cauldron = 1 << 1,
LiteLoader = 1 << 2,
Fabric = 1 << 3,
Quilt = 1 << 4
};
Q_DECLARE_FLAGS(ModLoaderTypes, ModLoaderType)
struct SearchArgs {
int offset;
QString search;
QString sorting;
ModLoaderType mod_loader;
ModLoaderTypes loaders;
std::list<Version> versions;
};
@ -33,7 +40,7 @@ class ModAPI {
struct VersionSearchArgs {
QString addonId;
std::list<Version> mcVersions;
ModLoaderType loader;
ModLoaderTypes loaders;
};
virtual void getVersions(CallerType* caller, VersionSearchArgs&& args) const = 0;

View File

@ -37,14 +37,14 @@ class FlameAPI : public NetworkModAPI {
.arg(args.offset)
.arg(args.search)
.arg(getSortFieldInt(args.sorting))
.arg(getMappedModLoader(args.mod_loader))
.arg(getMappedModLoader(args.loaders))
.arg(gameVersionStr);
};
inline auto getVersionsURL(VersionSearchArgs& args) const -> QString override
{
QString gameVersionQuery = args.mcVersions.size() == 1 ? QString("gameVersion=%1&").arg(args.mcVersions.front().toString()) : "";
QString modLoaderQuery = QString("modLoaderType=%1&").arg(getMappedModLoader(args.loader));
QString modLoaderQuery = QString("modLoaderType=%1&").arg(getMappedModLoader(args.loaders));
return QString("https://api.curseforge.com/v1/mods/%1/files?pageSize=10000&%2%3")
.arg(args.addonId)
@ -53,11 +53,16 @@ class FlameAPI : public NetworkModAPI {
};
public:
static auto getMappedModLoader(const ModLoaderType type) -> const ModLoaderType
static auto getMappedModLoader(const ModLoaderTypes loaders) -> const int
{
// https://docs.curseforge.com/?http#tocS_ModLoaderType
if (loaders & Forge)
return 1;
if (loaders & Fabric)
return 4;
// TODO: remove this once Quilt drops official Fabric support
if (type == Quilt) // NOTE: Most if not all Fabric mods should work *currently*
return Fabric;
return type;
if (loaders & Quilt) // NOTE: Most if not all Fabric mods should work *currently*
return 4; // Quilt would probably be 5
return 0;
}
};

View File

@ -28,30 +28,25 @@ class ModrinthAPI : public NetworkModAPI {
public:
inline auto getAuthorURL(const QString& name) const -> QString { return "https://modrinth.com/user/" + name; };
static auto getModLoaderStrings(ModLoaderType type) -> const QStringList
static auto getModLoaderStrings(const ModLoaderTypes types) -> const QStringList
{
QStringList l;
switch (type)
for (auto loader : {Forge, Fabric, Quilt})
{
case Unspecified:
for (auto loader : {Forge, Fabric, Quilt})
{
l << ModAPI::getModLoaderString(loader);
}
break;
case Quilt:
l << ModAPI::getModLoaderString(Fabric);
default:
l << ModAPI::getModLoaderString(type);
if ((types & loader) || types == Unspecified)
{
l << ModAPI::getModLoaderString(loader);
}
}
if ((types & Quilt) && (~types & Fabric)) // Add Fabric if Quilt is in use, if Fabric isn't already there
l << ModAPI::getModLoaderString(Fabric);
return l;
}
static auto getModLoaderFilters(ModLoaderType type) -> const QString
static auto getModLoaderFilters(ModLoaderTypes types) -> const QString
{
QStringList l;
for (auto loader : getModLoaderStrings(type))
for (auto loader : getModLoaderStrings(types))
{
l << QString("\"categories:%1\"").arg(loader);
}
@ -61,7 +56,7 @@ class ModrinthAPI : public NetworkModAPI {
private:
inline auto getModSearchURL(SearchArgs& args) const -> QString override
{
if (!validateModLoader(args.mod_loader)) {
if (!validateModLoaders(args.loaders)) {
qWarning() << "Modrinth only have Forge and Fabric-compatible mods!";
return "";
}
@ -76,7 +71,7 @@ class ModrinthAPI : public NetworkModAPI {
.arg(args.offset)
.arg(args.search)
.arg(args.sorting)
.arg(getModLoaderFilters(args.mod_loader))
.arg(getModLoaderFilters(args.loaders))
.arg(getGameVersionsArray(args.versions));
};
@ -88,7 +83,7 @@ class ModrinthAPI : public NetworkModAPI {
"loaders=[\"%3\"]")
.arg(args.addonId)
.arg(getGameVersionsString(args.mcVersions))
.arg(getModLoaderStrings(args.loader).join("\",\""));
.arg(getModLoaderStrings(args.loaders).join("\",\""));
};
auto getGameVersionsArray(std::list<Version> mcVersions) const -> QString
@ -101,9 +96,9 @@ class ModrinthAPI : public NetworkModAPI {
return s.isEmpty() ? QString() : QString("[%1],").arg(s);
}
inline auto validateModLoader(ModLoaderType modLoader) const -> bool
inline auto validateModLoaders(ModLoaderTypes loaders) const -> bool
{
return modLoader == Unspecified || modLoader == Forge || modLoader == Fabric || modLoader == Quilt;
return (loaders == Unspecified) || (loaders & (Forge | Fabric | Quilt));
}
};