From 4439666e67573a6a36af981fdc68410fdf9e4f9f Mon Sep 17 00:00:00 2001
From: flow <thiagodonato300@gmail.com>
Date: Sun, 17 Apr 2022 10:19:23 -0300
Subject: feat: allow disabling mod metadata usage

---
 launcher/Application.cpp                           |  3 +
 launcher/minecraft/mod/Mod.cpp                     |  6 +-
 .../minecraft/mod/tasks/LocalModUpdateTask.cpp     |  6 ++
 launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp | 28 +++++---
 launcher/minecraft/mod/tasks/ModFolderLoadTask.h   |  4 ++
 launcher/ui/pages/global/LauncherPage.cpp          | 12 ++++
 launcher/ui/pages/global/LauncherPage.h            |  1 +
 launcher/ui/pages/global/LauncherPage.ui           | 75 +++++++++++++++-------
 8 files changed, 101 insertions(+), 34 deletions(-)

(limited to 'launcher')

diff --git a/launcher/Application.cpp b/launcher/Application.cpp
index ba4096b6..ae4cbcf8 100644
--- a/launcher/Application.cpp
+++ b/launcher/Application.cpp
@@ -643,6 +643,9 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv)
         // Minecraft launch method
         m_settings->registerSetting("MCLaunchMethod", "LauncherPart");
 
+        // Minecraft mods
+        m_settings->registerSetting("DontUseModMetadata", false);
+
         // Minecraft offline player name
         m_settings->registerSetting("LastOfflinePlayerName", "");
 
diff --git a/launcher/minecraft/mod/Mod.cpp b/launcher/minecraft/mod/Mod.cpp
index 46776239..7b560845 100644
--- a/launcher/minecraft/mod/Mod.cpp
+++ b/launcher/minecraft/mod/Mod.cpp
@@ -124,7 +124,11 @@ bool Mod::enable(bool value)
 
 bool Mod::destroy(QDir& index_dir)
 {
-    Metadata::remove(index_dir, m_name);
+    auto n = name();
+    // FIXME: This can fail to remove the metadata if the
+    // "DontUseModMetadata" setting is on, since there could
+    // be a name mismatch!
+    Metadata::remove(index_dir, n);
 
     m_type = MOD_UNKNOWN;
     return FS::deletePath(m_file.filePath());
diff --git a/launcher/minecraft/mod/tasks/LocalModUpdateTask.cpp b/launcher/minecraft/mod/tasks/LocalModUpdateTask.cpp
index 8b6e8ec7..3c9b76a8 100644
--- a/launcher/minecraft/mod/tasks/LocalModUpdateTask.cpp
+++ b/launcher/minecraft/mod/tasks/LocalModUpdateTask.cpp
@@ -2,6 +2,7 @@
 
 #include <toml.h>
 
+#include "Application.h"
 #include "FileSystem.h"
 #include "minecraft/mod/MetadataHandler.h"
 
@@ -18,6 +19,11 @@ void LocalModUpdateTask::executeTask()
 {
     setStatus(tr("Updating index for mod:\n%1").arg(m_mod.name));
 
+    if(APPLICATION->settings()->get("DontUseModMetadata").toBool()){
+        emitSucceeded();
+        return;
+    }
+
     auto pw_mod = Metadata::create(m_index_dir, m_mod, m_mod_version);
     Metadata::update(m_index_dir, pw_mod);
 
diff --git a/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp b/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp
index e94bdee9..5afbb08a 100644
--- a/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp
+++ b/launcher/minecraft/mod/tasks/ModFolderLoadTask.cpp
@@ -1,6 +1,7 @@
 #include "ModFolderLoadTask.h"
 #include <QDebug>
 
+#include "Application.h"
 #include "minecraft/mod/MetadataHandler.h"
 
 ModFolderLoadTask::ModFolderLoadTask(QDir& mods_dir, QDir& index_dir) 
@@ -9,16 +10,9 @@ ModFolderLoadTask::ModFolderLoadTask(QDir& mods_dir, QDir& index_dir)
 
 void ModFolderLoadTask::run()
 {
-    // Read metadata first
-    m_index_dir.refresh();
-    for (auto entry : m_index_dir.entryList()) {
-        // QDir::Filter::NoDotAndDotDot seems to exclude all files for some reason...
-        if (entry == "." || entry == "..")
-            continue;
-
-        entry.chop(5);  // Remove .toml at the end
-        Mod mod(m_mods_dir, Metadata::get(m_index_dir, entry));
-        m_result->mods[mod.internal_id()] = mod;
+    if (!APPLICATION->settings()->get("DontUseModMetadata").toBool()) {
+        // Read metadata first
+        getFromMetadata();
     }
 
     // Read JAR files that don't have metadata
@@ -31,3 +25,17 @@ void ModFolderLoadTask::run()
 
     emit succeeded();
 }
+
+void ModFolderLoadTask::getFromMetadata()
+{
+    m_index_dir.refresh();
+    for (auto entry : m_index_dir.entryList()) {
+        // QDir::Filter::NoDotAndDotDot seems to exclude all files for some reason...
+        if (entry == "." || entry == "..")
+            continue;
+
+        entry.chop(5);  // Remove .toml at the end
+        Mod mod(m_mods_dir, Metadata::get(m_index_dir, entry));
+        m_result->mods[mod.internal_id()] = mod;
+    }
+}
diff --git a/launcher/minecraft/mod/tasks/ModFolderLoadTask.h b/launcher/minecraft/mod/tasks/ModFolderLoadTask.h
index bb66022a..ba997874 100644
--- a/launcher/minecraft/mod/tasks/ModFolderLoadTask.h
+++ b/launcher/minecraft/mod/tasks/ModFolderLoadTask.h
@@ -24,6 +24,10 @@ public:
     void run();
 signals:
     void succeeded();
+
+private:
+    void getFromMetadata();
+
 private:
     QDir& m_mods_dir, m_index_dir;
     ResultPtr m_result;
diff --git a/launcher/ui/pages/global/LauncherPage.cpp b/launcher/ui/pages/global/LauncherPage.cpp
index af2e2cd1..8754c0ec 100644
--- a/launcher/ui/pages/global/LauncherPage.cpp
+++ b/launcher/ui/pages/global/LauncherPage.cpp
@@ -184,6 +184,11 @@ void LauncherPage::on_modsDirBrowseBtn_clicked()
     }
 }
 
+void LauncherPage::on_metadataDisableBtn_clicked()
+{
+    ui->metadataWarningLabel->setHidden(!ui->metadataDisableBtn->isChecked());
+}
+
 void LauncherPage::refreshUpdateChannelList()
 {
     // Stop listening for selection changes. It's going to change a lot while we update it and
@@ -338,6 +343,9 @@ void LauncherPage::applySettings()
         s->set("InstSortMode", "Name");
         break;
     }
+
+    // Mods
+    s->set("DontUseModMetadata", ui->metadataDisableBtn->isChecked());
 }
 void LauncherPage::loadSettings()
 {
@@ -440,6 +448,10 @@ void LauncherPage::loadSettings()
     {
         ui->sortByNameBtn->setChecked(true);
     }
+
+    // Mods
+    ui->metadataDisableBtn->setChecked(s->get("DontUseModMetadata").toBool());
+    ui->metadataWarningLabel->setHidden(!ui->metadataDisableBtn->isChecked());
 }
 
 void LauncherPage::refreshFontPreview()
diff --git a/launcher/ui/pages/global/LauncherPage.h b/launcher/ui/pages/global/LauncherPage.h
index bbf5d2fe..f38c922e 100644
--- a/launcher/ui/pages/global/LauncherPage.h
+++ b/launcher/ui/pages/global/LauncherPage.h
@@ -88,6 +88,7 @@ slots:
     void on_instDirBrowseBtn_clicked();
     void on_modsDirBrowseBtn_clicked();
     void on_iconsDirBrowseBtn_clicked();
+    void on_metadataDisableBtn_clicked();
 
     /*!
      * Updates the list of update channels in the combo box.
diff --git a/launcher/ui/pages/global/LauncherPage.ui b/launcher/ui/pages/global/LauncherPage.ui
index ae7eb73f..417bbe05 100644
--- a/launcher/ui/pages/global/LauncherPage.ui
+++ b/launcher/ui/pages/global/LauncherPage.ui
@@ -94,19 +94,13 @@
           <string>Folders</string>
          </property>
          <layout class="QGridLayout" name="foldersBoxLayout">
-          <item row="0" column="0">
-           <widget class="QLabel" name="labelInstDir">
+          <item row="1" column="2">
+           <widget class="QToolButton" name="modsDirBrowseBtn">
             <property name="text">
-             <string>I&amp;nstances:</string>
-            </property>
-            <property name="buddy">
-             <cstring>instDirTextBox</cstring>
+             <string notr="true">...</string>
             </property>
            </widget>
           </item>
-          <item row="0" column="1">
-           <widget class="QLineEdit" name="instDirTextBox"/>
-          </item>
           <item row="0" column="2">
            <widget class="QToolButton" name="instDirBrowseBtn">
             <property name="text">
@@ -114,43 +108,78 @@
             </property>
            </widget>
           </item>
-          <item row="1" column="0">
-           <widget class="QLabel" name="labelModsDir">
+          <item row="2" column="2">
+           <widget class="QToolButton" name="iconsDirBrowseBtn">
             <property name="text">
-             <string>&amp;Mods:</string>
+             <string notr="true">...</string>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="1">
+           <widget class="QLineEdit" name="instDirTextBox"/>
+          </item>
+          <item row="2" column="0">
+           <widget class="QLabel" name="labelIconsDir">
+            <property name="text">
+             <string>&amp;Icons:</string>
             </property>
             <property name="buddy">
-             <cstring>modsDirTextBox</cstring>
+             <cstring>iconsDirTextBox</cstring>
             </property>
            </widget>
           </item>
           <item row="1" column="1">
            <widget class="QLineEdit" name="modsDirTextBox"/>
           </item>
-          <item row="1" column="2">
-           <widget class="QToolButton" name="modsDirBrowseBtn">
+          <item row="0" column="0">
+           <widget class="QLabel" name="labelInstDir">
             <property name="text">
-             <string notr="true">...</string>
+             <string>I&amp;nstances:</string>
+            </property>
+            <property name="buddy">
+             <cstring>instDirTextBox</cstring>
             </property>
            </widget>
           </item>
           <item row="2" column="1">
            <widget class="QLineEdit" name="iconsDirTextBox"/>
           </item>
-          <item row="2" column="0">
-           <widget class="QLabel" name="labelIconsDir">
+          <item row="1" column="0">
+           <widget class="QLabel" name="labelModsDir">
             <property name="text">
-             <string>&amp;Icons:</string>
+             <string>&amp;Mods:</string>
             </property>
             <property name="buddy">
-             <cstring>iconsDirTextBox</cstring>
+             <cstring>modsDirTextBox</cstring>
             </property>
            </widget>
           </item>
-          <item row="2" column="2">
-           <widget class="QToolButton" name="iconsDirBrowseBtn">
+         </layout>
+        </widget>
+       </item>
+       <item>
+        <widget class="QGroupBox" name="modsBox">
+         <property name="title">
+          <string>Mods</string>
+         </property>
+         <layout class="QVBoxLayout" name="verticalLayout_4">
+          <item>
+           <widget class="QCheckBox" name="metadataDisableBtn">
+            <property name="toolTip">
+             <string>Disable using metadata provided by mod providers (like Modrinth or Curseforge) for mods.</string>
+            </property>
             <property name="text">
-             <string notr="true">...</string>
+             <string>Disable using metadata for mods?</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QLabel" name="metadataWarningLabel">
+            <property name="text">
+             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600; color:#f5c211;&quot;&gt;Warning&lt;/span&gt;&lt;span style=&quot; color:#f5c211;&quot;&gt;: Disabling mod metadata may also disable some upcoming QoL features, such as mod updating!&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+            </property>
+            <property name="wordWrap">
+             <bool>true</bool>
             </property>
            </widget>
           </item>
-- 
cgit