summaryrefslogtreecommitdiff
path: root/archived/projt-launcher/launcher/modplatform/ModIndex.h
diff options
context:
space:
mode:
Diffstat (limited to 'archived/projt-launcher/launcher/modplatform/ModIndex.h')
-rw-r--r--archived/projt-launcher/launcher/modplatform/ModIndex.h352
1 files changed, 352 insertions, 0 deletions
diff --git a/archived/projt-launcher/launcher/modplatform/ModIndex.h b/archived/projt-launcher/launcher/modplatform/ModIndex.h
new file mode 100644
index 0000000000..c168fef72d
--- /dev/null
+++ b/archived/projt-launcher/launcher/modplatform/ModIndex.h
@@ -0,0 +1,352 @@
+// SPDX-License-Identifier: GPL-3.0-only
+// SPDX-FileCopyrightText: 2026 Project Tick
+// SPDX-FileContributor: Project Tick Team
+/*
+ * ProjT Launcher - Minecraft Launcher
+ * Copyright (C) 2026 Project Tick
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * === Upstream License Block (Do Not Modify) ==============================
+ *
+ *
+ *
+ * Prism Launcher - Minecraft Launcher
+ * Copyright (c) 2022 flowln <flowlnlnln@gmail.com>
+ * Copyright (c) 2023 Trial97 <alexandru.tripon97@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ======================================================================== */
+
+#pragma once
+
+#include <QList>
+#include <QMetaType>
+#include <QString>
+#include <QVariant>
+#include <memory>
+
+class QIODevice;
+
+namespace ModPlatform
+{
+
+ enum ModLoaderType
+ {
+ NeoForge = 1 << 0,
+ Forge = 1 << 1,
+ Cauldron = 1 << 2,
+ LiteLoader = 1 << 3,
+ Fabric = 1 << 4,
+ Quilt = 1 << 5,
+ DataPack = 1 << 6,
+ Babric = 1 << 7,
+ BTA = 1 << 8,
+ LegacyFabric = 1 << 9,
+ Ornithe = 1 << 10,
+ Rift = 1 << 11,
+ Risugami = 1 << 12,
+ StationLoader = 1 << 13,
+ ModLoaderMP = 1 << 14,
+ Optifine = 1 << 15
+ };
+ Q_DECLARE_FLAGS(ModLoaderTypes, ModLoaderType)
+ QList<ModLoaderType> modLoaderTypesToList(ModLoaderTypes flags);
+
+ enum class ResourceProvider
+ {
+ MODRINTH,
+ FLAME
+ };
+
+ enum class DependencyType
+ {
+ REQUIRED,
+ OPTIONAL,
+ INCOMPATIBLE,
+ EMBEDDED,
+ TOOL,
+ INCLUDE,
+ UNKNOWN
+ };
+
+ enum class Side
+ {
+ NoSide = 0,
+ ClientSide = 1 << 0,
+ ServerSide = 1 << 1,
+ UniversalSide = ClientSide | ServerSide
+ };
+
+ namespace SideUtils
+ {
+ QString toString(Side side);
+ Side fromString(QString side);
+ } // namespace SideUtils
+
+ namespace ProviderCapabilities
+ {
+ const char* name(ResourceProvider);
+ QString readableName(ResourceProvider);
+ QStringList hashType(ResourceProvider);
+ } // namespace ProviderCapabilities
+
+ struct ModpackAuthor
+ {
+ QString name;
+ QString url;
+ };
+
+ struct DonationData
+ {
+ QString id;
+ QString platform;
+ QString url;
+ };
+
+ struct IndexedVersionType
+ {
+ enum class VersionType
+ {
+ Release = 1,
+ Beta,
+ Alpha,
+ Unknown
+ };
+ IndexedVersionType(const QString& type);
+ IndexedVersionType(const IndexedVersionType::VersionType& type);
+ IndexedVersionType(const IndexedVersionType& type);
+ IndexedVersionType() : IndexedVersionType(IndexedVersionType::VersionType::Unknown)
+ {}
+ static const QString toString(const IndexedVersionType::VersionType& type);
+ static IndexedVersionType::VersionType enumFromString(const QString& type);
+ bool isValid() const
+ {
+ return m_type != IndexedVersionType::VersionType::Unknown;
+ }
+ IndexedVersionType& operator=(const IndexedVersionType& other);
+ bool operator==(const IndexedVersionType& other) const
+ {
+ return m_type == other.m_type;
+ }
+ bool operator==(const IndexedVersionType::VersionType& type) const
+ {
+ return m_type == type;
+ }
+ bool operator!=(const IndexedVersionType& other) const
+ {
+ return m_type != other.m_type;
+ }
+ bool operator!=(const IndexedVersionType::VersionType& type) const
+ {
+ return m_type != type;
+ }
+ bool operator<(const IndexedVersionType& other) const
+ {
+ return m_type < other.m_type;
+ }
+ bool operator<(const IndexedVersionType::VersionType& type) const
+ {
+ return m_type < type;
+ }
+ bool operator<=(const IndexedVersionType& other) const
+ {
+ return m_type <= other.m_type;
+ }
+ bool operator<=(const IndexedVersionType::VersionType& type) const
+ {
+ return m_type <= type;
+ }
+ bool operator>(const IndexedVersionType& other) const
+ {
+ return m_type > other.m_type;
+ }
+ bool operator>(const IndexedVersionType::VersionType& type) const
+ {
+ return m_type > type;
+ }
+ bool operator>=(const IndexedVersionType& other) const
+ {
+ return m_type >= other.m_type;
+ }
+ bool operator>=(const IndexedVersionType::VersionType& type) const
+ {
+ return m_type >= type;
+ }
+
+ QString toString() const
+ {
+ return toString(m_type);
+ }
+
+ IndexedVersionType::VersionType m_type;
+ };
+
+ struct Dependency
+ {
+ QVariant addonId;
+ DependencyType type;
+ QString version;
+ };
+
+ struct IndexedVersion
+ {
+ QVariant addonId;
+ QVariant fileId;
+ QString version;
+ QString version_number = {};
+ IndexedVersionType version_type;
+ QStringList mcVersion;
+ QString downloadUrl;
+ QString date;
+ QString fileName;
+ ModLoaderTypes loaders = {};
+ QString hash_type;
+ QString hash;
+ bool is_preferred = true;
+ QString changelog;
+ QList<Dependency> dependencies;
+ Side side; // this is for flame API
+ QString relativePath; // Generic target path override
+
+ // For internal use, not provided by APIs
+ bool is_currently_selected = false;
+
+ QString getVersionDisplayString() const
+ {
+ auto release_type = version_type.isValid() ? QString(" [%1]").arg(version_type.toString()) : "";
+ auto versionStr = !version.contains(version_number) ? version_number : "";
+ QString gameVersion = "";
+ for (auto v : mcVersion)
+ {
+ if (version.contains(v))
+ {
+ gameVersion = "";
+ break;
+ }
+ if (gameVersion.isEmpty())
+ {
+ gameVersion = QObject::tr(" for %1").arg(v);
+ }
+ }
+ return QString("%1%2 — %3%4").arg(version, gameVersion, versionStr, release_type);
+ }
+ };
+
+ struct ExtraPackData
+ {
+ QList<DonationData> donate;
+
+ QString issuesUrl;
+ QString sourceUrl;
+ QString wikiUrl;
+ QString discordUrl;
+
+ QString status;
+
+ QString body;
+ };
+
+ struct IndexedPack
+ {
+ using Ptr = std::shared_ptr<IndexedPack>;
+
+ QVariant addonId;
+ ResourceProvider provider;
+ QString name;
+ QString slug;
+ QString description;
+ QList<ModpackAuthor> authors;
+ QString logoName;
+ QString logoUrl;
+ QString websiteUrl;
+ Side side;
+
+ bool versionsLoaded = false;
+ QList<IndexedVersion> versions;
+
+ // Don't load by default, since some modplatform don't have that info
+ bool extraDataLoaded = true;
+ ExtraPackData extraData;
+
+ // For internal use, not provided by APIs
+ bool isVersionSelected(int index) const
+ {
+ if (!versionsLoaded)
+ return false;
+
+ return versions.at(index).is_currently_selected;
+ }
+ bool isAnyVersionSelected() const
+ {
+ if (!versionsLoaded)
+ return false;
+
+ return std::any_of(versions.constBegin(),
+ versions.constEnd(),
+ [](auto const& v) { return v.is_currently_selected; });
+ }
+ };
+
+ struct OverrideDep
+ {
+ QString quilt;
+ QString fabric;
+ QString slug;
+ ModPlatform::ResourceProvider provider;
+ };
+
+ inline auto getOverrideDeps() -> QList<OverrideDep>
+ {
+ return { { "634179", "306612", "API", ModPlatform::ResourceProvider::FLAME },
+ { "720410", "308769", "KotlinLibraries", ModPlatform::ResourceProvider::FLAME },
+
+ { "qvIfYCYJ", "P7dR8mSH", "API", ModPlatform::ResourceProvider::MODRINTH },
+ { "lwVhp9o5", "Ha28R6CL", "KotlinLibraries", ModPlatform::ResourceProvider::MODRINTH } };
+ }
+
+ QString getMetaURL(ResourceProvider provider, QVariant projectID);
+
+ auto getModLoaderAsString(ModLoaderType type) -> const QString;
+ auto getModLoaderFromString(QString type) -> ModLoaderType;
+
+ constexpr bool hasSingleModLoaderSelected(ModLoaderTypes l) noexcept
+ {
+ auto x = static_cast<int>(l);
+ return x && !(x & (x - 1));
+ }
+
+ struct Category
+ {
+ QString name;
+ QString id;
+ };
+
+} // namespace ModPlatform
+
+Q_DECLARE_METATYPE(ModPlatform::IndexedPack)
+Q_DECLARE_METATYPE(ModPlatform::IndexedPack::Ptr)
+Q_DECLARE_METATYPE(ModPlatform::ResourceProvider)