From fd2269ac15257ebb42aaf19c7d217fb93ef16f3a Mon Sep 17 00:00:00 2001
From: swirl <swurl@swurl.xyz>
Date: Thu, 27 Jan 2022 16:54:05 -0500
Subject: Fix meta

---
 CMakeLists.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2af0aa71..11903363 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -66,7 +66,7 @@ set(Launcher_UPDATER_BASE "" CACHE STRING "Base URL for the updater.")
 set(Launcher_NOTIFICATION_URL "" CACHE STRING "URL for checking for notifications.")
 
 # The metadata server
-set(Launcher_META_URL "https://meta.multimc.org/v1/" CACHE STRING "URL to fetch Launcher's meta files from.")
+set(Launcher_META_URL "https://meta.polymc.org/v1/" CACHE STRING "URL to fetch PolyMC's meta files from.")
 
 # paste.ee API key
 set(Launcher_PASTE_EE_API_KEY "utLvciUouSURFzfjPxLBf5W4ISsUX4pwBDF7N1AfZ" CACHE STRING "API key you can get from paste.ee when you register an account")
-- 
cgit 


From 204e3dca22e5d4f14ded50e1dcd3f0af9ff3d88e Mon Sep 17 00:00:00 2001
From: swirl <swurl@swurl.xyz>
Date: Thu, 27 Jan 2022 17:23:50 -0500
Subject: fix version

---
 CMakeLists.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 11903363..b2507a48 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -51,7 +51,7 @@ set(Launcher_NEWS_RSS_URL "https://multimc.org/rss.xml" CACHE STRING "URL to fet
 ######## Set version numbers ########
 set(Launcher_VERSION_MAJOR    1)
 set(Launcher_VERSION_MINOR    0)
-set(Launcher_VERSION_HOTFIX   5)
+set(Launcher_VERSION_HOTFIX   6)
 
 # Build number
 set(Launcher_VERSION_BUILD -1 CACHE STRING "Build number. -1 for no build number.")
-- 
cgit 


From 86935068f522dedbb6673afd7075f156648abbb6 Mon Sep 17 00:00:00 2001
From: timoreo <timo.oreo34@gmail.com>
Date: Fri, 4 Feb 2022 16:24:19 +0100
Subject: Fix wrong mod file name

---
 .../ui/pages/modplatform/flame/FlameModPage.cpp    | 22 +++++++++++----------
 launcher/ui/pages/modplatform/flame/FlameModPage.h |  2 +-
 .../pages/modplatform/modrinth/ModrinthModel.cpp   |  8 ++++++++
 .../ui/pages/modplatform/modrinth/ModrinthPage.cpp | 23 +++++++++++-----------
 .../ui/pages/modplatform/modrinth/ModrinthPage.h   |  2 +-
 5 files changed, 34 insertions(+), 23 deletions(-)

diff --git a/launcher/ui/pages/modplatform/flame/FlameModPage.cpp b/launcher/ui/pages/modplatform/flame/FlameModPage.cpp
index 80f3de19..a816c681 100644
--- a/launcher/ui/pages/modplatform/flame/FlameModPage.cpp
+++ b/launcher/ui/pages/modplatform/flame/FlameModPage.cpp
@@ -140,14 +140,15 @@ void FlameModPage::onSelectionChanged(QModelIndex first, QModelIndex second)
             auto packProfile = ((MinecraftInstance *)m_instance)->getPackProfile();
             QString mcVersion =  packProfile->getComponentVersion("net.minecraft");
             QString loaderString = (packProfile->getComponentVersion("net.minecraftforge").isEmpty()) ? "fabric" : "forge";
-            for(const auto& version : current.versions) {
+            for(int i = 0; i < current.versions.size(); i++) {
+                auto version = current.versions[i];
                 if(!version.mcVersion.contains(mcVersion)){
                     continue;
                 }
-                ui->versionSelectionBox->addItem(version.version, QVariant(version.downloadUrl));
+                ui->versionSelectionBox->addItem(version.version, QVariant(i));
             }
             if(ui->versionSelectionBox->count() == 0){
-                ui->versionSelectionBox->addItem(tr("No Valid Version found!"), QVariant(""));
+                ui->versionSelectionBox->addItem(tr("No Valid Version found!"), QVariant(-1));
             }
 
             suggestCurrent();
@@ -156,11 +157,11 @@ void FlameModPage::onSelectionChanged(QModelIndex first, QModelIndex second)
     }
     else
     {
-        for(auto version : current.versions) {
-            ui->versionSelectionBox->addItem(version.version, QVariant(version.downloadUrl));
+        for(int i = 0; i < current.versions.size(); i++) {
+            ui->versionSelectionBox->addItem(current.versions[i].version, QVariant(i));
         }
         if(ui->versionSelectionBox->count() == 0){
-            ui->versionSelectionBox->addItem(tr("No Valid Version found!"), QVariant(""));
+            ui->versionSelectionBox->addItem(tr("No Valid Version found!"), QVariant(-1));
         }
         suggestCurrent();
     }
@@ -173,22 +174,23 @@ void FlameModPage::suggestCurrent()
         return;
     }
 
-    if (selectedVersion.isEmpty())
+    if (selectedVersion == -1)
     {
         dialog->setSuggestedMod();
         return;
     }
 
-    dialog->setSuggestedMod(current.name, new ModDownloadTask(selectedVersion, current.versions.at(0).fileName ,dialog->mods));
+    auto version = current.versions[selectedVersion];
+    dialog->setSuggestedMod(current.name, new ModDownloadTask(version.downloadUrl, version.fileName , dialog->mods));
 }
 
 void FlameModPage::onVersionSelectionChanged(QString data)
 {
     if(data.isNull() || data.isEmpty())
     {
-        selectedVersion = "";
+        selectedVersion = -1;
         return;
     }
-    selectedVersion = ui->versionSelectionBox->currentData().toString();
+    selectedVersion = ui->versionSelectionBox->currentData().toInt();
     suggestCurrent();
 }
diff --git a/launcher/ui/pages/modplatform/flame/FlameModPage.h b/launcher/ui/pages/modplatform/flame/FlameModPage.h
index 85c68620..8fa3248a 100644
--- a/launcher/ui/pages/modplatform/flame/FlameModPage.h
+++ b/launcher/ui/pages/modplatform/flame/FlameModPage.h
@@ -63,5 +63,5 @@ private:
     FlameMod::ListModel* listModel = nullptr;
     FlameMod::IndexedPack current;
 
-    QString selectedVersion;
+    int selectedVersion = -1;
 };
diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp
index 71574156..5a18830a 100644
--- a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp
+++ b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp
@@ -3,12 +3,14 @@
 #include "minecraft/MinecraftInstance.h"
 #include "minecraft/PackProfile.h"
 #include "ModrinthPage.h"
+#include "ui/dialogs/ModDownloadDialog.h"
 #include <Json.h>
 
 #include <MMCStrings.h>
 #include <Version.h>
 
 #include <QtMath>
+#include <QMessageBox>
 
 
 namespace Modrinth {
@@ -250,6 +252,12 @@ void Modrinth::ListModel::searchRequestFinished()
 
 void Modrinth::ListModel::searchRequestFailed(QString reason)
 {
+    if(jobPtr->first()->m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 409){
+        //409 Gone, notify user to update
+        QMessageBox::critical(nullptr, tr("Error"), tr("Modrinth API version too old!\nPlease update PolyMC!"));
+        //self-destruct
+        ((ModDownloadDialog *)((ModrinthPage *)parent())->parentWidget())->reject();
+    }
     jobPtr.reset();
 
     if(searchState == ResetRequested) {
diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp
index ee3c9e76..c5a54c29 100644
--- a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp
+++ b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp
@@ -125,14 +125,15 @@ void ModrinthPage::onSelectionChanged(QModelIndex first, QModelIndex second)
             auto packProfile = ((MinecraftInstance *)m_instance)->getPackProfile();
             QString mcVersion =  packProfile->getComponentVersion("net.minecraft");
             QString loaderString = (packProfile->getComponentVersion("net.minecraftforge").isEmpty()) ? "fabric" : "forge";
-            for(const auto& version : current.versions) {
+            for(int i = 0; i < current.versions.size(); i++) {
+                auto version = current.versions[i];
                 if(!version.mcVersion.contains(mcVersion) || !version.loaders.contains(loaderString)){
                     continue;
                 }
-                ui->versionSelectionBox->addItem(version.version, QVariant(version.downloadUrl));
+                ui->versionSelectionBox->addItem(version.version, QVariant(i));
             }
             if(ui->versionSelectionBox->count() == 0){
-                ui->versionSelectionBox->addItem(tr("No Valid Version found !"), QVariant(""));
+                ui->versionSelectionBox->addItem(tr("No Valid Version found !"), QVariant(-1));
             }
 
             suggestCurrent();
@@ -141,11 +142,11 @@ void ModrinthPage::onSelectionChanged(QModelIndex first, QModelIndex second)
     }
     else
     {
-        for(auto version : current.versions) {
-            ui->versionSelectionBox->addItem(version.version, QVariant(version.downloadUrl));
+        for(int i = 0; i < current.versions.size(); i++) {
+            ui->versionSelectionBox->addItem(current.versions[i].version, QVariant(i));
         }
         if(ui->versionSelectionBox->count() == 0){
-            ui->versionSelectionBox->addItem(tr("No Valid Version found !"), QVariant(""));
+            ui->versionSelectionBox->addItem(tr("No Valid Version found !"), QVariant(-1));
         }
         suggestCurrent();
     }
@@ -158,22 +159,22 @@ void ModrinthPage::suggestCurrent()
         return;
     }
 
-    if (selectedVersion.isEmpty())
+    if (selectedVersion == -1)
     {
         dialog->setSuggestedMod();
         return;
     }
-
-    dialog->setSuggestedMod(current.name, new ModDownloadTask(selectedVersion, current.versions.at(0).fileName ,dialog->mods));
+    auto version = current.versions[selectedVersion];
+    dialog->setSuggestedMod(current.name, new ModDownloadTask(version.downloadUrl, version.fileName , dialog->mods));
 }
 
 void ModrinthPage::onVersionSelectionChanged(QString data)
 {
     if(data.isNull() || data.isEmpty())
     {
-        selectedVersion = "";
+        selectedVersion = -1;
         return;
     }
-    selectedVersion = ui->versionSelectionBox->currentData().toString();
+    selectedVersion = ui->versionSelectionBox->currentData().toInt();
     suggestCurrent();
 }
diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.h b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.h
index 3748d836..3c517069 100644
--- a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.h
+++ b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.h
@@ -63,5 +63,5 @@ private:
     Modrinth::ListModel* listModel = nullptr;
     Modrinth::IndexedPack current;
 
-    QString selectedVersion;
+    int selectedVersion = -1;
 };
-- 
cgit 


From e806903d7e611d44c13118eb998140277a7e4ee1 Mon Sep 17 00:00:00 2001
From: glowiak <52356948+glowiak@users.noreply.github.com>
Date: Sun, 6 Feb 2022 09:32:55 +0100
Subject: Support OpenBSD without patches

---
 launcher/tools/MCEditTool.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/launcher/tools/MCEditTool.cpp b/launcher/tools/MCEditTool.cpp
index 21e1a3b0..2c1ec613 100644
--- a/launcher/tools/MCEditTool.cpp
+++ b/launcher/tools/MCEditTool.cpp
@@ -52,7 +52,7 @@ QString MCEditTool::getProgramPath()
 #else
     const QString mceditPath = path();
     QDir mceditDir(mceditPath);
-#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
+#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD)
     if (mceditDir.exists("mcedit.sh"))
     {
         return mceditDir.absoluteFilePath("mcedit.sh");
-- 
cgit 


From dba9199e58aa08faa22682705b3137684c385fcf Mon Sep 17 00:00:00 2001
From: glowiak <52356948+glowiak@users.noreply.github.com>
Date: Sun, 6 Feb 2022 09:35:48 +0100
Subject: Support OpenBSD in UpdateController.cpp

---
 launcher/UpdateController.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/launcher/UpdateController.cpp b/launcher/UpdateController.cpp
index f9b7d349..c02cd1e7 100644
--- a/launcher/UpdateController.cpp
+++ b/launcher/UpdateController.cpp
@@ -93,7 +93,7 @@ void UpdateController::installUpdates()
     qDebug() << "Installing updates.";
 #ifdef Q_OS_WIN
     QString finishCmd = QApplication::applicationFilePath();
-#elif defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
+#elif defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined (Q_OS_OPENBSD)
     QString finishCmd = FS::PathCombine(m_root, BuildConfig.LAUNCHER_NAME);
 #elif defined Q_OS_MAC
     QString finishCmd = QApplication::applicationFilePath();
-- 
cgit 


From ca1a2bbe2cda64859b45e256576f01ce98043e92 Mon Sep 17 00:00:00 2001
From: glowiak <52356948+glowiak@users.noreply.github.com>
Date: Sun, 6 Feb 2022 09:38:26 +0100
Subject: Add OpenBSD instructions

---
 BUILD.md | 42 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 41 insertions(+), 1 deletion(-)

diff --git a/BUILD.md b/BUILD.md
index 9872e9e7..e66dc7e1 100644
--- a/BUILD.md
+++ b/BUILD.md
@@ -20,7 +20,7 @@ git submodule update
 
 The rest of the documentation assumes you have already cloned the repository.
 
-# Linux
+# Linux and FreeBSD
 
 Getting the project to build and run on Linux is easy if you use any modern and up-to-date linux distribution.
 
@@ -273,3 +273,43 @@ Remember to replace `/path/to/Qt/` with the actual path. For newer Qt installati
 
 **Note:** The final app bundle may not run due to code signing issues, which
 need to be fixed with `codesign -fs -`.
+
+# OpenBSD
+
+Getting the project to build and run on Linux is easy if you use any modern and up-to-date linux distribution.
+
+## Build dependencies
+- A C++ compiler capable of building C++11 code.
+- Qt Development tools 5.6 or newer (`qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools libqt5core5a libqt5network5 libqt5gui5` on Debian-based system)
+- cmake 3.1 or newer (`cmake` on Debian-based system)
+- zlib (`zlib1g-dev` on Debian-based system)
+- Java JDK (`openjdk-17-jdk`on Debian-based system)
+- GL headers (`libgl1-mesa-dev` on Debian-based system)
+
+You can use IDEs like KDevelop or QtCreator to open the CMake project if you want to work on the code.
+
+### Building a portable binary
+
+```sh
+mkdir install
+# configure the project
+cmake -S . -B build \
+   -DCMAKE_INSTALL_PREFIX=./install -DCMAKE_PREFIX_PATH=/usr/local/lib/qt5/cmake
+# build
+cd build
+make -j$(nproc) install
+```
+
+### Building & Installing to the System
+
+This is the preferred method for installation, and is suitable for packages.
+
+```sh
+# configure everything
+cmake -S . -B build \
+   -DCMAKE_BUILD_TYPE=Release \
+   -DCMAKE_INSTALL_PREFIX="/usr" \ # Use "/usr" for packages, otherwise, leave it at the default "/usr/local".
+   -DLauncher_LAYOUT=lin-system -DCMAKE_PREFIX_PATH=/usr/local/lib/qt5/cmake
+cd build
+make -j$(nproc) install # Optionally specify DESTDIR for packages (i.e. DESTDIR=${pkgdir})
+```
-- 
cgit 


From f31d5372e7c5f53261df502d58472e7a76e08eed Mon Sep 17 00:00:00 2001
From: glowiak <52356948+glowiak@users.noreply.github.com>
Date: Sun, 6 Feb 2022 09:39:14 +0100
Subject: Update BUILD.md

---
 BUILD.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/BUILD.md b/BUILD.md
index e66dc7e1..a11b3c65 100644
--- a/BUILD.md
+++ b/BUILD.md
@@ -276,7 +276,7 @@ need to be fixed with `codesign -fs -`.
 
 # OpenBSD
 
-Getting the project to build and run on Linux is easy if you use any modern and up-to-date linux distribution.
+Tested on OpenBSD 7.0-alpha i386, on older should work too
 
 ## Build dependencies
 - A C++ compiler capable of building C++11 code.
-- 
cgit 


From 305350fdc8b21d7ac335f29d64708ff255dce1c9 Mon Sep 17 00:00:00 2001
From: glowiak <52356948+glowiak@users.noreply.github.com>
Date: Sun, 6 Feb 2022 09:41:13 +0100
Subject: Update BUILD.md

---
 BUILD.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/BUILD.md b/BUILD.md
index a11b3c65..068872e1 100644
--- a/BUILD.md
+++ b/BUILD.md
@@ -22,7 +22,7 @@ The rest of the documentation assumes you have already cloned the repository.
 
 # Linux and FreeBSD
 
-Getting the project to build and run on Linux is easy if you use any modern and up-to-date linux distribution.
+Getting the project to build and run on Linux is easy if you use any modern and up-to-date linux distribution. If you're using FreeBSD you should use 13.0-RELEASE or newer.
 
 ## Build dependencies
 - A C++ compiler capable of building C++11 code.
@@ -31,6 +31,7 @@ Getting the project to build and run on Linux is easy if you use any modern and
 - zlib (`zlib1g-dev` on Debian-based system)
 - Java JDK (`openjdk-17-jdk`on Debian-based system)
 - GL headers (`libgl1-mesa-dev` on Debian-based system)
+- games/lwjgl port if using FreeBSD
 
 You can use IDEs like KDevelop or QtCreator to open the CMake project if you want to work on the code.
 
-- 
cgit 


From dd8946b15a833e72b5b6f0c8160ddf1f2b3867a6 Mon Sep 17 00:00:00 2001
From: glowiak <52356948+glowiak@users.noreply.github.com>
Date: Sun, 6 Feb 2022 12:03:17 +0100
Subject: Update BUILD.md

---
 BUILD.md | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/BUILD.md b/BUILD.md
index 068872e1..2f4f34fb 100644
--- a/BUILD.md
+++ b/BUILD.md
@@ -280,12 +280,13 @@ need to be fixed with `codesign -fs -`.
 Tested on OpenBSD 7.0-alpha i386, on older should work too
 
 ## Build dependencies
-- A C++ compiler capable of building C++11 code.
-- Qt Development tools 5.6 or newer (`qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools libqt5core5a libqt5network5 libqt5gui5` on Debian-based system)
-- cmake 3.1 or newer (`cmake` on Debian-based system)
-- zlib (`zlib1g-dev` on Debian-based system)
-- Java JDK (`openjdk-17-jdk`on Debian-based system)
-- GL headers (`libgl1-mesa-dev` on Debian-based system)
+- A C++ compiler capable of building C++11 code (included in base system)
+- Qt Development tools 5.6 or newer ([meta/qt5](https://openports.se/meta/qt5))
+- cmake 3.1 or newer ([devel/cmake](https://openports.se/devel/cmake))
+- zlib (included in base system)
+- Java JDK ([devel/jdk-1.8](https://openports.se/devel/jdk/1.8))
+- GL headers (included in base system)
+- lwjgl ([games/lwjgl](https://openports.se/games/lwjgl) and [games/lwjgl3](https://openports.se/games/lwjgl3))
 
 You can use IDEs like KDevelop or QtCreator to open the CMake project if you want to work on the code.
 
-- 
cgit 


From f25152e068e301b31dc35cf38c4a72d96a5c7698 Mon Sep 17 00:00:00 2001
From: glowiak <52356948+glowiak@users.noreply.github.com>
Date: Sun, 6 Feb 2022 12:06:08 +0100
Subject: Update BUILD.md

---
 BUILD.md | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/BUILD.md b/BUILD.md
index 2f4f34fb..f21b6e7a 100644
--- a/BUILD.md
+++ b/BUILD.md
@@ -55,7 +55,7 @@ This is the preferred method for installation, and is suitable for packages.
 # configure everything
 cmake -S . -B build \
    -DCMAKE_BUILD_TYPE=Release \
-   -DCMAKE_INSTALL_PREFIX="/usr" \ # Use "/usr" for packages, otherwise, leave it at the default "/usr/local".
+   -DCMAKE_INSTALL_PREFIX="/usr" \ # Replace /usr with /usr/local when building on FreeBSD
    -DLauncher_LAYOUT=lin-system
 cd build
 make -j$(nproc) install # Optionally specify DESTDIR for packages (i.e. DESTDIR=${pkgdir})
@@ -73,7 +73,7 @@ makedeb -s
 
 The deb will be located in the directory the repo was cloned in.
 
-### Building a .rpm
+### Building an .rpm
 
 Build dependencies are automatically installed using `dnf`, but you do need the `rpmdevtools` package (on Fedora)
 in order to fetch sources and setup your tree.  
@@ -310,8 +310,8 @@ This is the preferred method for installation, and is suitable for packages.
 # configure everything
 cmake -S . -B build \
    -DCMAKE_BUILD_TYPE=Release \
-   -DCMAKE_INSTALL_PREFIX="/usr" \ # Use "/usr" for packages, otherwise, leave it at the default "/usr/local".
-   -DLauncher_LAYOUT=lin-system -DCMAKE_PREFIX_PATH=/usr/local/lib/qt5/cmake
+   -DCMAKE_INSTALL_PREFIX="/usr/local" \ # /usr/local is default in OpenBSD and FreeBSD
+   -DLauncher_LAYOUT=lin-system -DCMAKE_PREFIX_PATH=/usr/local/lib/qt5/cmake # use linux layout and point to qt5 libs
 cd build
 make -j$(nproc) install # Optionally specify DESTDIR for packages (i.e. DESTDIR=${pkgdir})
 ```
-- 
cgit 


From d35cbfd9c4e3917f24dad94e00f787bbf6c1fcf9 Mon Sep 17 00:00:00 2001
From: glowiak <52356948+glowiak@users.noreply.github.com>
Date: Sun, 6 Feb 2022 12:11:20 +0100
Subject: Add Slackware instructions

---
 BUILD.md | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/BUILD.md b/BUILD.md
index f21b6e7a..5b1fb20d 100644
--- a/BUILD.md
+++ b/BUILD.md
@@ -95,6 +95,15 @@ rpmbuild -bb polymc.spec
 
 The path to the rpm packages will be printed when the build is complete.
 
+### Building a Slackware package
+
+To build a Slackware package, first install [qt5 SlackBuild](http://slackbuilds.org/repository/14.2/libraries/qt5/) (on 15.0 and newer installed by defualt), then set up a [JDK](https://codeberg.org/glowiak/SlackBuilds/raw/branch/master/tgz/adoptium-jdk8.tar.gz). Next, download the [SlackBuild](https://codeberg.org/glowiak/SlackBuilds/raw/branch/master/tgz/polymc.tar.gz), unpack it and type in extracted directory:
+
+```
+sudo ./polymc.SlackBuild # script will do everything, just sit up and wait
+sudo /sbin/installpkg /tmp/polymc-version-arch-1_SBo.tgz # install the created package
+```
+
 ### Building a flatpak
 
 You don't need to clone the entire PolyMC repo for this; the flatpak file handles that.  
-- 
cgit 


From b646fc5a13d1c564fe2317811ae23d23b9cd6ff9 Mon Sep 17 00:00:00 2001
From: glowiak <52356948+glowiak@users.noreply.github.com>
Date: Sun, 6 Feb 2022 12:18:39 +0100
Subject: Update build instructions for Slackware 14.2

---
 BUILD.md | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/BUILD.md b/BUILD.md
index 5b1fb20d..c6b7b809 100644
--- a/BUILD.md
+++ b/BUILD.md
@@ -97,7 +97,22 @@ The path to the rpm packages will be printed when the build is complete.
 
 ### Building a Slackware package
 
-To build a Slackware package, first install [qt5 SlackBuild](http://slackbuilds.org/repository/14.2/libraries/qt5/) (on 15.0 and newer installed by defualt), then set up a [JDK](https://codeberg.org/glowiak/SlackBuilds/raw/branch/master/tgz/adoptium-jdk8.tar.gz). Next, download the [SlackBuild](https://codeberg.org/glowiak/SlackBuilds/raw/branch/master/tgz/polymc.tar.gz), unpack it and type in extracted directory:
+To build a Slackware package, first install [qt5 SlackBuild](http://slackbuilds.org/repository/14.2/libraries/qt5/) (on 15.0 and newer installed by defualt), then set up a [JDK](https://codeberg.org/glowiak/SlackBuilds/raw/branch/master/tgz/adoptium-jdk8.tar.gz).
+
+If you're using Slackware 14.2, update cmake with these commands:
+
+```
+mkdir -p /tmp/SBo
+cd /tmp/SBo
+wget -c https://github.com/Kitware/CMake/releases/download/v3.22.2/cmake-3.22.2.tar.gz
+tar xzvf cmake-3.22.2.tar.gz
+cd cmake-3.22.2
+./configure --prefix=/usr
+make
+sudo make install
+```
+
+Next, download the [SlackBuild](https://codeberg.org/glowiak/SlackBuilds/raw/branch/master/tgz/polymc.tar.gz), unpack it and type in extracted directory:
 
 ```
 sudo ./polymc.SlackBuild # script will do everything, just sit up and wait
-- 
cgit 


From b2b4ab3f0ce0efdd2ee5524c3e0e754a815f4a48 Mon Sep 17 00:00:00 2001
From: glowiak <52356948+glowiak@users.noreply.github.com>
Date: Mon, 7 Feb 2022 10:11:36 +0100
Subject: Update BUILD.md

---
 BUILD.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/BUILD.md b/BUILD.md
index c6b7b809..3b6e6446 100644
--- a/BUILD.md
+++ b/BUILD.md
@@ -55,7 +55,7 @@ This is the preferred method for installation, and is suitable for packages.
 # configure everything
 cmake -S . -B build \
    -DCMAKE_BUILD_TYPE=Release \
-   -DCMAKE_INSTALL_PREFIX="/usr" \ # Replace /usr with /usr/local when building on FreeBSD
+   -DCMAKE_INSTALL_PREFIX="/usr" \ # Use "/usr" when building Linux packages. If building on FreeBSD or not for package, use "/usr/local"
    -DLauncher_LAYOUT=lin-system
 cd build
 make -j$(nproc) install # Optionally specify DESTDIR for packages (i.e. DESTDIR=${pkgdir})
-- 
cgit 


From 5284d604ef1c56df6cbc9f70d109a35bb459fae2 Mon Sep 17 00:00:00 2001
From: Lenny McLennington <lennymclennington@protonmail.com>
Date: Wed, 9 Feb 2022 00:02:51 +0000
Subject: translations

---
 buildconfig/BuildConfig.h                   | 2 +-
 launcher/translations/TranslationsModel.cpp | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/buildconfig/BuildConfig.h b/buildconfig/BuildConfig.h
index d09d5288..c260b988 100644
--- a/buildconfig/BuildConfig.h
+++ b/buildconfig/BuildConfig.h
@@ -91,7 +91,7 @@ public:
     QString AUTH_BASE = "https://authserver.mojang.com/";
     QString IMGUR_BASE_URL = "https://api.imgur.com/3/";
     QString FMLLIBS_BASE_URL = "https://files.multimc.org/fmllibs/";
-    QString TRANSLATIONS_BASE_URL = "https://files.multimc.org/translations/";
+    QString TRANSLATIONS_BASE_URL = "https://meta.polymc.org/translations/";
 
     QString MODPACKSCH_API_BASE_URL = "https://api.modpacks.ch/";
 
diff --git a/launcher/translations/TranslationsModel.cpp b/launcher/translations/TranslationsModel.cpp
index 0fa82e35..250854d3 100644
--- a/launcher/translations/TranslationsModel.cpp
+++ b/launcher/translations/TranslationsModel.cpp
@@ -620,7 +620,7 @@ void TranslationsModel::downloadIndex()
     d->m_index_job = new NetJob("Translations Index", APPLICATION->network());
     MetaEntryPtr entry = APPLICATION->metacache()->resolveEntry("translations", "index_v2.json");
     entry->setStale(true);
-    d->m_index_task = Net::Download::makeCached(QUrl("https://files.multimc.org/translations/index_v2.json"), entry);
+    d->m_index_task = Net::Download::makeCached(QUrl(BuildConfig.TRANSLATIONS_BASE_URL + "index_v2.json"), entry);
     d->m_index_job->addNetAction(d->m_index_task);
     connect(d->m_index_job.get(), &NetJob::failed, this, &TranslationsModel::indexFailed);
     connect(d->m_index_job.get(), &NetJob::succeeded, this, &TranslationsModel::indexReceived);
-- 
cgit 


From 901ec15dc87b4edd3b78b210846547afc887be7c Mon Sep 17 00:00:00 2001
From: dada513 <dada513@protonmail.com>
Date: Wed, 9 Feb 2022 08:19:34 +0100
Subject: Update metadata

---
 CMakeLists.txt                                 |  2 +
 program_info/org.polymc.PolyMC.metainfo.xml.in | 54 +++++++++++---------------
 2 files changed, 25 insertions(+), 31 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 738a1a5a..50aaeea3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -94,6 +94,8 @@ message(STATUS "Git commit: ${Launcher_GIT_COMMIT}")
 message(STATUS "Git refspec: ${Launcher_GIT_REFSPEC}")
 
 set(Launcher_RELEASE_VERSION_NAME "${Launcher_VERSION_MAJOR}.${Launcher_VERSION_MINOR}.${Launcher_VERSION_HOTFIX}")
+string(TIMESTAMP TODAY "%Y-%m-%d")
+set(Launcher_RELEASE_TIMESTAMP "${TODAY}")
 
 #### Custom target to just print the version.
 add_custom_target(version echo "Version: ${Launcher_RELEASE_VERSION_NAME}")
diff --git a/program_info/org.polymc.PolyMC.metainfo.xml.in b/program_info/org.polymc.PolyMC.metainfo.xml.in
index 505ca70d..070817e5 100644
--- a/program_info/org.polymc.PolyMC.metainfo.xml.in
+++ b/program_info/org.polymc.PolyMC.metainfo.xml.in
@@ -4,7 +4,7 @@
   <provides>
     <id>org.polymc.PolyMC</id>
   </provides>
-  <launchable type="desktop-id">org.polymc.PolyMC.desktop</launchable>
+  <launchable type="desktop-id">org.polymc.polymc.desktop</launchable>
   <name>PolyMC</name>
   <developer_name>PolyMC Team</developer_name>
   <summary>A custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once</summary>
@@ -22,44 +22,36 @@
       <li>See logs and other details easily</li>
       <li>Kill Minecraft in case of a crash/freeze</li>
       <li>Isolate minecraft instances to keep everything clean</li>
+      <li>Install mods directly from the launcher</li>
     </ul>
-    <p>For flatpak users:</p>
-    <p>In flatpak, all java versions that are required by Minecraft are included.</p>
-    <p>
-      If using a Hybrid-Graphics device, you can use the
-      prime-run
-      script as a wrapper command to run Minecraft using the dedicated graphics card.
-    </p>
   </description>
   <screenshots>
     <screenshot type="default">
       <caption>The main PolyMC window</caption>
-      <image type="source" width="802" height="639">https://i.imgur.com/q2GcDo4.png</image>
+      <image type="source" width="1011" height="994">https://polymc.github.io/polymc.org/assets/img/screenshots/LauncherDark.png</image>
+    </screenshot>
+    <screenshot type="">
+      <caption>Modpack installation</caption>
+      <image type="source" width="911" height="682">https://polymc.github.io/polymc.org/assets/img/screenshots/ModpackInstallDark.png</image>
+    </screenshot>
+    <screenshot type="">
+      <caption>Mod installation</caption>
+      <image type="source" width="987" height="723">https://polymc.github.io/polymc.org/assets/img/screenshots/ModInstallDark.png</image>
+    </screenshot>
+    <screenshot>
+      <caption>Instance management</caption>
+      <image type="source" width="902" height="920">https://polymc.github.io/polymc.org/assets/img/screenshots/PropertiesDark.png</image>
+    </screenshot>
+    <screenshot>
+      <caption>Cat :)</caption>
+      <image type="source" width="1011" height="994">https://polymc.github.io/polymc.org/assets/img/screenshots/LauncherCatDark.png</image>
     </screenshot>
   </screenshots>
   <releases>
-    <release version="@Launcher_RELEASE_VERSION_NAME@" date="2022-01-01" />
+    <release version="@Launcher_RELEASE_VERSION_NAME@" date="@Launcher_RELEASE_TIMESTAMP@"></release>
   </releases>
-  <content_rating type="oars-1.0">
-    <content_attribute id="violence-cartoon">moderate</content_attribute>
-    <content_attribute id="violence-fantasy">none</content_attribute>
-    <content_attribute id="violence-realistic">none</content_attribute>
-    <content_attribute id="violence-bloodshed">none</content_attribute>
-    <content_attribute id="violence-sexual">none</content_attribute>
-    <content_attribute id="drugs-alcohol">none</content_attribute>
-    <content_attribute id="drugs-narcotics">none</content_attribute>
-    <content_attribute id="drugs-tobacco">none</content_attribute>
-    <content_attribute id="sex-nudity">none</content_attribute>
-    <content_attribute id="sex-themes">none</content_attribute>
-    <content_attribute id="language-profanity">none</content_attribute>
-    <content_attribute id="language-humor">none</content_attribute>
-    <content_attribute id="language-discrimination">none</content_attribute>
+  <content_rating type="oars-1.1">
+    <content_attribute id="violence-fantasy">moderate</content_attribute>
     <content_attribute id="social-chat">intense</content_attribute>
-    <content_attribute id="social-info">none</content_attribute>
-    <content_attribute id="social-audio">none</content_attribute>
-    <content_attribute id="social-location">none</content_attribute>
-    <content_attribute id="social-contacts">none</content_attribute>
-    <content_attribute id="money-purchasing">none</content_attribute>
-    <content_attribute id="money-gambling">none</content_attribute>
   </content_rating>
-</component>
+</component>
\ No newline at end of file
-- 
cgit 


From 08dff6613bf62d15ef7447f0b2d39ec20ca88fdb Mon Sep 17 00:00:00 2001
From: dada513 <dada513@protonmail.com>
Date: Wed, 9 Feb 2022 08:21:51 +0100
Subject: remove redundant data

---
 program_info/org.polymc.PolyMC.metainfo.xml.in | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/program_info/org.polymc.PolyMC.metainfo.xml.in b/program_info/org.polymc.PolyMC.metainfo.xml.in
index 070817e5..a18650b6 100644
--- a/program_info/org.polymc.PolyMC.metainfo.xml.in
+++ b/program_info/org.polymc.PolyMC.metainfo.xml.in
@@ -30,11 +30,11 @@
       <caption>The main PolyMC window</caption>
       <image type="source" width="1011" height="994">https://polymc.github.io/polymc.org/assets/img/screenshots/LauncherDark.png</image>
     </screenshot>
-    <screenshot type="">
+    <screenshot>
       <caption>Modpack installation</caption>
       <image type="source" width="911" height="682">https://polymc.github.io/polymc.org/assets/img/screenshots/ModpackInstallDark.png</image>
     </screenshot>
-    <screenshot type="">
+    <screenshot>
       <caption>Mod installation</caption>
       <image type="source" width="987" height="723">https://polymc.github.io/polymc.org/assets/img/screenshots/ModInstallDark.png</image>
     </screenshot>
-- 
cgit 


From d2f86cbf32aa4a41b920b70254ca3ae0380a5065 Mon Sep 17 00:00:00 2001
From: Victor <virb3e@gmail.com>
Date: Thu, 30 Dec 2021 22:08:15 +0200
Subject: Move app data to Application Support

---
 launcher/Application.cpp | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/launcher/Application.cpp b/launcher/Application.cpp
index 7050e5dc..6abe1838 100644
--- a/launcher/Application.cpp
+++ b/launcher/Application.cpp
@@ -311,7 +311,7 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv)
         dataPath = xdgDataHome + "/polymc";
         adjustedBy += "XDG standard " + dataPath;
 #elif defined(Q_OS_MAC)
-        QDir foo(FS::PathCombine(applicationDirPath(), "../../Data"));
+        QDir foo(FS::PathCombine(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation), ".."));
         dataPath = foo.absolutePath();
         adjustedBy += "Fallback to special Mac location " + dataPath;
 #else
@@ -529,10 +529,8 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv)
 #elif defined(Q_OS_WIN32)
         m_rootPath = binPath;
 #elif defined(Q_OS_MAC)
-        QDir foo(FS::PathCombine(binPath, "../.."));
+        QDir foo(FS::PathCombine(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation), ".."));
         m_rootPath = foo.absolutePath();
-        // on macOS, touch the root to force Finder to reload the .app metadata (and fix any icon change issues)
-        FS::updateTimestamp(m_rootPath);
 #endif
 
 #ifdef MULTIMC_JARS_LOCATION
-- 
cgit 


From 5b507a894435f3c266d9ba5e8463c29349706e80 Mon Sep 17 00:00:00 2001
From: Lenny McLennington <lennymclennington@protonmail.com>
Date: Wed, 9 Feb 2022 22:59:21 +0000
Subject: Add info about translating PolyMC to the README

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 5c23444b..6f15ad0d 100644
--- a/README.md
+++ b/README.md
@@ -138,7 +138,7 @@ In general, in order of importance:
 
 ## Translations
 
-TODO
+The translation effort for PolyMC is hosted on [Weblate](https://hosted.weblate.org/polymc/polymc and information about translating PolyMC is available at https://github.com/PolyMC/Translations
 
 ## Forking/Redistributing/Custom builds policy
 
-- 
cgit 


From 7531a2894b152c0efdaf4e259407b4a752410503 Mon Sep 17 00:00:00 2001
From: Lenny McLennington <lennymclennington@protonmail.com>
Date: Wed, 9 Feb 2022 23:13:33 +0000
Subject: Missed a closing parenthesis in README.md, oops.

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 6f15ad0d..ef95f6dd 100644
--- a/README.md
+++ b/README.md
@@ -138,7 +138,7 @@ In general, in order of importance:
 
 ## Translations
 
-The translation effort for PolyMC is hosted on [Weblate](https://hosted.weblate.org/polymc/polymc and information about translating PolyMC is available at https://github.com/PolyMC/Translations
+The translation effort for PolyMC is hosted on [Weblate](https://hosted.weblate.org/polymc/polymc) and information about translating PolyMC is available at https://github.com/PolyMC/Translations
 
 ## Forking/Redistributing/Custom builds policy
 
-- 
cgit 


From b9111517862e58db865c2eee2cc2bebbac46d0e9 Mon Sep 17 00:00:00 2001
From: helpimnotdrowning <35247379+helpimnotdrowning@users.noreply.github.com>
Date: Wed, 9 Feb 2022 21:40:57 -0600
Subject: Fix Weblate link in README

original link was missing /projects/ dir and leading to a nonexistant page
---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index ef95f6dd..ba7f9914 100644
--- a/README.md
+++ b/README.md
@@ -138,7 +138,7 @@ In general, in order of importance:
 
 ## Translations
 
-The translation effort for PolyMC is hosted on [Weblate](https://hosted.weblate.org/polymc/polymc) and information about translating PolyMC is available at https://github.com/PolyMC/Translations
+The translation effort for PolyMC is hosted on [Weblate](https://hosted.weblate.org/projects/polymc/polymc/) and information about translating PolyMC is available at https://github.com/PolyMC/Translations
 
 ## Forking/Redistributing/Custom builds policy
 
-- 
cgit 


From 8b68c06547f6f8f5bef621cc0a380fbb924b2695 Mon Sep 17 00:00:00 2001
From: Ezekiel Smith <ezekielsmith@protonmail.com>
Date: Thu, 10 Feb 2022 13:58:19 +1000
Subject: License for assets

The PolyMC logo and assets are licensed under the CC BY-NC-SA 4.0 having it in this folder should help to clear this up.
---
 program_info/LICENSE | 437 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 437 insertions(+)
 create mode 100644 program_info/LICENSE

diff --git a/program_info/LICENSE b/program_info/LICENSE
new file mode 100644
index 00000000..d60efe46
--- /dev/null
+++ b/program_info/LICENSE
@@ -0,0 +1,437 @@
+Attribution-NonCommercial-ShareAlike 4.0 International
+
+=======================================================================
+
+Creative Commons Corporation ("Creative Commons") is not a law firm and
+does not provide legal services or legal advice. Distribution of
+Creative Commons public licenses does not create a lawyer-client or
+other relationship. Creative Commons makes its licenses and related
+information available on an "as-is" basis. Creative Commons gives no
+warranties regarding its licenses, any material licensed under their
+terms and conditions, or any related information. Creative Commons
+disclaims all liability for damages resulting from their use to the
+fullest extent possible.
+
+Using Creative Commons Public Licenses
+
+Creative Commons public licenses provide a standard set of terms and
+conditions that creators and other rights holders may use to share
+original works of authorship and other material subject to copyright
+and certain other rights specified in the public license below. The
+following considerations are for informational purposes only, are not
+exhaustive, and do not form part of our licenses.
+
+     Considerations for licensors: Our public licenses are
+     intended for use by those authorized to give the public
+     permission to use material in ways otherwise restricted by
+     copyright and certain other rights. Our licenses are
+     irrevocable. Licensors should read and understand the terms
+     and conditions of the license they choose before applying it.
+     Licensors should also secure all rights necessary before
+     applying our licenses so that the public can reuse the
+     material as expected. Licensors should clearly mark any
+     material not subject to the license. This includes other CC-
+     licensed material, or material used under an exception or
+     limitation to copyright. More considerations for licensors:
+	wiki.creativecommons.org/Considerations_for_licensors
+
+     Considerations for the public: By using one of our public
+     licenses, a licensor grants the public permission to use the
+     licensed material under specified terms and conditions. If
+     the licensor's permission is not necessary for any reason--for
+     example, because of any applicable exception or limitation to
+     copyright--then that use is not regulated by the license. Our
+     licenses grant only permissions under copyright and certain
+     other rights that a licensor has authority to grant. Use of
+     the licensed material may still be restricted for other
+     reasons, including because others have copyright or other
+     rights in the material. A licensor may make special requests,
+     such as asking that all changes be marked or described.
+     Although not required by our licenses, you are encouraged to
+     respect those requests where reasonable. More_considerations
+     for the public: 
+	wiki.creativecommons.org/Considerations_for_licensees
+
+=======================================================================
+
+Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
+Public License
+
+By exercising the Licensed Rights (defined below), You accept and agree
+to be bound by the terms and conditions of this Creative Commons
+Attribution-NonCommercial-ShareAlike 4.0 International Public License
+("Public License"). To the extent this Public License may be
+interpreted as a contract, You are granted the Licensed Rights in
+consideration of Your acceptance of these terms and conditions, and the
+Licensor grants You such rights in consideration of benefits the
+Licensor receives from making the Licensed Material available under
+these terms and conditions.
+
+
+Section 1 -- Definitions.
+
+  a. Adapted Material means material subject to Copyright and Similar
+     Rights that is derived from or based upon the Licensed Material
+     and in which the Licensed Material is translated, altered,
+     arranged, transformed, or otherwise modified in a manner requiring
+     permission under the Copyright and Similar Rights held by the
+     Licensor. For purposes of this Public License, where the Licensed
+     Material is a musical work, performance, or sound recording,
+     Adapted Material is always produced where the Licensed Material is
+     synched in timed relation with a moving image.
+
+  b. Adapter's License means the license You apply to Your Copyright
+     and Similar Rights in Your contributions to Adapted Material in
+     accordance with the terms and conditions of this Public License.
+
+  c. BY-NC-SA Compatible License means a license listed at
+     creativecommons.org/compatiblelicenses, approved by Creative
+     Commons as essentially the equivalent of this Public License.
+
+  d. Copyright and Similar Rights means copyright and/or similar rights
+     closely related to copyright including, without limitation,
+     performance, broadcast, sound recording, and Sui Generis Database
+     Rights, without regard to how the rights are labeled or
+     categorized. For purposes of this Public License, the rights
+     specified in Section 2(b)(1)-(2) are not Copyright and Similar
+     Rights.
+
+  e. Effective Technological Measures means those measures that, in the
+     absence of proper authority, may not be circumvented under laws
+     fulfilling obligations under Article 11 of the WIPO Copyright
+     Treaty adopted on December 20, 1996, and/or similar international
+     agreements.
+
+  f. Exceptions and Limitations means fair use, fair dealing, and/or
+     any other exception or limitation to Copyright and Similar Rights
+     that applies to Your use of the Licensed Material.
+
+  g. License Elements means the license attributes listed in the name
+     of a Creative Commons Public License. The License Elements of this
+     Public License are Attribution, NonCommercial, and ShareAlike.
+
+  h. Licensed Material means the artistic or literary work, database,
+     or other material to which the Licensor applied this Public
+     License.
+
+  i. Licensed Rights means the rights granted to You subject to the
+     terms and conditions of this Public License, which are limited to
+     all Copyright and Similar Rights that apply to Your use of the
+     Licensed Material and that the Licensor has authority to license.
+
+  j. Licensor means the individual(s) or entity(ies) granting rights
+     under this Public License.
+
+  k. NonCommercial means not primarily intended for or directed towards
+     commercial advantage or monetary compensation. For purposes of
+     this Public License, the exchange of the Licensed Material for
+     other material subject to Copyright and Similar Rights by digital
+     file-sharing or similar means is NonCommercial provided there is
+     no payment of monetary compensation in connection with the
+     exchange.
+
+  l. Share means to provide material to the public by any means or
+     process that requires permission under the Licensed Rights, such
+     as reproduction, public display, public performance, distribution,
+     dissemination, communication, or importation, and to make material
+     available to the public including in ways that members of the
+     public may access the material from a place and at a time
+     individually chosen by them.
+
+  m. Sui Generis Database Rights means rights other than copyright
+     resulting from Directive 96/9/EC of the European Parliament and of
+     the Council of 11 March 1996 on the legal protection of databases,
+     as amended and/or succeeded, as well as other essentially
+     equivalent rights anywhere in the world.
+
+  n. You means the individual or entity exercising the Licensed Rights
+     under this Public License. Your has a corresponding meaning.
+
+
+Section 2 -- Scope.
+
+  a. License grant.
+
+       1. Subject to the terms and conditions of this Public License,
+          the Licensor hereby grants You a worldwide, royalty-free,
+          non-sublicensable, non-exclusive, irrevocable license to
+          exercise the Licensed Rights in the Licensed Material to:
+
+            a. reproduce and Share the Licensed Material, in whole or
+               in part, for NonCommercial purposes only; and
+
+            b. produce, reproduce, and Share Adapted Material for
+               NonCommercial purposes only.
+
+       2. Exceptions and Limitations. For the avoidance of doubt, where
+          Exceptions and Limitations apply to Your use, this Public
+          License does not apply, and You do not need to comply with
+          its terms and conditions.
+
+       3. Term. The term of this Public License is specified in Section
+          6(a).
+
+       4. Media and formats; technical modifications allowed. The
+          Licensor authorizes You to exercise the Licensed Rights in
+          all media and formats whether now known or hereafter created,
+          and to make technical modifications necessary to do so. The
+          Licensor waives and/or agrees not to assert any right or
+          authority to forbid You from making technical modifications
+          necessary to exercise the Licensed Rights, including
+          technical modifications necessary to circumvent Effective
+          Technological Measures. For purposes of this Public License,
+          simply making modifications authorized by this Section 2(a)
+          (4) never produces Adapted Material.
+
+       5. Downstream recipients.
+
+            a. Offer from the Licensor -- Licensed Material. Every
+               recipient of the Licensed Material automatically
+               receives an offer from the Licensor to exercise the
+               Licensed Rights under the terms and conditions of this
+               Public License.
+
+            b. Additional offer from the Licensor -- Adapted Material.
+               Every recipient of Adapted Material from You
+               automatically receives an offer from the Licensor to
+               exercise the Licensed Rights in the Adapted Material
+               under the conditions of the Adapter's License You apply.
+
+            c. No downstream restrictions. You may not offer or impose
+               any additional or different terms or conditions on, or
+               apply any Effective Technological Measures to, the
+               Licensed Material if doing so restricts exercise of the
+               Licensed Rights by any recipient of the Licensed
+               Material.
+
+       6. No endorsement. Nothing in this Public License constitutes or
+          may be construed as permission to assert or imply that You
+          are, or that Your use of the Licensed Material is, connected
+          with, or sponsored, endorsed, or granted official status by,
+          the Licensor or others designated to receive attribution as
+          provided in Section 3(a)(1)(A)(i).
+
+  b. Other rights.
+
+       1. Moral rights, such as the right of integrity, are not
+          licensed under this Public License, nor are publicity,
+          privacy, and/or other similar personality rights; however, to
+          the extent possible, the Licensor waives and/or agrees not to
+          assert any such rights held by the Licensor to the limited
+          extent necessary to allow You to exercise the Licensed
+          Rights, but not otherwise.
+
+       2. Patent and trademark rights are not licensed under this
+          Public License.
+
+       3. To the extent possible, the Licensor waives any right to
+          collect royalties from You for the exercise of the Licensed
+          Rights, whether directly or through a collecting society
+          under any voluntary or waivable statutory or compulsory
+          licensing scheme. In all other cases the Licensor expressly
+          reserves any right to collect such royalties, including when
+          the Licensed Material is used other than for NonCommercial
+          purposes.
+
+
+Section 3 -- License Conditions.
+
+Your exercise of the Licensed Rights is expressly made subject to the
+following conditions.
+
+  a. Attribution.
+
+       1. If You Share the Licensed Material (including in modified
+          form), You must:
+
+            a. retain the following if it is supplied by the Licensor
+               with the Licensed Material:
+
+                 i. identification of the creator(s) of the Licensed
+                    Material and any others designated to receive
+                    attribution, in any reasonable manner requested by
+                    the Licensor (including by pseudonym if
+                    designated);
+
+                ii. a copyright notice;
+
+               iii. a notice that refers to this Public License;
+
+                iv. a notice that refers to the disclaimer of
+                    warranties;
+
+                 v. a URI or hyperlink to the Licensed Material to the
+                    extent reasonably practicable;
+
+            b. indicate if You modified the Licensed Material and
+               retain an indication of any previous modifications; and
+
+            c. indicate the Licensed Material is licensed under this
+               Public License, and include the text of, or the URI or
+               hyperlink to, this Public License.
+
+       2. You may satisfy the conditions in Section 3(a)(1) in any
+          reasonable manner based on the medium, means, and context in
+          which You Share the Licensed Material. For example, it may be
+          reasonable to satisfy the conditions by providing a URI or
+          hyperlink to a resource that includes the required
+          information.
+       3. If requested by the Licensor, You must remove any of the
+          information required by Section 3(a)(1)(A) to the extent
+          reasonably practicable.
+
+  b. ShareAlike.
+
+     In addition to the conditions in Section 3(a), if You Share
+     Adapted Material You produce, the following conditions also apply.
+
+       1. The Adapter's License You apply must be a Creative Commons
+          license with the same License Elements, this version or
+          later, or a BY-NC-SA Compatible License.
+
+       2. You must include the text of, or the URI or hyperlink to, the
+          Adapter's License You apply. You may satisfy this condition
+          in any reasonable manner based on the medium, means, and
+          context in which You Share Adapted Material.
+
+       3. You may not offer or impose any additional or different terms
+          or conditions on, or apply any Effective Technological
+          Measures to, Adapted Material that restrict exercise of the
+          rights granted under the Adapter's License You apply.
+
+
+Section 4 -- Sui Generis Database Rights.
+
+Where the Licensed Rights include Sui Generis Database Rights that
+apply to Your use of the Licensed Material:
+
+  a. for the avoidance of doubt, Section 2(a)(1) grants You the right
+     to extract, reuse, reproduce, and Share all or a substantial
+     portion of the contents of the database for NonCommercial purposes
+     only;
+
+  b. if You include all or a substantial portion of the database
+     contents in a database in which You have Sui Generis Database
+     Rights, then the database in which You have Sui Generis Database
+     Rights (but not its individual contents) is Adapted Material,
+     including for purposes of Section 3(b); and
+
+  c. You must comply with the conditions in Section 3(a) if You Share
+     all or a substantial portion of the contents of the database.
+
+For the avoidance of doubt, this Section 4 supplements and does not
+replace Your obligations under this Public License where the Licensed
+Rights include other Copyright and Similar Rights.
+
+
+Section 5 -- Disclaimer of Warranties and Limitation of Liability.
+
+  a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
+     EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
+     AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
+     ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
+     IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
+     WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
+     PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
+     ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
+     KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
+     ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
+
+  b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
+     TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
+     NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
+     INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
+     COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
+     USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
+     ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
+     DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
+     IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
+
+  c. The disclaimer of warranties and limitation of liability provided
+     above shall be interpreted in a manner that, to the extent
+     possible, most closely approximates an absolute disclaimer and
+     waiver of all liability.
+
+
+Section 6 -- Term and Termination.
+
+  a. This Public License applies for the term of the Copyright and
+     Similar Rights licensed here. However, if You fail to comply with
+     this Public License, then Your rights under this Public License
+     terminate automatically.
+
+  b. Where Your right to use the Licensed Material has terminated under
+     Section 6(a), it reinstates:
+
+       1. automatically as of the date the violation is cured, provided
+          it is cured within 30 days of Your discovery of the
+          violation; or
+
+       2. upon express reinstatement by the Licensor.
+
+     For the avoidance of doubt, this Section 6(b) does not affect any
+     right the Licensor may have to seek remedies for Your violations
+     of this Public License.
+
+  c. For the avoidance of doubt, the Licensor may also offer the
+     Licensed Material under separate terms or conditions or stop
+     distributing the Licensed Material at any time; however, doing so
+     will not terminate this Public License.
+
+  d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
+     License.
+
+
+Section 7 -- Other Terms and Conditions.
+
+  a. The Licensor shall not be bound by any additional or different
+     terms or conditions communicated by You unless expressly agreed.
+
+  b. Any arrangements, understandings, or agreements regarding the
+     Licensed Material not stated herein are separate from and
+     independent of the terms and conditions of this Public License.
+
+
+Section 8 -- Interpretation.
+
+  a. For the avoidance of doubt, this Public License does not, and
+     shall not be interpreted to, reduce, limit, restrict, or impose
+     conditions on any use of the Licensed Material that could lawfully
+     be made without permission under this Public License.
+
+  b. To the extent possible, if any provision of this Public License is
+     deemed unenforceable, it shall be automatically reformed to the
+     minimum extent necessary to make it enforceable. If the provision
+     cannot be reformed, it shall be severed from this Public License
+     without affecting the enforceability of the remaining terms and
+     conditions.
+
+  c. No term or condition of this Public License will be waived and no
+     failure to comply consented to unless expressly agreed to by the
+     Licensor.
+
+  d. Nothing in this Public License constitutes or may be interpreted
+     as a limitation upon, or waiver of, any privileges and immunities
+     that apply to the Licensor or You, including from the legal
+     processes of any jurisdiction or authority.
+
+=======================================================================
+
+Creative Commons is not a party to its public
+licenses. Notwithstanding, Creative Commons may elect to apply one of
+its public licenses to material it publishes and in those instances
+will be considered the “Licensor.” The text of the Creative Commons
+public licenses is dedicated to the public domain under the CC0 Public
+Domain Dedication. Except for the limited purpose of indicating that
+material is shared under a Creative Commons public license or as
+otherwise permitted by the Creative Commons policies published at
+creativecommons.org/policies, Creative Commons does not authorize the
+use of the trademark "Creative Commons" or any other trademark or logo
+of Creative Commons without its prior written consent including,
+without limitation, in connection with any unauthorized modifications
+to any of its public licenses or any other arrangements,
+understandings, or agreements concerning use of licensed material. For
+the avoidance of doubt, this paragraph does not form part of the
+public licenses.
+
+Creative Commons may be contacted at creativecommons.org.
-- 
cgit 


From d72c511131534552fd4056636166831d08fb3236 Mon Sep 17 00:00:00 2001
From: dada513 <dada513@protonmail.com>
Date: Wed, 9 Feb 2022 10:57:16 +0100
Subject: Revert "Fix freedesktop icons" and fix icon on kwin

---
 buildconfig/BuildConfig.cpp.in            |  1 +
 buildconfig/BuildConfig.h                 |  1 +
 launcher/Application.cpp                  |  4 +++-
 program_info/CMakeLists.txt               |  5 +++--
 program_info/org.polymc.PolyMC.desktop.in | 13 +++++++++++++
 program_info/org.polymc.polymc.desktop.in | 12 ------------
 6 files changed, 21 insertions(+), 15 deletions(-)
 create mode 100644 program_info/org.polymc.PolyMC.desktop.in
 delete mode 100644 program_info/org.polymc.polymc.desktop.in

diff --git a/buildconfig/BuildConfig.cpp.in b/buildconfig/BuildConfig.cpp.in
index 2595f78b..e7724c80 100644
--- a/buildconfig/BuildConfig.cpp.in
+++ b/buildconfig/BuildConfig.cpp.in
@@ -12,6 +12,7 @@ Config::Config()
     LAUNCHER_DOMAIN = "@Launcher_Domain@";
     LAUNCHER_CONFIGFILE = "@Launcher_ConfigFile@";
     LAUNCHER_GIT = "@Launcher_Git@";
+    LAUNCHER_DESKTOPNAME = "@Launcher_DesktopName@";
 
     USER_AGENT = "@Launcher_UserAgent@";
     USER_AGENT_UNCACHED = USER_AGENT + " (Uncached)";
diff --git a/buildconfig/BuildConfig.h b/buildconfig/BuildConfig.h
index d09d5288..e415cabb 100644
--- a/buildconfig/BuildConfig.h
+++ b/buildconfig/BuildConfig.h
@@ -14,6 +14,7 @@ public:
     QString LAUNCHER_DOMAIN;
     QString LAUNCHER_CONFIGFILE;
     QString LAUNCHER_GIT;
+    QString LAUNCHER_DESKTOPNAME;
 
     /// The major version number.
     int VERSION_MAJOR;
diff --git a/launcher/Application.cpp b/launcher/Application.cpp
index 7050e5dc..81a27495 100644
--- a/launcher/Application.cpp
+++ b/launcher/Application.cpp
@@ -187,7 +187,9 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv)
     setApplicationName(BuildConfig.LAUNCHER_NAME);
     setApplicationDisplayName(BuildConfig.LAUNCHER_DISPLAYNAME);
     setApplicationVersion(BuildConfig.printableVersionString());
-
+    #if (QT_VERSION >= QT_VERSION_CHECK(5,7,0))
+        setDesktopFileName(BuildConfig.LAUNCHER_DESKTOPNAME);
+    #endif
     startTime = QDateTime::currentDateTime();
 
 #ifdef Q_OS_LINUX
diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt
index 0466b893..1d2d19e9 100644
--- a/program_info/CMakeLists.txt
+++ b/program_info/CMakeLists.txt
@@ -7,13 +7,14 @@ set(Launcher_DisplayName "${Launcher_CommonName}" PARENT_SCOPE)
 set(Launcher_UserAgent "${Launcher_CommonName}/${Launcher_RELEASE_VERSION_NAME}" PARENT_SCOPE)
 set(Launcher_ConfigFile "polymc.cfg" PARENT_SCOPE)
 set(Launcher_Git "https://github.com/PolyMC/PolyMC" PARENT_SCOPE)
+set(Launcher_DesktopName "org.polymc.PolyMC.desktop" PARENT_SCOPE)
 
-set(Launcher_Desktop "program_info/org.polymc.polymc.desktop" PARENT_SCOPE)
+set(Launcher_Desktop "program_info/org.polymc.PolyMC.desktop" PARENT_SCOPE)
 set(Launcher_MetaInfo "program_info/org.polymc.PolyMC.metainfo.xml" PARENT_SCOPE)
 set(Launcher_SVG "program_info/org.polymc.PolyMC.svg" PARENT_SCOPE)
 set(Launcher_Branding_ICNS "program_info/polymc.icns" PARENT_SCOPE)
 set(Launcher_Branding_WindowsRC "program_info/polymc.rc" PARENT_SCOPE)
 set(Launcher_Branding_LogoQRC "program_info/polymc.qrc" PARENT_SCOPE)
 
-configure_file(org.polymc.polymc.desktop.in org.polymc.polymc.desktop)
+configure_file(org.polymc.PolyMC.desktop.in org.polymc.PolyMC.desktop)
 configure_file(org.polymc.PolyMC.metainfo.xml.in org.polymc.PolyMC.metainfo.xml)
diff --git a/program_info/org.polymc.PolyMC.desktop.in b/program_info/org.polymc.PolyMC.desktop.in
new file mode 100644
index 00000000..5d982b38
--- /dev/null
+++ b/program_info/org.polymc.PolyMC.desktop.in
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Version=1.0
+Name=PolyMC
+Comment=A custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once.
+Type=Application
+Terminal=false
+Exec=@Launcher_APP_BINARY_NAME@
+StartupNotify=true
+Icon=org.polymc.PolyMC
+PrefersNonDefaultGPU=true
+Categories=Game;
+Keywords=game;minecraft;launcher;
+StartupWMClass=PolyMC
diff --git a/program_info/org.polymc.polymc.desktop.in b/program_info/org.polymc.polymc.desktop.in
deleted file mode 100644
index 8bbdc505..00000000
--- a/program_info/org.polymc.polymc.desktop.in
+++ /dev/null
@@ -1,12 +0,0 @@
-[Desktop Entry]
-Version=1.0
-Name=PolyMC
-Comment=A custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once.
-Type=Application
-Terminal=false
-Exec=@Launcher_APP_BINARY_NAME@
-StartupNotify=true
-Icon=org.polymc.PolyMC
-PrefersNonDefaultGPU=true
-Categories=Game;
-Keywords=game;minecraft;launcher;
-- 
cgit 


From 2f87a4477e75ed941e27299b6f4402127d46ea3c Mon Sep 17 00:00:00 2001
From: dada513 <dada513@protonmail.com>
Date: Thu, 10 Feb 2022 07:53:04 +0100
Subject: Fix desktop id for GH-150

---
 program_info/org.polymc.PolyMC.metainfo.xml.in | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/program_info/org.polymc.PolyMC.metainfo.xml.in b/program_info/org.polymc.PolyMC.metainfo.xml.in
index a18650b6..cc050376 100644
--- a/program_info/org.polymc.PolyMC.metainfo.xml.in
+++ b/program_info/org.polymc.PolyMC.metainfo.xml.in
@@ -4,7 +4,7 @@
   <provides>
     <id>org.polymc.PolyMC</id>
   </provides>
-  <launchable type="desktop-id">org.polymc.polymc.desktop</launchable>
+  <launchable type="desktop-id">org.polymc.PolyMC.desktop</launchable>
   <name>PolyMC</name>
   <developer_name>PolyMC Team</developer_name>
   <summary>A custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once</summary>
-- 
cgit 


From 619fcbfabf79fd63f410e53f1945590f8dc0fadf Mon Sep 17 00:00:00 2001
From: dada513 <dada513@protonmail.com>
Date: Thu, 10 Feb 2022 08:56:34 +0100
Subject: rename LAUNCHER_DESKTOPNAME to LAUNCHER_DESKTOPFILENAME

---
 buildconfig/BuildConfig.cpp.in | 2 +-
 buildconfig/BuildConfig.h      | 2 +-
 launcher/Application.cpp       | 2 +-
 program_info/CMakeLists.txt    | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/buildconfig/BuildConfig.cpp.in b/buildconfig/BuildConfig.cpp.in
index e7724c80..9faa40f3 100644
--- a/buildconfig/BuildConfig.cpp.in
+++ b/buildconfig/BuildConfig.cpp.in
@@ -12,7 +12,7 @@ Config::Config()
     LAUNCHER_DOMAIN = "@Launcher_Domain@";
     LAUNCHER_CONFIGFILE = "@Launcher_ConfigFile@";
     LAUNCHER_GIT = "@Launcher_Git@";
-    LAUNCHER_DESKTOPNAME = "@Launcher_DesktopName@";
+    LAUNCHER_DESKTOPFILENAME = "@Launcher_DesktopFileName@";
 
     USER_AGENT = "@Launcher_UserAgent@";
     USER_AGENT_UNCACHED = USER_AGENT + " (Uncached)";
diff --git a/buildconfig/BuildConfig.h b/buildconfig/BuildConfig.h
index c00d4df7..6bb533ed 100644
--- a/buildconfig/BuildConfig.h
+++ b/buildconfig/BuildConfig.h
@@ -14,7 +14,7 @@ public:
     QString LAUNCHER_DOMAIN;
     QString LAUNCHER_CONFIGFILE;
     QString LAUNCHER_GIT;
-    QString LAUNCHER_DESKTOPNAME;
+    QString LAUNCHER_DESKTOPFILENAME;
 
     /// The major version number.
     int VERSION_MAJOR;
diff --git a/launcher/Application.cpp b/launcher/Application.cpp
index 81a27495..3a888739 100644
--- a/launcher/Application.cpp
+++ b/launcher/Application.cpp
@@ -188,7 +188,7 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv)
     setApplicationDisplayName(BuildConfig.LAUNCHER_DISPLAYNAME);
     setApplicationVersion(BuildConfig.printableVersionString());
     #if (QT_VERSION >= QT_VERSION_CHECK(5,7,0))
-        setDesktopFileName(BuildConfig.LAUNCHER_DESKTOPNAME);
+        setDesktopFileName(BuildConfig.LAUNCHER_DESKTOPFILENAME);
     #endif
     startTime = QDateTime::currentDateTime();
 
diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt
index 1d2d19e9..f9d7621d 100644
--- a/program_info/CMakeLists.txt
+++ b/program_info/CMakeLists.txt
@@ -7,7 +7,7 @@ set(Launcher_DisplayName "${Launcher_CommonName}" PARENT_SCOPE)
 set(Launcher_UserAgent "${Launcher_CommonName}/${Launcher_RELEASE_VERSION_NAME}" PARENT_SCOPE)
 set(Launcher_ConfigFile "polymc.cfg" PARENT_SCOPE)
 set(Launcher_Git "https://github.com/PolyMC/PolyMC" PARENT_SCOPE)
-set(Launcher_DesktopName "org.polymc.PolyMC.desktop" PARENT_SCOPE)
+set(Launcher_DesktopFileName "org.polymc.PolyMC.desktop" PARENT_SCOPE)
 
 set(Launcher_Desktop "program_info/org.polymc.PolyMC.desktop" PARENT_SCOPE)
 set(Launcher_MetaInfo "program_info/org.polymc.PolyMC.metainfo.xml" PARENT_SCOPE)
-- 
cgit 

-- 
cgit 


From 35d2ae3ef789eef49bb7514d42deca43f339fda3 Mon Sep 17 00:00:00 2001
From: Lenny McLennington <lennymclennington@protonmail.com>
Date: Thu, 10 Feb 2022 11:21:25 +0000
Subject: Remove drama from readme and remove mmc discord link

---
 README.md                                       | 2 +-
 launcher/ui/pages/instance/LegacyUpgradePage.ui | 9 ++++++++-
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index ef95f6dd..981ec0a4 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
 
 PolyMC is a custom launcher for Minecraft that focuses on predictability, long term stability and simplicity.
 
-This is a **fork** of the MultiMC Launcher and not endorsed by MultiMC. The PolyMC community felt that the maintainer was not acting in the spirit of Free Software so this fork was made. Read "[Why was this fork made?](https://github.com/PolyMC/PolyMC/wiki/FAQ)" on the wiki for more details.
+This is a **fork** of the MultiMC Launcher and not endorsed by MultiMC. The PolyMC community felt that the maintainer was not acting in the spirit of Free Software so this fork was made.
 <br>
 
 # Installation
diff --git a/launcher/ui/pages/instance/LegacyUpgradePage.ui b/launcher/ui/pages/instance/LegacyUpgradePage.ui
index 4e803358..b22c03e5 100644
--- a/launcher/ui/pages/instance/LegacyUpgradePage.ui
+++ b/launcher/ui/pages/instance/LegacyUpgradePage.ui
@@ -26,7 +26,14 @@
    <item>
     <widget class="QTextBrowser" name="textBrowser">
      <property name="html">
-         <string>&lt;html&gt;&lt;body&gt;&lt;h1&gt;Upgrade is required&lt;/h1&gt;&lt;p&gt;PolyMC now supports old Minecraft versions and all the required features in the new (OneSix) instance format. As a consequence, the old (Legacy) format has been entirely disabled and old instances need to be upgraded.&lt;/p&gt;&lt;p&gt;The upgrade will create a new instance with the same contents as the current one, in the new format. The original instance will remain untouched, in case anything goes wrong in the process.&lt;/p&gt;&lt;p&gt;Please report any issues on our &lt;a href=&quot;https://github.com/PolyMC/PolyMC/issues&quot;&gt;github issues page&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;There is also a &lt;a href=&quot;https://discord.gg/GtPmv93&quot;&gt;discord channel for testing here&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+      <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Noto Sans'; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;h1 style=&quot; margin-top:18px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:xx-large; font-weight:600;&quot;&gt;Upgrade is required&lt;/span&gt;&lt;/h1&gt;
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;PolyMC now supports old Minecraft versions and all the required features in the new (OneSix) instance format. As a consequence, the old (Legacy) format has been entirely disabled and old instances need to be upgraded.&lt;/p&gt;
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;The upgrade will create a new instance with the same contents as the current one, in the new format. The original instance will remain untouched, in case anything goes wrong in the process.&lt;/p&gt;
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Please report any issues on our &lt;a href=&quot;https://github.com/PolyMC/PolyMC/issues&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#3584e4;&quot;&gt;github issues page&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
      </property>
      <property name="openExternalLinks">
       <bool>true</bool>
-- 
cgit 


From 49f5f674672c319d130a3a466f681aec08326fbd Mon Sep 17 00:00:00 2001
From: dada513 <dada513@protonmail.com>
Date: Thu, 10 Feb 2022 12:26:33 +0100
Subject: Update screenshots to use new site

---
 program_info/org.polymc.PolyMC.metainfo.xml.in | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/program_info/org.polymc.PolyMC.metainfo.xml.in b/program_info/org.polymc.PolyMC.metainfo.xml.in
index cc050376..c7dc9481 100644
--- a/program_info/org.polymc.PolyMC.metainfo.xml.in
+++ b/program_info/org.polymc.PolyMC.metainfo.xml.in
@@ -28,23 +28,23 @@
   <screenshots>
     <screenshot type="default">
       <caption>The main PolyMC window</caption>
-      <image type="source" width="1011" height="994">https://polymc.github.io/polymc.org/assets/img/screenshots/LauncherDark.png</image>
+      <image type="source" width="1011" height="994">https://polymc.github.io/assets/img/screenshots/LauncherDark.png</image>
     </screenshot>
     <screenshot>
       <caption>Modpack installation</caption>
-      <image type="source" width="911" height="682">https://polymc.github.io/polymc.org/assets/img/screenshots/ModpackInstallDark.png</image>
+      <image type="source" width="911" height="682">https://polymc.github.io/assets/img/screenshots/ModpackInstallDark.png</image>
     </screenshot>
     <screenshot>
       <caption>Mod installation</caption>
-      <image type="source" width="987" height="723">https://polymc.github.io/polymc.org/assets/img/screenshots/ModInstallDark.png</image>
+      <image type="source" width="987" height="723">https://polymc.github.io/assets/img/screenshots/ModInstallDark.png</image>
     </screenshot>
     <screenshot>
       <caption>Instance management</caption>
-      <image type="source" width="902" height="920">https://polymc.github.io/polymc.org/assets/img/screenshots/PropertiesDark.png</image>
+      <image type="source" width="902" height="920">https://polymc.github.io/assets/img/screenshots/PropertiesDark.png</image>
     </screenshot>
     <screenshot>
       <caption>Cat :)</caption>
-      <image type="source" width="1011" height="994">https://polymc.github.io/polymc.org/assets/img/screenshots/LauncherCatDark.png</image>
+      <image type="source" width="1011" height="994">https://polymc.github.io/assets/img/screenshots/LauncherCatDark.png</image>
     </screenshot>
   </screenshots>
   <releases>
-- 
cgit 


From f8ca6b4867d1b01310269293426c65ef78c5ec67 Mon Sep 17 00:00:00 2001
From: dada513 <dada513@protonmail.com>
Date: Thu, 10 Feb 2022 12:55:07 +0100
Subject: Revert "refactor: remove news feed"

This reverts commit 361ce7818ec8891e9a35bdfac4cdea77a0b6a949.
---
 CMakeLists.txt                |   3 +
 launcher/CMakeLists.txt       |   9 +++
 launcher/news/NewsChecker.cpp | 132 ++++++++++++++++++++++++++++++++++++++++++
 launcher/news/NewsChecker.h   | 105 +++++++++++++++++++++++++++++++++
 launcher/news/NewsEntry.cpp   |  77 ++++++++++++++++++++++++
 launcher/news/NewsEntry.h     |  65 +++++++++++++++++++++
 launcher/ui/MainWindow.cpp    |  89 ++++++++++++++++++++++++++++
 launcher/ui/MainWindow.h      |   9 +++
 8 files changed, 489 insertions(+)
 create mode 100644 launcher/news/NewsChecker.cpp
 create mode 100644 launcher/news/NewsChecker.h
 create mode 100644 launcher/news/NewsEntry.cpp
 create mode 100644 launcher/news/NewsEntry.h

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 738a1a5a..593d608e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -45,6 +45,9 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DQT_NO_DEPRECATED_WARNINGS=Y")
 
 ##################################### Set Application options #####################################
 
+######## Set URLs ########
+set(Launcher_NEWS_RSS_URL "https://multimc.org/rss.xml" CACHE STRING "URL to fetch Launcher's news RSS feed from.")
+
 ######## Set version numbers ########
 set(Launcher_VERSION_MAJOR    1)
 set(Launcher_VERSION_MINOR    0)
diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt
index f4c3a9bc..4fb24b54 100644
--- a/launcher/CMakeLists.txt
+++ b/launcher/CMakeLists.txt
@@ -181,6 +181,15 @@ set(NOTIFICATIONS_SOURCES
     notifications/NotificationChecker.cpp
 )
 
+# Backend for the news bar... there's usually no news.
+set(NEWS_SOURCES
+    # News System
+    news/NewsChecker.h
+    news/NewsChecker.cpp
+    news/NewsEntry.h
+    news/NewsEntry.cpp
+)
+
 # Icon interface
 set(ICONS_SOURCES
     # Icons System and related code
diff --git a/launcher/news/NewsChecker.cpp b/launcher/news/NewsChecker.cpp
new file mode 100644
index 00000000..4f4359b8
--- /dev/null
+++ b/launcher/news/NewsChecker.cpp
@@ -0,0 +1,132 @@
+/* Copyright 2013-2021 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "NewsChecker.h"
+
+#include <QByteArray>
+#include <QDomDocument>
+
+#include <QDebug>
+
+NewsChecker::NewsChecker(shared_qobject_ptr<QNetworkAccessManager> network, const QString& feedUrl)
+{
+    m_network = network;
+    m_feedUrl = feedUrl;
+}
+
+void NewsChecker::reloadNews()
+{
+    // Start a netjob to download the RSS feed and call rssDownloadFinished() when it's done.
+    if (isLoadingNews())
+    {
+        qDebug() << "Ignored request to reload news. Currently reloading already.";
+        return;
+    }
+
+    qDebug() << "Reloading news.";
+
+    NetJob* job = new NetJob("News RSS Feed", m_network);
+    job->addNetAction(Net::Download::makeByteArray(m_feedUrl, &newsData));
+    QObject::connect(job, &NetJob::succeeded, this, &NewsChecker::rssDownloadFinished);
+    QObject::connect(job, &NetJob::failed, this, &NewsChecker::rssDownloadFailed);
+    m_newsNetJob.reset(job);
+    job->start();
+}
+
+void NewsChecker::rssDownloadFinished()
+{
+    // Parse the XML file and process the RSS feed entries.
+    qDebug() << "Finished loading RSS feed.";
+
+    m_newsNetJob.reset();
+    QDomDocument doc;
+    {
+        // Stuff to store error info in.
+        QString errorMsg = "Unknown error.";
+        int errorLine = -1;
+        int errorCol = -1;
+
+        // Parse the XML.
+        if (!doc.setContent(newsData, false, &errorMsg, &errorLine, &errorCol))
+        {
+            QString fullErrorMsg = QString("Error parsing RSS feed XML. %s at %d:%d.").arg(errorMsg, errorLine, errorCol);
+            fail(fullErrorMsg);
+            newsData.clear();
+            return;
+        }
+        newsData.clear();
+    }
+
+    // If the parsing succeeded, read it.
+    QDomNodeList items = doc.elementsByTagName("item");
+    m_newsEntries.clear();
+    for (int i = 0; i < items.length(); i++)
+    {
+        QDomElement element = items.at(i).toElement();
+        NewsEntryPtr entry;
+        entry.reset(new NewsEntry());
+        QString errorMsg = "An unknown error occurred.";
+        if (NewsEntry::fromXmlElement(element, entry.get(), &errorMsg))
+        {
+            qDebug() << "Loaded news entry" << entry->title;
+            m_newsEntries.append(entry);
+        }
+        else
+        {
+            qWarning() << "Failed to load news entry at index" << i << ":" << errorMsg;
+        }
+    }
+
+    succeed();
+}
+
+void NewsChecker::rssDownloadFailed(QString reason)
+{
+    // Set an error message and fail.
+    fail(tr("Failed to load news RSS feed:\n%1").arg(reason));
+}
+
+
+QList<NewsEntryPtr> NewsChecker::getNewsEntries() const
+{
+    return m_newsEntries;
+}
+
+bool NewsChecker::isLoadingNews() const
+{
+    return m_newsNetJob.get() != nullptr;
+}
+
+QString NewsChecker::getLastLoadErrorMsg() const
+{
+    return m_lastLoadError;
+}
+
+void NewsChecker::succeed()
+{
+    m_lastLoadError = "";
+    qDebug() << "News loading succeeded.";
+    m_newsNetJob.reset();
+    emit newsLoaded();
+}
+
+void NewsChecker::fail(const QString& errorMsg)
+{
+    m_lastLoadError = errorMsg;
+    qDebug() << "Failed to load news:" << errorMsg;
+    m_newsNetJob.reset();
+    emit newsLoadingFailed(errorMsg);
+}
+
diff --git a/launcher/news/NewsChecker.h b/launcher/news/NewsChecker.h
new file mode 100644
index 00000000..8467a541
--- /dev/null
+++ b/launcher/news/NewsChecker.h
@@ -0,0 +1,105 @@
+/* Copyright 2013-2021 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QObject>
+#include <QString>
+#include <QList>
+
+#include <net/NetJob.h>
+
+#include "NewsEntry.h"
+
+class NewsChecker : public QObject
+{
+    Q_OBJECT
+public:
+    /*!
+     * Constructs a news reader to read from the given RSS feed URL.
+     */
+    NewsChecker(shared_qobject_ptr<QNetworkAccessManager> network, const QString& feedUrl);
+
+    /*!
+     * Returns the error message for the last time the news was loaded.
+     * Empty string if the last load was successful.
+     */
+    QString getLastLoadErrorMsg() const;
+
+    /*!
+     * Returns true if the news has been loaded successfully.
+     */
+    bool isNewsLoaded() const;
+
+    //! True if the news is currently loading. If true, reloadNews() will do nothing.
+    bool isLoadingNews() const;
+
+    /*!
+     * Returns a list of news entries.
+     */
+    QList<NewsEntryPtr> getNewsEntries() const;
+
+    /*!
+     * Reloads the news from the website's RSS feed.
+     * If the news is already loading, this does nothing.
+     */
+    void Q_SLOT reloadNews();
+
+signals:
+    /*!
+     * Signal fired after the news has finished loading.
+     */
+    void newsLoaded();
+
+    /*!
+     * Signal fired after the news fails to load.
+     */
+    void newsLoadingFailed(QString errorMsg);
+
+protected slots:
+    void rssDownloadFinished();
+    void rssDownloadFailed(QString reason);
+
+protected: /* data */
+    //! The URL for the RSS feed to fetch.
+    QString m_feedUrl;
+
+    //! List of news entries.
+    QList<NewsEntryPtr> m_newsEntries;
+
+    //! The network job to use to load the news.
+    NetJob::Ptr m_newsNetJob;
+
+    //! True if news has been loaded.
+    bool m_loadedNews;
+
+    QByteArray newsData;
+
+    /*!
+     * Gets the error message that was given last time the news was loaded.
+     * If the last news load succeeded, this will be an empty string.
+     */
+    QString m_lastLoadError;
+
+    shared_qobject_ptr<QNetworkAccessManager> m_network;
+
+protected slots:
+    /// Emits newsLoaded() and sets m_lastLoadError to empty string.
+    void succeed();
+
+    /// Emits newsLoadingFailed() and sets m_lastLoadError to the given message.
+    void fail(const QString& errorMsg);
+};
+
diff --git a/launcher/news/NewsEntry.cpp b/launcher/news/NewsEntry.cpp
new file mode 100644
index 00000000..7eff657b
--- /dev/null
+++ b/launcher/news/NewsEntry.cpp
@@ -0,0 +1,77 @@
+/* Copyright 2013-2021 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "NewsEntry.h"
+
+#include <QDomNodeList>
+#include <QVariant>
+
+NewsEntry::NewsEntry(QObject* parent) :
+    QObject(parent)
+{
+    this->title = tr("Untitled");
+    this->content = tr("No content.");
+    this->link = "";
+    this->author = tr("Unknown Author");
+    this->pubDate = QDateTime::currentDateTime();
+}
+
+NewsEntry::NewsEntry(const QString& title, const QString& content, const QString& link, const QString& author, const QDateTime& pubDate, QObject* parent) :
+    QObject(parent)
+{
+    this->title = title;
+    this->content = content;
+    this->link = link;
+    this->author = author;
+    this->pubDate = pubDate;
+}
+
+/*!
+ * Gets the text content of the given child element as a QVariant.
+ */
+inline QString childValue(const QDomElement& element, const QString& childName, QString defaultVal="")
+{
+    QDomNodeList nodes = element.elementsByTagName(childName);
+    if (nodes.count() > 0)
+    {
+        QDomElement element = nodes.at(0).toElement();
+        return element.text();
+    }
+    else
+    {
+        return defaultVal;
+    }
+}
+
+bool NewsEntry::fromXmlElement(const QDomElement& element, NewsEntry* entry, QString* errorMsg)
+{
+    QString title = childValue(element, "title", tr("Untitled"));
+    QString content = childValue(element, "description", tr("No content."));
+    QString link = childValue(element, "link");
+    QString author = childValue(element, "dc:creator", tr("Unknown Author"));
+    QString pubDateStr = childValue(element, "pubDate");
+
+    // FIXME: For now, we're just ignoring timezones. We assume that all time zones in the RSS feed are the same.
+    QString dateFormat("ddd, dd MMM yyyy hh:mm:ss");
+    QDateTime pubDate = QDateTime::fromString(pubDateStr, dateFormat);
+
+    entry->title = title;
+    entry->content = content;
+    entry->link = link;
+    entry->author = author;
+    entry->pubDate = pubDate;
+    return true;
+}
+
diff --git a/launcher/news/NewsEntry.h b/launcher/news/NewsEntry.h
new file mode 100644
index 00000000..0dbc70a5
--- /dev/null
+++ b/launcher/news/NewsEntry.h
@@ -0,0 +1,65 @@
+/* Copyright 2013-2021 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QObject>
+#include <QString>
+#include <QDomElement>
+#include <QDateTime>
+
+#include <memory>
+
+class NewsEntry : public QObject
+{
+    Q_OBJECT
+
+public:
+    /*!
+     * Constructs an empty news entry.
+     */
+    explicit NewsEntry(QObject* parent=0);
+
+    /*!
+     * Constructs a new news entry.
+     * Note that content may contain HTML.
+     */
+    NewsEntry(const QString& title, const QString& content, const QString& link, const QString& author, const QDateTime& pubDate, QObject* parent=0);
+
+    /*!
+     * Attempts to load information from the given XML element into the given news entry pointer.
+     * If this fails, the function will return false and store an error message in the errorMsg pointer.
+     */
+    static bool fromXmlElement(const QDomElement& element, NewsEntry* entry, QString* errorMsg=0);
+
+
+    //! The post title.
+    QString title;
+
+    //! The post's content. May contain HTML.
+    QString content;
+
+    //! URL to the post.
+    QString link;
+
+    //! The post's author.
+    QString author;
+    
+    //! The date and time that this post was published.
+    QDateTime pubDate;
+};
+
+typedef std::shared_ptr<NewsEntry> NewsEntryPtr;
+
diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp
index 202924ff..3dcc8ee9 100644
--- a/launcher/ui/MainWindow.cpp
+++ b/launcher/ui/MainWindow.cpp
@@ -58,6 +58,7 @@
 #include <BuildConfig.h>
 #include <net/NetJob.h>
 #include <net/Download.h>
+#include <news/NewsChecker.h>
 #include <notifications/NotificationChecker.h>
 #include <tools/BaseProfiler.h>
 #include <updater/DownloadTask.h>
@@ -200,6 +201,7 @@ public:
     //TranslatedAction actionRefresh;
     TranslatedAction actionCheckUpdate;
     TranslatedAction actionSettings;
+    TranslatedAction actionMoreNews;
     TranslatedAction actionManageAccounts;
     TranslatedAction actionLaunchInstance;
     TranslatedAction actionRenameInstance;
@@ -244,6 +246,7 @@ public:
 
     TranslatedToolbar mainToolBar;
     TranslatedToolbar instanceToolBar;
+    TranslatedToolbar newsToolBar;
     QVector<TranslatedToolbar *> all_toolbars;
     bool m_kill = false;
 
@@ -426,6 +429,29 @@ public:
         MainWindow->setStatusBar(statusBar);
     }
 
+    void createNewsToolbar(QMainWindow *MainWindow)
+    {
+        newsToolBar = TranslatedToolbar(MainWindow);
+        newsToolBar->setObjectName(QStringLiteral("newsToolBar"));
+        newsToolBar->setMovable(false);
+        newsToolBar->setAllowedAreas(Qt::BottomToolBarArea);
+        newsToolBar->setIconSize(QSize(16, 16));
+        newsToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+        newsToolBar->setFloatable(false);
+        newsToolBar->setWindowTitle(QT_TRANSLATE_NOOP("MainWindow", "News Toolbar"));
+
+        actionMoreNews = TranslatedAction(MainWindow);
+        actionMoreNews->setObjectName(QStringLiteral("actionMoreNews"));
+        actionMoreNews->setIcon(APPLICATION->getThemedIcon("news"));
+        actionMoreNews.setTextId(QT_TRANSLATE_NOOP("MainWindow", "More news..."));
+        actionMoreNews.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Open the development blog to read more news about %1."));
+        all_actions.append(&actionMoreNews);
+        newsToolBar->addAction(actionMoreNews);
+
+        all_toolbars.append(&newsToolBar);
+        MainWindow->addToolBar(Qt::BottomToolBarArea, newsToolBar);
+    }
+
     void createInstanceToolbar(QMainWindow *MainWindow)
     {
         instanceToolBar = TranslatedToolbar(MainWindow);
@@ -610,6 +636,7 @@ public:
         MainWindow->setCentralWidget(centralWidget);
 
         createStatusBar(MainWindow);
+        createNewsToolbar(MainWindow);
         createInstanceToolbar(MainWindow);
 
         retranslateUi(MainWindow);
@@ -664,6 +691,20 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new MainWindow
         connect(secretEventFilter, &KonamiCode::triggered, this, &MainWindow::konamiTriggered);
     }
 
+    // Add the news label to the news toolbar.
+    {
+        m_newsChecker.reset(new NewsChecker(APPLICATION->network(), BuildConfig.NEWS_RSS_URL));
+        newsLabel = new QToolButton();
+        newsLabel->setIcon(APPLICATION->getThemedIcon("news"));
+        newsLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+        newsLabel->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+        newsLabel->setFocusPolicy(Qt::NoFocus);
+        ui->newsToolBar->insertWidget(ui->actionMoreNews, newsLabel);
+        QObject::connect(newsLabel, &QAbstractButton::clicked, this, &MainWindow::newsButtonClicked);
+        QObject::connect(m_newsChecker.get(), &NewsChecker::newsLoaded, this, &MainWindow::updateNewsLabel);
+        updateNewsLabel();
+    }
+
     // Create the instance list widget
     {
         view = new InstanceView(ui->centralWidget);
@@ -768,6 +809,13 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new MainWindow
     // TODO: refresh accounts here?
     // auto accounts = APPLICATION->accounts();
 
+    // load the news
+    {
+        m_newsChecker->reloadNews();
+        updateNewsLabel();
+    }
+
+
     if(BuildConfig.UPDATER_ENABLED)
     {
         bool updatesAllowed = APPLICATION->updatesAreAllowed();
@@ -1141,6 +1189,29 @@ bool MainWindow::eventFilter(QObject *obj, QEvent *ev)
     return QMainWindow::eventFilter(obj, ev);
 }
 
+void MainWindow::updateNewsLabel()
+{
+    if (m_newsChecker->isLoadingNews())
+    {
+        newsLabel->setText(tr("Loading news..."));
+        newsLabel->setEnabled(false);
+    }
+    else
+    {
+        QList<NewsEntryPtr> entries = m_newsChecker->getNewsEntries();
+        if (entries.length() > 0)
+        {
+            newsLabel->setText(entries[0]->title);
+            newsLabel->setEnabled(true);
+        }
+        else
+        {
+            newsLabel->setText(tr("No news available."));
+            newsLabel->setEnabled(false);
+        }
+    }
+}
+
 void MainWindow::updateAvailable(GoUpdate::Status status)
 {
     if(!APPLICATION->updatesAreAllowed())
@@ -1614,6 +1685,24 @@ void MainWindow::on_actionReportBug_triggered()
     DesktopServices::openUrl(QUrl(BuildConfig.BUG_TRACKER_URL));
 }
 
+void MainWindow::on_actionMoreNews_triggered()
+{
+    DesktopServices::openUrl(QUrl("https://multimc.org/posts.html"));
+}
+
+void MainWindow::newsButtonClicked()
+{
+    QList<NewsEntryPtr> entries = m_newsChecker->getNewsEntries();
+    if (entries.count() > 0)
+    {
+        DesktopServices::openUrl(QUrl(entries[0]->link));
+    }
+    else
+    {
+        DesktopServices::openUrl(QUrl("https://multimc.org/posts.html"));
+    }
+}
+
 void MainWindow::on_actionAbout_triggered()
 {
     AboutDialog dialog(this);
diff --git a/launcher/ui/MainWindow.h b/launcher/ui/MainWindow.h
index 38d925a9..f6940ab0 100644
--- a/launcher/ui/MainWindow.h
+++ b/launcher/ui/MainWindow.h
@@ -27,6 +27,7 @@
 #include "updater/GoUpdate.h"
 
 class LaunchController;
+class NewsChecker;
 class NotificationChecker;
 class QToolButton;
 class InstanceProxyModel;
@@ -108,6 +109,10 @@ private slots:
 
     void on_actionReportBug_triggered();
 
+    void on_actionMoreNews_triggered();
+
+    void newsButtonClicked();
+
     void on_actionLaunchInstance_triggered();
 
     void on_actionLaunchInstanceOffline_triggered();
@@ -169,6 +174,8 @@ private slots:
 
     void repopulateAccountsMenu();
 
+    void updateNewsLabel();
+
     /*!
      * Runs the DownloadTask and installs updates.
      */
@@ -198,12 +205,14 @@ private:
     // these are managed by Qt's memory management model!
     InstanceView *view = nullptr;
     InstanceProxyModel *proxymodel = nullptr;
+    QToolButton *newsLabel = nullptr;
     QLabel *m_statusLeft = nullptr;
     QLabel *m_statusCenter = nullptr;
     QMenu *accountMenu = nullptr;
     QToolButton *accountMenuButton = nullptr;
     KonamiCode * secretEventFilter = nullptr;
 
+    unique_qobject_ptr<NewsChecker> m_newsChecker;
     unique_qobject_ptr<NotificationChecker> m_notificationChecker;
 
     InstancePtr m_selectedInstance;
-- 
cgit 


From 70f8cb81b8bbdf8bc2f4931981002ab56125361d Mon Sep 17 00:00:00 2001
From: dada513 <dada513@protonmail.com>
Date: Thu, 10 Feb 2022 13:14:25 +0100
Subject: Initial RSS re-add and removed hardcoded strings

---
 CMakeLists.txt                 | 5 +++--
 buildconfig/BuildConfig.cpp.in | 1 +
 buildconfig/BuildConfig.h      | 5 +++++
 launcher/ui/MainWindow.cpp     | 4 ++--
 4 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 593d608e..aca8b898 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -46,12 +46,13 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DQT_NO_DEPRECATED_WARNINGS=Y")
 ##################################### Set Application options #####################################
 
 ######## Set URLs ########
-set(Launcher_NEWS_RSS_URL "https://multimc.org/rss.xml" CACHE STRING "URL to fetch Launcher's news RSS feed from.")
+set(Launcher_NEWS_RSS_URL "https://polymc.github.io/feed/feed.xml" CACHE STRING "URL to fetch PolyMC's news RSS feed from.")
+set(Launcher_NEWS_OPEN_URL "https://polymc.github.io/news/" CACHE STRING "URL that gets opened when the user clicks 'More News'")
 
 ######## Set version numbers ########
 set(Launcher_VERSION_MAJOR    1)
 set(Launcher_VERSION_MINOR    0)
-set(Launcher_VERSION_HOTFIX   5)
+set(Launcher_VERSION_HOTFIX   6)
 
 # Build number
 set(Launcher_VERSION_BUILD -1 CACHE STRING "Build number. -1 for no build number.")
diff --git a/buildconfig/BuildConfig.cpp.in b/buildconfig/BuildConfig.cpp.in
index 2595f78b..655d3bfb 100644
--- a/buildconfig/BuildConfig.cpp.in
+++ b/buildconfig/BuildConfig.cpp.in
@@ -42,6 +42,7 @@ Config::Config()
 
     VERSION_STR = "@Launcher_VERSION_STRING@";
     NEWS_RSS_URL = "@Launcher_NEWS_RSS_URL@";
+    NEWS_OPEN_URL = "@Launcher_NEWS_OPEN_URL@";
     IMGUR_CLIENT_ID = "@Launcher_IMGUR_CLIENT_ID@";
     MSA_CLIENT_ID = "@Launcher_MSA_CLIENT_ID@";
     META_URL = "@Launcher_META_URL@";
diff --git a/buildconfig/BuildConfig.h b/buildconfig/BuildConfig.h
index d09d5288..6e524736 100644
--- a/buildconfig/BuildConfig.h
+++ b/buildconfig/BuildConfig.h
@@ -67,6 +67,11 @@ public:
      */
     QString NEWS_RSS_URL;
 
+    /**
+     * URL that gets opened when the user clicks "More News"
+     */
+    QString NEWS_OPEN_URL;
+
     /**
      * Client ID you can get from Imgur when you register an application
      */
diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp
index 3dcc8ee9..32b27afb 100644
--- a/launcher/ui/MainWindow.cpp
+++ b/launcher/ui/MainWindow.cpp
@@ -1687,7 +1687,7 @@ void MainWindow::on_actionReportBug_triggered()
 
 void MainWindow::on_actionMoreNews_triggered()
 {
-    DesktopServices::openUrl(QUrl("https://multimc.org/posts.html"));
+    DesktopServices::openUrl(QUrl(BuildConfig.NEWS_OPEN_URL));
 }
 
 void MainWindow::newsButtonClicked()
@@ -1699,7 +1699,7 @@ void MainWindow::newsButtonClicked()
     }
     else
     {
-        DesktopServices::openUrl(QUrl("https://multimc.org/posts.html"));
+        DesktopServices::openUrl(QUrl(BuildConfig.NEWS_OPEN_URL));
     }
 }
 
-- 
cgit 


From d42d6fe25a601136103bea9796167de86fd49cb6 Mon Sep 17 00:00:00 2001
From: dada513 <dada513@protonmail.com>
Date: Thu, 10 Feb 2022 13:57:06 +0100
Subject: fix rss format

---
 launcher/news/NewsChecker.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/launcher/news/NewsChecker.cpp b/launcher/news/NewsChecker.cpp
index 4f4359b8..6724950f 100644
--- a/launcher/news/NewsChecker.cpp
+++ b/launcher/news/NewsChecker.cpp
@@ -70,7 +70,7 @@ void NewsChecker::rssDownloadFinished()
     }
 
     // If the parsing succeeded, read it.
-    QDomNodeList items = doc.elementsByTagName("item");
+    QDomNodeList items = doc.elementsByTagName("entry");
     m_newsEntries.clear();
     for (int i = 0; i < items.length(); i++)
     {
-- 
cgit 


From 13d41bde7fd6cb7119395a1cc829174da5872b60 Mon Sep 17 00:00:00 2001
From: dada513 <dada513@protonmail.com>
Date: Thu, 10 Feb 2022 13:57:18 +0100
Subject: remove unused parsing of dates (bloat)

---
 launcher/news/NewsEntry.cpp | 16 ++--------------
 launcher/news/NewsEntry.h   | 10 +---------
 2 files changed, 3 insertions(+), 23 deletions(-)

diff --git a/launcher/news/NewsEntry.cpp b/launcher/news/NewsEntry.cpp
index 7eff657b..137703d1 100644
--- a/launcher/news/NewsEntry.cpp
+++ b/launcher/news/NewsEntry.cpp
@@ -24,18 +24,14 @@ NewsEntry::NewsEntry(QObject* parent) :
     this->title = tr("Untitled");
     this->content = tr("No content.");
     this->link = "";
-    this->author = tr("Unknown Author");
-    this->pubDate = QDateTime::currentDateTime();
 }
 
-NewsEntry::NewsEntry(const QString& title, const QString& content, const QString& link, const QString& author, const QDateTime& pubDate, QObject* parent) :
+NewsEntry::NewsEntry(const QString& title, const QString& content, const QString& link, QObject* parent) :
     QObject(parent)
 {
     this->title = title;
     this->content = content;
     this->link = link;
-    this->author = author;
-    this->pubDate = pubDate;
 }
 
 /*!
@@ -59,19 +55,11 @@ bool NewsEntry::fromXmlElement(const QDomElement& element, NewsEntry* entry, QSt
 {
     QString title = childValue(element, "title", tr("Untitled"));
     QString content = childValue(element, "description", tr("No content."));
-    QString link = childValue(element, "link");
-    QString author = childValue(element, "dc:creator", tr("Unknown Author"));
-    QString pubDateStr = childValue(element, "pubDate");
-
-    // FIXME: For now, we're just ignoring timezones. We assume that all time zones in the RSS feed are the same.
-    QString dateFormat("ddd, dd MMM yyyy hh:mm:ss");
-    QDateTime pubDate = QDateTime::fromString(pubDateStr, dateFormat);
+    QString link = childValue(element, "id");
 
     entry->title = title;
     entry->content = content;
     entry->link = link;
-    entry->author = author;
-    entry->pubDate = pubDate;
     return true;
 }
 
diff --git a/launcher/news/NewsEntry.h b/launcher/news/NewsEntry.h
index 0dbc70a5..1fe95623 100644
--- a/launcher/news/NewsEntry.h
+++ b/launcher/news/NewsEntry.h
@@ -18,8 +18,6 @@
 #include <QObject>
 #include <QString>
 #include <QDomElement>
-#include <QDateTime>
-
 #include <memory>
 
 class NewsEntry : public QObject
@@ -36,7 +34,7 @@ public:
      * Constructs a new news entry.
      * Note that content may contain HTML.
      */
-    NewsEntry(const QString& title, const QString& content, const QString& link, const QString& author, const QDateTime& pubDate, QObject* parent=0);
+    NewsEntry(const QString& title, const QString& content, const QString& link, QObject* parent=0);
 
     /*!
      * Attempts to load information from the given XML element into the given news entry pointer.
@@ -53,12 +51,6 @@ public:
 
     //! URL to the post.
     QString link;
-
-    //! The post's author.
-    QString author;
-    
-    //! The date and time that this post was published.
-    QDateTime pubDate;
 };
 
 typedef std::shared_ptr<NewsEntry> NewsEntryPtr;
-- 
cgit 


From 8d2e7db178b764838014a457bec81e946e0f937d Mon Sep 17 00:00:00 2001
From: Sefa Eyeoglu <contact@scrumplex.net>
Date: Thu, 10 Feb 2022 14:55:52 +0100
Subject: fix: update link to translations platform

---
 CMakeLists.txt                                  | 3 +++
 buildconfig/BuildConfig.cpp.in                  | 1 +
 buildconfig/BuildConfig.h                       | 1 +
 launcher/ui/widgets/LanguageSelectionWidget.cpp | 3 ++-
 4 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 738a1a5a..c372660d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -74,6 +74,9 @@ set(Launcher_MSA_CLIENT_ID "17b47edd-c884-4997-926d-9e7f9a6b4647" CACHE STRING "
 # Bug tracker URL
 set(Launcher_BUG_TRACKER_URL "https://github.com/PolyMC/PolyMC/issues" CACHE STRING "URL for the bug tracker.")
 
+# Translations Platform URL
+set(Launcher_TRANSLATIONS_URL "https://hosted.weblate.org/projects/polymc/polymc/" CACHE STRING "URL for the translations platform.")
+
 # Discord URL
 set(Launcher_DISCORD_URL "https://discord.gg/Z52pwxWCHP" CACHE STRING "URL for the Discord guild.")
 
diff --git a/buildconfig/BuildConfig.cpp.in b/buildconfig/BuildConfig.cpp.in
index 2595f78b..c71a4c7b 100644
--- a/buildconfig/BuildConfig.cpp.in
+++ b/buildconfig/BuildConfig.cpp.in
@@ -47,6 +47,7 @@ Config::Config()
     META_URL = "@Launcher_META_URL@";
 
     BUG_TRACKER_URL = "@Launcher_BUG_TRACKER_URL@";
+    TRANSLATIONS_URL = "@Launcher_TRANSLATIONS_URL@";
     DISCORD_URL = "@Launcher_DISCORD_URL@";
     SUBREDDIT_URL = "@Launcher_SUBREDDIT_URL@";
 }
diff --git a/buildconfig/BuildConfig.h b/buildconfig/BuildConfig.h
index c260b988..a85da74e 100644
--- a/buildconfig/BuildConfig.h
+++ b/buildconfig/BuildConfig.h
@@ -83,6 +83,7 @@ public:
     QString META_URL;
 
     QString BUG_TRACKER_URL;
+    QString TRANSLATIONS_URL;
     QString DISCORD_URL;
     QString SUBREDDIT_URL;
 
diff --git a/launcher/ui/widgets/LanguageSelectionWidget.cpp b/launcher/ui/widgets/LanguageSelectionWidget.cpp
index 964d2b7c..256b09da 100644
--- a/launcher/ui/widgets/LanguageSelectionWidget.cpp
+++ b/launcher/ui/widgets/LanguageSelectionWidget.cpp
@@ -5,6 +5,7 @@
 #include <QHeaderView>
 #include <QLabel>
 #include "Application.h"
+#include "BuildConfig.h"
 #include "translations/TranslationsModel.h"
 #include "settings/Setting.h"
 
@@ -52,7 +53,7 @@ QString LanguageSelectionWidget::getSelectedLanguageKey() const
 void LanguageSelectionWidget::retranslate()
 {
     QString text = tr("Don't see your language or the quality is poor?<br/><a href=\"%1\">Help us with translations!</a>")
-        .arg("https://github.com/MultiMC/Launcher/wiki/Translating-MultiMC");
+        .arg(BuildConfig.TRANSLATIONS_URL);
     helpUsLabel->setText(text);
 
 }
-- 
cgit 


From b4e0b7584a6f17c11287454e3e08e26fd5e36930 Mon Sep 17 00:00:00 2001
From: dada513 <dada513@protonmail.com>
Date: Fri, 11 Feb 2022 13:17:11 +0100
Subject: newlines

---
 program_info/org.polymc.PolyMC.metainfo.xml.in | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/program_info/org.polymc.PolyMC.metainfo.xml.in b/program_info/org.polymc.PolyMC.metainfo.xml.in
index c7dc9481..03401f3d 100644
--- a/program_info/org.polymc.PolyMC.metainfo.xml.in
+++ b/program_info/org.polymc.PolyMC.metainfo.xml.in
@@ -54,4 +54,4 @@
     <content_attribute id="violence-fantasy">moderate</content_attribute>
     <content_attribute id="social-chat">intense</content_attribute>
   </content_rating>
-</component>
\ No newline at end of file
+</component>
-- 
cgit 


From 35d1330fe2afc56932bd4d250d8bd14d3a980369 Mon Sep 17 00:00:00 2001
From: txtsd <thexerothermicsclerodermoid@gmail.com>
Date: Mon, 7 Feb 2022 01:05:50 +0530
Subject: Build AppImages for Linux

Now builds windows and macOS builds,
with windeployqt and macdeploqt.
Also adds SHA to the build filenames.
---
 .github/workflows/build.yml | 85 ++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 73 insertions(+), 12 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index d7eeaf1d..f19da8d9 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -14,6 +14,11 @@ jobs:
             qt_version: 5.12.8
             qt_host: linux
 
+          - os: ubuntu-20.04
+            qt_version: 5.15.2
+            qt_host: linux
+            app_image: true
+
           - os: windows-2022
             qt_version: 5.15.2
             qt_host: windows
@@ -27,7 +32,9 @@ jobs:
     runs-on: ${{ matrix.os }}
 
     env:
-      MACOSX_DEPLOYMENT_TARGET: ${{matrix.macosx_deployment_target}}
+      MACOSX_DEPLOYMENT_TARGET: ${{ matrix.macosx_deployment_target }}
+      INSTALL_DIR: "install"
+      BUILD_DIR: "build"
 
     steps:
 
@@ -36,6 +43,11 @@ jobs:
         with:
           submodules: 'true'
 
+      - name: Install OpenJDK
+        uses: AdoptOpenJDK/install-jdk@v1
+        with:
+          version: '8'
+
       - name: Install OpenJDK
         uses: AdoptOpenJDK/install-jdk@v1
         with:
@@ -61,16 +73,52 @@ jobs:
         uses: urkle/action-get-ninja@v1
 
       - name: Configure CMake
+        if: matrix.app_image != true
+        run: |
+          cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=Debug -G Ninja
+
+      - name: Configure CMake for AppImage
+        if: matrix.app_image == true
         run: |
-          cmake -S . -B build -DCMAKE_INSTALL_PREFIX=install -DCMAKE_BUILD_TYPE=Debug -G Ninja
+          cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug -DLauncher_LAYOUT=lin-system -G Ninja
 
       - name: Build
         run: |
-          cmake --build build
+          cmake --build ${{ env.BUILD_DIR }}
 
       - name: Install
+        if: matrix.app_image != true
+        run: |
+          cmake --install ${{ env.BUILD_DIR }}
+
+      - name: Install for AppImage
+        if: matrix.app_image == true
         run: |
-          cmake --install build
+          DESTDIR=${{ env.INSTALL_DIR }} cmake --install ${{ env.BUILD_DIR }}
+
+      - name: Download linuxdeploy family
+        if: matrix.app_image == true
+        run: |
+          wget "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage"
+          wget "https://github.com/linuxdeploy/linuxdeploy-plugin-appimage/releases/download/continuous/linuxdeploy-plugin-appimage-x86_64.AppImage"
+          wget "https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage"
+
+      - name: AppImage magic
+        if: matrix.app_image == true
+        shell: bash
+        run: |
+          export OUTPUT="PolyMC-${{ github.sha }}-x86_64.AppImage"
+          chmod +x linuxdeploy-*.AppImage
+          mkdir -p ${{ env.INSTALL_DIR }}/usr/lib/jvm/java-{8,17}-openjdk
+          cp -r /opt/hostedtoolcache/jdk-8-hotspot/1.0.0/x64/* ${{ env.INSTALL_DIR }}/usr/lib/jvm/java-8-openjdk
+          cp -r /opt/hostedtoolcache/jdk-17-hotspot/1.0.0/x64/* ${{ env.INSTALL_DIR }}/usr/lib/jvm/java-17-openjdk
+          LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${{ env.INSTALL_DIR }}/usr/lib:${{ env.INSTALL_DIR }}/usr/lib/jvm/java-8-openjdk/jre/lib/amd64/server:${{ env.INSTALL_DIR }}/usr/lib/jvm/java-8-openjdk/jre/lib/amd64:${{ env.INSTALL_DIR }}/usr/lib/jvm/java-17-openjdk/lib/server:${{ env.INSTALL_DIR }}/usr/lib/jvm/java-17-openjdk/lib" \
+          ./linuxdeploy-x86_64.AppImage --appdir ${{ env.INSTALL_DIR }} --output appimage --plugin qt -d ${{ env.INSTALL_DIR }}/usr/share/applications/org.polymc.polymc.desktop -i ${{ env.INSTALL_DIR }}/usr/share/icons/hicolor/scalable/apps/org.polymc.PolyMC.svg
+
+      - name: Run windeployqt
+        if: runner.os == 'Windows'
+        run: |
+          windeployqt "${{ env.INSTALL_DIR }}/polymc.exe"
 
       - name: Install OpenSSL libs
         if: runner.os == 'Windows'
@@ -78,30 +126,43 @@ jobs:
           python -m pip install --upgrade pip
           python -m pip install aqtinstall==2.0.5
           python -m aqt install-tool -O "${{ github.workspace }}\Qt\" windows desktop tools_openssl_x64
-          copy "${{ github.workspace }}\Qt\Tools\OpenSSL\Win_x64\bin\libssl-1_1-x64.dll" "${{ github.workspace }}\install\"
-          copy "${{ github.workspace }}\Qt\Tools\OpenSSL\Win_x64\bin\libcrypto-1_1-x64.dll" "${{ github.workspace }}\install\"
+          copy "${{ github.workspace }}\Qt\Tools\OpenSSL\Win_x64\bin\libssl-1_1-x64.dll" "${{ github.workspace }}\${{ env.INSTALL_DIR }}\"
+          copy "${{ github.workspace }}\Qt\Tools\OpenSSL\Win_x64\bin\libcrypto-1_1-x64.dll" "${{ github.workspace }}\${{ env.INSTALL_DIR }}\"
+
+      - name: Run macdeployqt
+        if: runner.os == 'macOS'
+        run: |
+          cd ${{ env.INSTALL_DIR }}
+          macdeployqt "PolyMC.app" -executable="PolyMC.app/Contents/MacOS/polymc" -always-overwrite
 
       - name: chmod binary on macOS
         if: runner.os == 'macOS'
         run: |
-          chmod +x "${{ github.workspace }}/install/PolyMC.app/Contents/MacOS/polymc"
+          chmod +x "${{ github.workspace }}/${{ env.INSTALL_DIR }}/PolyMC.app/Contents/MacOS/polymc"
 
       - name: tar bundle on macOS
         if: runner.os == 'macOS'
         run: |
-          cd install
+          cd ${{ env.INSTALL_DIR }}
           tar -czf ../polymc.tar.gz *
 
+      - name: Upload AppImage
+        if: matrix.app_image == true
+        uses: actions/upload-artifact@v2
+        with:
+          name: PolyMC-${{ github.sha }}-x86_64.AppImage
+          path: PolyMC-${{ github.sha }}-x86_64.AppImage
+
       - name: Upload package for Linux and Windows
-        if: runner.os != 'macOS'
+        if: runner.os != 'macOS' && matrix.app_image != true
         uses: actions/upload-artifact@v2
         with:
-          name: polymc-${{ matrix.os }}-portable
-          path: install/**
+          name: polymc-${{ runner.os }}-${{ github.sha }}-portable
+          path: ${{ env.INSTALL_DIR }}/**
 
       - name: Upload package for macOS
         if: runner.os == 'macOS'
         uses: actions/upload-artifact@v2
         with:
-          name: polymc-${{ matrix.os }}-portable
+          name: polymc-${{ runner.os }}-${{ github.sha }}-portable
           path: polymc.tar.gz
-- 
cgit 


From 92a5b12bd9890eab3d5f6a9aa2fb24912a79ddf9 Mon Sep 17 00:00:00 2001
From: txtsd <thexerothermicsclerodermoid@gmail.com>
Date: Mon, 7 Feb 2022 09:55:42 +0530
Subject: Remove PrefersNonDefaultGPU

---
 program_info/org.polymc.PolyMC.desktop.in | 1 -
 1 file changed, 1 deletion(-)

diff --git a/program_info/org.polymc.PolyMC.desktop.in b/program_info/org.polymc.PolyMC.desktop.in
index 5d982b38..2d9e7103 100644
--- a/program_info/org.polymc.PolyMC.desktop.in
+++ b/program_info/org.polymc.PolyMC.desktop.in
@@ -7,7 +7,6 @@ Terminal=false
 Exec=@Launcher_APP_BINARY_NAME@
 StartupNotify=true
 Icon=org.polymc.PolyMC
-PrefersNonDefaultGPU=true
 Categories=Game;
 Keywords=game;minecraft;launcher;
 StartupWMClass=PolyMC
-- 
cgit 


From e61e827eb93c71f3b0fe1e7e07b5ca4887587532 Mon Sep 17 00:00:00 2001
From: txtsd <thexerothermicsclerodermoid@gmail.com>
Date: Mon, 7 Feb 2022 15:48:47 +0530
Subject: Use Adoptium JREs

---
 .github/scripts/prepare_JREs.sh | 49 +++++++++++++++++++++++++++++++++++++++++
 .github/workflows/build.yml     | 15 +++++++------
 2 files changed, 57 insertions(+), 7 deletions(-)
 create mode 100755 .github/scripts/prepare_JREs.sh

diff --git a/.github/scripts/prepare_JREs.sh b/.github/scripts/prepare_JREs.sh
new file mode 100755
index 00000000..1525fdb9
--- /dev/null
+++ b/.github/scripts/prepare_JREs.sh
@@ -0,0 +1,49 @@
+#!/usr/bin/env bash
+
+URL_JDK8="https://api.adoptium.net/v3/binary/latest/8/ga/linux/x64/jre/hotspot/normal/eclipse"
+URL_JDK17="https://api.adoptium.net/v3/binary/latest/17/ga/linux/x64/jre/hotspot/normal/eclipse"
+
+mkdir -p JREs
+pushd JREs
+
+wget --content-disposition "$URL_JDK8"
+wget --content-disposition "$URL_JDK17"
+
+for file in *;
+do
+    mkdir temp
+
+    # Handle OpenJDK17 archive
+    re='(OpenJDK17U-jre_x64_linux_hotspot_17.(.*).tar.gz)'
+    if [[ $file =~ $re ]];
+    then
+        version=${BASH_REMATCH[2]}
+        version_edit=$(echo $version | sed -e 's/_/+/g')
+        dir_name=jdk-17.$version_edit-jre
+        echo $dir_name
+        mkdir jre17
+        tar -xzf $file -C temp
+        pushd temp/$dir_name
+        cp -r . ../../jre17
+        popd
+
+    fi
+
+    # Handle OpenJDK8 archive
+    re='(OpenJDK8U-jre_x64_linux_hotspot_8(.*).tar.gz)'
+    if [[ $file =~ $re ]];
+    then
+        version=${BASH_REMATCH[2]}
+        version_edit=$(echo $version | sed -e 's/b/-b/g')
+        dir_name=jdk8$version_edit-jre
+        mkdir jre8
+        tar -xzf $file -C temp
+        pushd temp/$dir_name
+        cp -r . ../../jre8
+        popd
+    fi
+
+    rm -rf temp
+done
+
+popd
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index f19da8d9..d2973b0f 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -43,11 +43,6 @@ jobs:
         with:
           submodules: 'true'
 
-      - name: Install OpenJDK
-        uses: AdoptOpenJDK/install-jdk@v1
-        with:
-          version: '8'
-
       - name: Install OpenJDK
         uses: AdoptOpenJDK/install-jdk@v1
         with:
@@ -103,6 +98,12 @@ jobs:
           wget "https://github.com/linuxdeploy/linuxdeploy-plugin-appimage/releases/download/continuous/linuxdeploy-plugin-appimage-x86_64.AppImage"
           wget "https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage"
 
+      - name: Download JREs for AppImage
+        if: matrix.app_image == true
+        shell: bash
+        run: |
+          ${{ github.workspace }}/.github/scripts/prepare_JREs.sh
+
       - name: AppImage magic
         if: matrix.app_image == true
         shell: bash
@@ -110,8 +111,8 @@ jobs:
           export OUTPUT="PolyMC-${{ github.sha }}-x86_64.AppImage"
           chmod +x linuxdeploy-*.AppImage
           mkdir -p ${{ env.INSTALL_DIR }}/usr/lib/jvm/java-{8,17}-openjdk
-          cp -r /opt/hostedtoolcache/jdk-8-hotspot/1.0.0/x64/* ${{ env.INSTALL_DIR }}/usr/lib/jvm/java-8-openjdk
-          cp -r /opt/hostedtoolcache/jdk-17-hotspot/1.0.0/x64/* ${{ env.INSTALL_DIR }}/usr/lib/jvm/java-17-openjdk
+          cp -r ${{ github.workspace }}/JREs/jre8/* ${{ env.INSTALL_DIR }}/usr/lib/jvm/java-8-openjdk
+          cp -r ${{ github.workspace }}/JREs/jre17/* ${{ env.INSTALL_DIR }}/usr/lib/jvm/java-17-openjdk
           LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${{ env.INSTALL_DIR }}/usr/lib:${{ env.INSTALL_DIR }}/usr/lib/jvm/java-8-openjdk/jre/lib/amd64/server:${{ env.INSTALL_DIR }}/usr/lib/jvm/java-8-openjdk/jre/lib/amd64:${{ env.INSTALL_DIR }}/usr/lib/jvm/java-17-openjdk/lib/server:${{ env.INSTALL_DIR }}/usr/lib/jvm/java-17-openjdk/lib" \
           ./linuxdeploy-x86_64.AppImage --appdir ${{ env.INSTALL_DIR }} --output appimage --plugin qt -d ${{ env.INSTALL_DIR }}/usr/share/applications/org.polymc.polymc.desktop -i ${{ env.INSTALL_DIR }}/usr/share/icons/hicolor/scalable/apps/org.polymc.PolyMC.svg
 
-- 
cgit 


From 551d9c86ba624971a8b9362bb316d279dbf59363 Mon Sep 17 00:00:00 2001
From: txtsd <thexerothermicsclerodermoid@gmail.com>
Date: Mon, 7 Feb 2022 17:49:58 +0530
Subject: Implement PR suggestions

---
 .github/workflows/build.yml | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index d2973b0f..7b8f1968 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -67,6 +67,19 @@ jobs:
       - name: Install Ninja
         uses: urkle/action-get-ninja@v1
 
+      - name: Download linuxdeploy family
+        if: matrix.app_image == true
+        run: |
+          wget "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage"
+          wget "https://github.com/linuxdeploy/linuxdeploy-plugin-appimage/releases/download/continuous/linuxdeploy-plugin-appimage-x86_64.AppImage"
+          wget "https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage"
+
+      - name: Download JREs for AppImage
+        if: matrix.app_image == true
+        shell: bash
+        run: |
+          ${{ github.workspace }}/.github/scripts/prepare_JREs.sh
+
       - name: Configure CMake
         if: matrix.app_image != true
         run: |
@@ -91,20 +104,7 @@ jobs:
         run: |
           DESTDIR=${{ env.INSTALL_DIR }} cmake --install ${{ env.BUILD_DIR }}
 
-      - name: Download linuxdeploy family
-        if: matrix.app_image == true
-        run: |
-          wget "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage"
-          wget "https://github.com/linuxdeploy/linuxdeploy-plugin-appimage/releases/download/continuous/linuxdeploy-plugin-appimage-x86_64.AppImage"
-          wget "https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage"
-
-      - name: Download JREs for AppImage
-        if: matrix.app_image == true
-        shell: bash
-        run: |
-          ${{ github.workspace }}/.github/scripts/prepare_JREs.sh
-
-      - name: AppImage magic
+      - name: Bundle AppImage
         if: matrix.app_image == true
         shell: bash
         run: |
-- 
cgit 


From 94974851037f2c9ad313cfa72c65192be7c5ca64 Mon Sep 17 00:00:00 2001
From: txtsd <thexerothermicsclerodermoid@gmail.com>
Date: Mon, 7 Feb 2022 18:41:42 +0530
Subject: Implement more PR suggestions

---
 .github/workflows/build.yml | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 7b8f1968..600831c0 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -109,11 +109,21 @@ jobs:
         shell: bash
         run: |
           export OUTPUT="PolyMC-${{ github.sha }}-x86_64.AppImage"
+
           chmod +x linuxdeploy-*.AppImage
+
           mkdir -p ${{ env.INSTALL_DIR }}/usr/lib/jvm/java-{8,17}-openjdk
+
           cp -r ${{ github.workspace }}/JREs/jre8/* ${{ env.INSTALL_DIR }}/usr/lib/jvm/java-8-openjdk
+
           cp -r ${{ github.workspace }}/JREs/jre17/* ${{ env.INSTALL_DIR }}/usr/lib/jvm/java-17-openjdk
-          LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${{ env.INSTALL_DIR }}/usr/lib:${{ env.INSTALL_DIR }}/usr/lib/jvm/java-8-openjdk/jre/lib/amd64/server:${{ env.INSTALL_DIR }}/usr/lib/jvm/java-8-openjdk/jre/lib/amd64:${{ env.INSTALL_DIR }}/usr/lib/jvm/java-17-openjdk/lib/server:${{ env.INSTALL_DIR }}/usr/lib/jvm/java-17-openjdk/lib" \
+
+          export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${{ env.INSTALL_DIR }}/usr/lib"
+          LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${{ env.INSTALL_DIR }}/usr/lib/jvm/java-8-openjdk/lib/amd64/server"
+          LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${{ env.INSTALL_DIR }}/usr/lib/jvm/java-8-openjdk/lib/amd64"
+          LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${{ env.INSTALL_DIR }}/usr/lib/jvm/java-17-openjdk/lib/server"
+          LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${{ env.INSTALL_DIR }}/usr/lib/jvm/java-17-openjdk/lib"
+
           ./linuxdeploy-x86_64.AppImage --appdir ${{ env.INSTALL_DIR }} --output appimage --plugin qt -d ${{ env.INSTALL_DIR }}/usr/share/applications/org.polymc.polymc.desktop -i ${{ env.INSTALL_DIR }}/usr/share/icons/hicolor/scalable/apps/org.polymc.PolyMC.svg
 
       - name: Run windeployqt
-- 
cgit 


From 0ba61bb5903a22044decaa9390437e83be0dadd7 Mon Sep 17 00:00:00 2001
From: txtsd <thexerothermicsclerodermoid@gmail.com>
Date: Tue, 8 Feb 2022 08:55:52 +0530
Subject: Implement even more PR suggestions

---
 .github/scripts/prepare_JREs.sh | 38 +++++++++++++++-----------------------
 .github/workflows/build.yml     |  2 +-
 README.md                       |  5 +++++
 3 files changed, 21 insertions(+), 24 deletions(-)

diff --git a/.github/scripts/prepare_JREs.sh b/.github/scripts/prepare_JREs.sh
index 1525fdb9..b85e9c2f 100755
--- a/.github/scripts/prepare_JREs.sh
+++ b/.github/scripts/prepare_JREs.sh
@@ -13,33 +13,25 @@ for file in *;
 do
     mkdir temp
 
-    # Handle OpenJDK17 archive
-    re='(OpenJDK17U-jre_x64_linux_hotspot_17.(.*).tar.gz)'
+    re='(OpenJDK([[:digit:]]+)U-jre_x64_linux_hotspot_([[:digit:]]+)(.*).tar.gz)'
     if [[ $file =~ $re ]];
     then
-        version=${BASH_REMATCH[2]}
-        version_edit=$(echo $version | sed -e 's/_/+/g')
-        dir_name=jdk-17.$version_edit-jre
-        echo $dir_name
-        mkdir jre17
+        version_major=${BASH_REMATCH[2]}
+        version_trailing=${BASH_REMATCH[4]}
+
+        if [ $version_major = 17 ];
+        then
+            hyphen='-'
+        else
+            hyphen=''
+        fi
+
+        version_edit=$(echo $version_trailing | sed -e 's/_/+/g' | sed -e 's/b/-b/g')
+        dir_name=jdk$hyphen$version_major$version_edit-jre
+        mkdir jre$version_major
         tar -xzf $file -C temp
         pushd temp/$dir_name
-        cp -r . ../../jre17
-        popd
-
-    fi
-
-    # Handle OpenJDK8 archive
-    re='(OpenJDK8U-jre_x64_linux_hotspot_8(.*).tar.gz)'
-    if [[ $file =~ $re ]];
-    then
-        version=${BASH_REMATCH[2]}
-        version_edit=$(echo $version | sed -e 's/b/-b/g')
-        dir_name=jdk8$version_edit-jre
-        mkdir jre8
-        tar -xzf $file -C temp
-        pushd temp/$dir_name
-        cp -r . ../../jre8
+        cp -r . ../../jre$version_major
         popd
     fi
 
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 600831c0..42661b09 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -124,7 +124,7 @@ jobs:
           LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${{ env.INSTALL_DIR }}/usr/lib/jvm/java-17-openjdk/lib/server"
           LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${{ env.INSTALL_DIR }}/usr/lib/jvm/java-17-openjdk/lib"
 
-          ./linuxdeploy-x86_64.AppImage --appdir ${{ env.INSTALL_DIR }} --output appimage --plugin qt -d ${{ env.INSTALL_DIR }}/usr/share/applications/org.polymc.polymc.desktop -i ${{ env.INSTALL_DIR }}/usr/share/icons/hicolor/scalable/apps/org.polymc.PolyMC.svg
+          ./linuxdeploy-x86_64.AppImage --appdir ${{ env.INSTALL_DIR }} --output appimage --plugin qt -i ${{ env.INSTALL_DIR }}/usr/share/icons/hicolor/scalable/apps/org.polymc.PolyMC.svg
 
       - name: Run windeployqt
         if: runner.os == 'Windows'
diff --git a/README.md b/README.md
index 74d0493c..99f69b27 100644
--- a/README.md
+++ b/README.md
@@ -100,6 +100,11 @@ sudo dnf install polymc
 
 MacOS currently does not have any packages. We are still working on setting up MacOS packaging. Meanwhile, you can [build](https://github.com/PolyMC/PolyMC/blob/develop/BUILD.md#macos) it for yourself.
 
+## Development Builds
+
+There are per-commit development builds available [here](https://github.com/PolyMC/PolyMC/actions). These have debug information in the binaries, so their file sizes are relatively larger.
+Builds are provided for Linux, AppImage on Linux, Windows, and macOS.
+
 # Help & Support
 
 Feel free to create an issue if you need help. However, you might find it easier to ask in the Discord server.
-- 
cgit 


From 3eee38fedd50f41b5428fddbfb5583a61674f9b7 Mon Sep 17 00:00:00 2001
From: txtsd <thexerothermicsclerodermoid@gmail.com>
Date: Tue, 8 Feb 2022 18:44:30 +0530
Subject: Make 32bit Windows build instead

---
 .github/workflows/build.yml | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 42661b09..574c9c3e 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -22,7 +22,7 @@ jobs:
           - os: windows-2022
             qt_version: 5.15.2
             qt_host: windows
-            qt_arch: win64_mingw81
+            qt_arch: win32_mingw81
 
           - os: macos-11
             qt_version: 5.12.12
@@ -37,6 +37,16 @@ jobs:
       BUILD_DIR: "build"
 
     steps:
+      - name: Install 32bit mingw on Windows
+        if: runner.os == 'Windows'
+        uses: egor-tensin/setup-mingw@v2
+        with:
+          platform: x86
+
+      - name: Install 32bit zlib via Strawberry on Windows
+        if: runner.os == 'Windows'
+        run: |
+          choco install strawberryperl -y --force --x86
 
       - name: Checkout
         uses: actions/checkout@v2
@@ -53,7 +63,7 @@ jobs:
         uses: actions/cache@v2
         with:
           path: "${{ github.workspace }}/Qt/"
-          key: ${{ runner.os }}-${{ matrix.qt_version }}-qt_cache
+          key: ${{ runner.os }}-${{ matrix.qt_version }}-${{ matrix.qt_arch }}-qt_cache
 
       - name: Install Qt
         uses: jurplel/install-qt-action@v2
@@ -136,9 +146,9 @@ jobs:
         run: |
           python -m pip install --upgrade pip
           python -m pip install aqtinstall==2.0.5
-          python -m aqt install-tool -O "${{ github.workspace }}\Qt\" windows desktop tools_openssl_x64
-          copy "${{ github.workspace }}\Qt\Tools\OpenSSL\Win_x64\bin\libssl-1_1-x64.dll" "${{ github.workspace }}\${{ env.INSTALL_DIR }}\"
-          copy "${{ github.workspace }}\Qt\Tools\OpenSSL\Win_x64\bin\libcrypto-1_1-x64.dll" "${{ github.workspace }}\${{ env.INSTALL_DIR }}\"
+          python -m aqt install-tool -O "${{ github.workspace }}\Qt\" windows desktop tools_openssl_x86
+          copy "${{ github.workspace }}\Qt\Tools\OpenSSL\Win_x86\bin\libssl-1_1.dll" "${{ github.workspace }}\${{ env.INSTALL_DIR }}\"
+          copy "${{ github.workspace }}\Qt\Tools\OpenSSL\Win_x86\bin\libcrypto-1_1.dll" "${{ github.workspace }}\${{ env.INSTALL_DIR }}\"
 
       - name: Run macdeployqt
         if: runner.os == 'macOS'
-- 
cgit 


From eb692c2ee964d34c5aaa07f651e1f8bec3030a76 Mon Sep 17 00:00:00 2001
From: txtsd <thexerothermicsclerodermoid@gmail.com>
Date: Thu, 10 Feb 2022 20:58:31 +0530
Subject: Split OpenSSL step

---
 .github/workflows/build.yml | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 574c9c3e..5f1d398d 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -48,6 +48,13 @@ jobs:
         run: |
           choco install strawberryperl -y --force --x86
 
+      - name: Download OpenSSL libs on Windows
+        if: runner.os == 'Windows'
+        run: |
+          python -m pip install --upgrade pip
+          python -m pip install aqtinstall==2.0.5
+          python -m aqt install-tool -O "${{ github.workspace }}\Qt\" windows desktop tools_openssl_x86
+
       - name: Checkout
         uses: actions/checkout@v2
         with:
@@ -141,12 +148,9 @@ jobs:
         run: |
           windeployqt "${{ env.INSTALL_DIR }}/polymc.exe"
 
-      - name: Install OpenSSL libs
+      - name: Install OpenSSL libs on Windows
         if: runner.os == 'Windows'
         run: |
-          python -m pip install --upgrade pip
-          python -m pip install aqtinstall==2.0.5
-          python -m aqt install-tool -O "${{ github.workspace }}\Qt\" windows desktop tools_openssl_x86
           copy "${{ github.workspace }}\Qt\Tools\OpenSSL\Win_x86\bin\libssl-1_1.dll" "${{ github.workspace }}\${{ env.INSTALL_DIR }}\"
           copy "${{ github.workspace }}\Qt\Tools\OpenSSL\Win_x86\bin\libcrypto-1_1.dll" "${{ github.workspace }}\${{ env.INSTALL_DIR }}\"
 
-- 
cgit 


From 0e6e6a75211569ecad822a7dc7b44821833a600b Mon Sep 17 00:00:00 2001
From: txtsd <thexerothermicsclerodermoid@gmail.com>
Date: Thu, 10 Feb 2022 21:30:03 +0530
Subject: Remove generic Linux builds

They don't necessarily run on all distros
---
 .github/workflows/build.yml | 30 +++++++++++++-----------------
 1 file changed, 13 insertions(+), 17 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 5f1d398d..fa2c831c 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -10,10 +10,6 @@ jobs:
       matrix:
         include:
 
-          - os: ubuntu-20.04
-            qt_version: 5.12.8
-            qt_host: linux
-
           - os: ubuntu-20.04
             qt_version: 5.15.2
             qt_host: linux
@@ -85,25 +81,25 @@ jobs:
         uses: urkle/action-get-ninja@v1
 
       - name: Download linuxdeploy family
-        if: matrix.app_image == true
+        if: runner.os == 'Linux'
         run: |
           wget "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage"
           wget "https://github.com/linuxdeploy/linuxdeploy-plugin-appimage/releases/download/continuous/linuxdeploy-plugin-appimage-x86_64.AppImage"
           wget "https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage"
 
-      - name: Download JREs for AppImage
-        if: matrix.app_image == true
+      - name: Download JREs for AppImage on Linux
+        if: runner.os == 'Linux'
         shell: bash
         run: |
           ${{ github.workspace }}/.github/scripts/prepare_JREs.sh
 
       - name: Configure CMake
-        if: matrix.app_image != true
+        if: runner.os != 'Linux'
         run: |
           cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=Debug -G Ninja
 
-      - name: Configure CMake for AppImage
-        if: matrix.app_image == true
+      - name: Configure CMake on Linux
+        if: runner.os == 'Linux'
         run: |
           cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug -DLauncher_LAYOUT=lin-system -G Ninja
 
@@ -116,13 +112,13 @@ jobs:
         run: |
           cmake --install ${{ env.BUILD_DIR }}
 
-      - name: Install for AppImage
-        if: matrix.app_image == true
+      - name: Install for AppImage on Linux
+        if: runner.os == 'Linux'
         run: |
           DESTDIR=${{ env.INSTALL_DIR }} cmake --install ${{ env.BUILD_DIR }}
 
       - name: Bundle AppImage
-        if: matrix.app_image == true
+        if: runner.os == 'Linux'
         shell: bash
         run: |
           export OUTPUT="PolyMC-${{ github.sha }}-x86_64.AppImage"
@@ -171,15 +167,15 @@ jobs:
           cd ${{ env.INSTALL_DIR }}
           tar -czf ../polymc.tar.gz *
 
-      - name: Upload AppImage
-        if: matrix.app_image == true
+      - name: Upload AppImage for Linux
+        if: runner.os == 'Linux'
         uses: actions/upload-artifact@v2
         with:
           name: PolyMC-${{ github.sha }}-x86_64.AppImage
           path: PolyMC-${{ github.sha }}-x86_64.AppImage
 
-      - name: Upload package for Linux and Windows
-        if: runner.os != 'macOS' && matrix.app_image != true
+      - name: Upload package for Windows
+        if: runner.os == 'Windows'
         uses: actions/upload-artifact@v2
         with:
           name: polymc-${{ runner.os }}-${{ github.sha }}-portable
-- 
cgit 


From 33d369d78c5773ac2a9f9f0d9a7defcddc8f28f5 Mon Sep 17 00:00:00 2001
From: txtsd <thexerothermicsclerodermoid@gmail.com>
Date: Thu, 10 Feb 2022 22:34:14 +0530
Subject: Add missing deploy flags

---
 .github/workflows/build.yml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index fa2c831c..5c78e93e 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -142,7 +142,7 @@ jobs:
       - name: Run windeployqt
         if: runner.os == 'Windows'
         run: |
-          windeployqt "${{ env.INSTALL_DIR }}/polymc.exe"
+          windeployqt --no-translations "${{ env.INSTALL_DIR }}/polymc.exe"
 
       - name: Install OpenSSL libs on Windows
         if: runner.os == 'Windows'
@@ -154,7 +154,7 @@ jobs:
         if: runner.os == 'macOS'
         run: |
           cd ${{ env.INSTALL_DIR }}
-          macdeployqt "PolyMC.app" -executable="PolyMC.app/Contents/MacOS/polymc" -always-overwrite
+          macdeployqt "PolyMC.app" -executable="PolyMC.app/Contents/MacOS/polymc" -always-overwrite -use-debug-libs
 
       - name: chmod binary on macOS
         if: runner.os == 'macOS'
-- 
cgit 


From b9be8d08d2719aeafbb8f51327c4c1fa77cfd9db Mon Sep 17 00:00:00 2001
From: txtsd <thexerothermicsclerodermoid@gmail.com>
Date: Thu, 10 Feb 2022 23:26:16 +0530
Subject: Remove superfluous variable

---
 .github/workflows/build.yml | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 5c78e93e..eda7479a 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -13,7 +13,6 @@ jobs:
           - os: ubuntu-20.04
             qt_version: 5.15.2
             qt_host: linux
-            app_image: true
 
           - os: windows-2022
             qt_version: 5.15.2
@@ -108,7 +107,7 @@ jobs:
           cmake --build ${{ env.BUILD_DIR }}
 
       - name: Install
-        if: matrix.app_image != true
+        if: runner.os != 'Linux'
         run: |
           cmake --install ${{ env.BUILD_DIR }}
 
-- 
cgit 


From f67871e79ea2fcc3cf67c5e4c0f8ce9da909bb63 Mon Sep 17 00:00:00 2001
From: Sefa Eyeoglu <contact@scrumplex.net>
Date: Mon, 7 Feb 2022 15:44:46 +0100
Subject: refactor(build): link nbt++ statically

---
 CMakeLists.txt          | 4 +---
 launcher/CMakeLists.txt | 2 +-
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index fe19d820..74a63614 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -260,11 +260,9 @@ endif()
 include(ExternalProject)
 set_directory_properties(PROPERTIES EP_BASE External)
 
-option(NBT_BUILD_SHARED "Build NBT shared library" ON)
+option(NBT_BUILD_SHARED "Build NBT shared library" OFF)
 option(NBT_USE_ZLIB "Build NBT library with zlib support" OFF)
 option(NBT_BUILD_TESTS "Build NBT library tests" OFF) #FIXME: fix unit tests.
-set(NBT_NAME Launcher_nbt++)
-set(NBT_DEST_DIR ${LIBRARY_DEST_DIR})
 add_subdirectory(libraries/libnbtplusplus)
 
 add_subdirectory(libraries/systeminfo) # system information library
diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt
index 4fb24b54..1156fc08 100644
--- a/launcher/CMakeLists.txt
+++ b/launcher/CMakeLists.txt
@@ -941,7 +941,7 @@ add_library(Launcher_logic STATIC ${LOGIC_SOURCES} ${LAUNCHER_SOURCES} ${LAUNCHE
 target_link_libraries(Launcher_logic
     systeminfo
     Launcher_classparser
-    ${NBT_NAME}
+    nbt++
     ${ZLIB_LIBRARIES}
     optional-bare
     tomlc99
-- 
cgit 


From c4dd8d9c726122b88615d9cfcdaeb3bd7993a47c Mon Sep 17 00:00:00 2001
From: Ezekiel Smith <ezekielsmith@protonmail.com>
Date: Sat, 12 Feb 2022 01:03:33 +1000
Subject: Update LICENSE

---
 program_info/LICENSE | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/program_info/LICENSE b/program_info/LICENSE
index d60efe46..40cc6059 100644
--- a/program_info/LICENSE
+++ b/program_info/LICENSE
@@ -1,5 +1,7 @@
 Attribution-NonCommercial-ShareAlike 4.0 International
 
+This license only applies to the logos and branding in this folder.
+
 =======================================================================
 
 Creative Commons Corporation ("Creative Commons") is not a law firm and
-- 
cgit 


From e97a6ef957816eb693ddf1261097d419ecfb78de Mon Sep 17 00:00:00 2001
From: txtsd <thexerothermicsclerodermoid@gmail.com>
Date: Fri, 11 Feb 2022 21:45:00 +0530
Subject: Unsplit OpenSSL step

---
 .github/workflows/build.yml | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index eda7479a..c695e0bf 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -43,12 +43,16 @@ jobs:
         run: |
           choco install strawberryperl -y --force --x86
 
-      - name: Download OpenSSL libs on Windows
+      # We need to do this here because it inexplicably fails if we split the step
+      - name: Download and install OpenSSL libs on Windows
         if: runner.os == 'Windows'
         run: |
           python -m pip install --upgrade pip
           python -m pip install aqtinstall==2.0.5
           python -m aqt install-tool -O "${{ github.workspace }}\Qt\" windows desktop tools_openssl_x86
+          mkdir ${{ env.INSTALL_DIR }}
+          copy "${{ github.workspace }}\Qt\Tools\OpenSSL\Win_x86\bin\libssl-1_1.dll" "${{ github.workspace }}\${{ env.INSTALL_DIR }}\"
+          copy "${{ github.workspace }}\Qt\Tools\OpenSSL\Win_x86\bin\libcrypto-1_1.dll" "${{ github.workspace }}\${{ env.INSTALL_DIR }}\"
 
       - name: Checkout
         uses: actions/checkout@v2
@@ -143,12 +147,6 @@ jobs:
         run: |
           windeployqt --no-translations "${{ env.INSTALL_DIR }}/polymc.exe"
 
-      - name: Install OpenSSL libs on Windows
-        if: runner.os == 'Windows'
-        run: |
-          copy "${{ github.workspace }}\Qt\Tools\OpenSSL\Win_x86\bin\libssl-1_1.dll" "${{ github.workspace }}\${{ env.INSTALL_DIR }}\"
-          copy "${{ github.workspace }}\Qt\Tools\OpenSSL\Win_x86\bin\libcrypto-1_1.dll" "${{ github.workspace }}\${{ env.INSTALL_DIR }}\"
-
       - name: Run macdeployqt
         if: runner.os == 'macOS'
         run: |
-- 
cgit 


From 3cf81faabc8c7cc74251df9ab5894dfc844cb574 Mon Sep 17 00:00:00 2001
From: swirl <swurl@swurl.xyz>
Date: Fri, 11 Feb 2022 22:09:47 -0500
Subject: change "loader mods" to "mods"

Closes: #128
---
 launcher/InstancePageProvider.h | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/launcher/InstancePageProvider.h b/launcher/InstancePageProvider.h
index 2af90b91..97eeab8c 100644
--- a/launcher/InstancePageProvider.h
+++ b/launcher/InstancePageProvider.h
@@ -37,7 +37,7 @@ public:
         if(onesix)
         {
             values.append(new VersionPage(onesix.get()));
-            auto modsPage = new ModFolderPage(onesix.get(), onesix->loaderModList(), "mods", "loadermods", tr("Loader mods"), "Loader-mods");
+            auto modsPage = new ModFolderPage(onesix.get(), onesix->loaderModList(), "mods", "loadermods", tr("Mods"), "Loader-mods");
             modsPage->setFilter("%1 (*.zip *.jar *.litemod)");
             values.append(modsPage);
             values.append(new CoreModFolderPage(onesix.get(), onesix->coreModList(), "coremods", "coremods", tr("Core mods"), "Core-mods"));
@@ -74,3 +74,4 @@ public:
 protected:
     InstancePtr inst;
 };
+
-- 
cgit 


From fb14796ed7c98a120f3db3e940e4a5bfe0965279 Mon Sep 17 00:00:00 2001
From: txtsd <thexerothermicsclerodermoid@gmail.com>
Date: Sat, 12 Feb 2022 10:00:13 +0530
Subject: Adjust OpenSSL step

---
 .github/workflows/build.yml | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index c695e0bf..d2ccc59e 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -43,6 +43,11 @@ jobs:
         run: |
           choco install strawberryperl -y --force --x86
 
+      - name: Checkout
+        uses: actions/checkout@v2
+        with:
+          submodules: 'true'
+
       # We need to do this here because it inexplicably fails if we split the step
       - name: Download and install OpenSSL libs on Windows
         if: runner.os == 'Windows'
@@ -54,11 +59,6 @@ jobs:
           copy "${{ github.workspace }}\Qt\Tools\OpenSSL\Win_x86\bin\libssl-1_1.dll" "${{ github.workspace }}\${{ env.INSTALL_DIR }}\"
           copy "${{ github.workspace }}\Qt\Tools\OpenSSL\Win_x86\bin\libcrypto-1_1.dll" "${{ github.workspace }}\${{ env.INSTALL_DIR }}\"
 
-      - name: Checkout
-        uses: actions/checkout@v2
-        with:
-          submodules: 'true'
-
       - name: Install OpenJDK
         uses: AdoptOpenJDK/install-jdk@v1
         with:
-- 
cgit 


From 812f00eb81158bfb4c2d61b228c0c1c796641ac1 Mon Sep 17 00:00:00 2001
From: Sefa Eyeoglu <contact@scrumplex.net>
Date: Tue, 8 Feb 2022 16:33:30 +0100
Subject: refactor(build): link rainbow statically

---
 libraries/rainbow/CMakeLists.txt | 13 ++++---------
 1 file changed, 4 insertions(+), 9 deletions(-)

diff --git a/libraries/rainbow/CMakeLists.txt b/libraries/rainbow/CMakeLists.txt
index 833538e3..6264ca71 100644
--- a/libraries/rainbow/CMakeLists.txt
+++ b/libraries/rainbow/CMakeLists.txt
@@ -8,15 +8,10 @@ set(RAINBOW_SOURCES
 src/rainbow.cpp
 )
 
-add_definitions(-DRAINBOW_LIBRARY)
-add_library(Launcher_rainbow SHARED ${RAINBOW_SOURCES})
-target_include_directories(Launcher_rainbow PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")
+add_library(Launcher_rainbow ${RAINBOW_SOURCES})
+target_compile_definitions(Launcher_rainbow PRIVATE RAINBOW_LIBRARY)
+target_compile_definitions(Launcher_rainbow PRIVATE RAINBOW_STATIC)
+target_include_directories(Launcher_rainbow PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include" "${CMAKE_CURRENT_BINARY_DIR}")
 
 target_link_libraries(Launcher_rainbow Qt5::Core Qt5::Gui)
 
-# Install it
-install(
-    TARGETS Launcher_rainbow
-    RUNTIME DESTINATION ${LIBRARY_DEST_DIR}
-    LIBRARY DESTINATION ${LIBRARY_DEST_DIR}
-)
-- 
cgit 


From 6ba031f048621eaa1b7e1335662b5d7cb4103060 Mon Sep 17 00:00:00 2001
From: Sefa Eyeoglu <contact@scrumplex.net>
Date: Tue, 8 Feb 2022 16:33:37 +0100
Subject: refactor(build): link iconfix statically

---
 libraries/iconfix/CMakeLists.txt | 10 +---------
 1 file changed, 1 insertion(+), 9 deletions(-)

diff --git a/libraries/iconfix/CMakeLists.txt b/libraries/iconfix/CMakeLists.txt
index 52a31c68..049879c4 100644
--- a/libraries/iconfix/CMakeLists.txt
+++ b/libraries/iconfix/CMakeLists.txt
@@ -12,17 +12,9 @@ internal/qiconloader.cpp
 internal/qiconloader_p.h
 )
 
-add_library(Launcher_iconfix SHARED ${ICONFIX_SOURCES})
+add_library(Launcher_iconfix ${ICONFIX_SOURCES})
 target_include_directories(Launcher_iconfix PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} "${CMAKE_CURRENT_BINARY_DIR}" )
 
 target_link_libraries(Launcher_iconfix Qt5::Core Qt5::Widgets)
 
-set_target_properties(Launcher_iconfix PROPERTIES CXX_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN 1)
 generate_export_header(Launcher_iconfix)
-
-# Install it
-install(
-    TARGETS Launcher_iconfix
-    RUNTIME DESTINATION ${LIBRARY_DEST_DIR}
-    LIBRARY DESTINATION ${LIBRARY_DEST_DIR}
-)
\ No newline at end of file
-- 
cgit 


From a60b2feb5ff018dff18286e4164d599f88c4c18a Mon Sep 17 00:00:00 2001
From: Sefa Eyeoglu <contact@scrumplex.net>
Date: Sat, 12 Feb 2022 16:56:35 +0100
Subject: Revert "refactor(build): link rainbow statically"

Windows build fails for some reason. Needs to be investigated later

This reverts commit 812f00eb81158bfb4c2d61b228c0c1c796641ac1.
---
 libraries/rainbow/CMakeLists.txt | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/libraries/rainbow/CMakeLists.txt b/libraries/rainbow/CMakeLists.txt
index 6264ca71..833538e3 100644
--- a/libraries/rainbow/CMakeLists.txt
+++ b/libraries/rainbow/CMakeLists.txt
@@ -8,10 +8,15 @@ set(RAINBOW_SOURCES
 src/rainbow.cpp
 )
 
-add_library(Launcher_rainbow ${RAINBOW_SOURCES})
-target_compile_definitions(Launcher_rainbow PRIVATE RAINBOW_LIBRARY)
-target_compile_definitions(Launcher_rainbow PRIVATE RAINBOW_STATIC)
-target_include_directories(Launcher_rainbow PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include" "${CMAKE_CURRENT_BINARY_DIR}")
+add_definitions(-DRAINBOW_LIBRARY)
+add_library(Launcher_rainbow SHARED ${RAINBOW_SOURCES})
+target_include_directories(Launcher_rainbow PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")
 
 target_link_libraries(Launcher_rainbow Qt5::Core Qt5::Gui)
 
+# Install it
+install(
+    TARGETS Launcher_rainbow
+    RUNTIME DESTINATION ${LIBRARY_DEST_DIR}
+    LIBRARY DESTINATION ${LIBRARY_DEST_DIR}
+)
-- 
cgit 


From 61db1c46beb465c33124ec4f34dfdcefd4d804d3 Mon Sep 17 00:00:00 2001
From: Sefa Eyeoglu <contact@scrumplex.net>
Date: Sat, 12 Feb 2022 17:02:54 +0100
Subject: fix: use our own prefix for rainbow lib

---
 launcher/CMakeLists.txt          | 2 +-
 libraries/rainbow/CMakeLists.txt | 8 ++++----
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt
index 1156fc08..3d2d4382 100644
--- a/launcher/CMakeLists.txt
+++ b/launcher/CMakeLists.txt
@@ -959,7 +959,7 @@ target_link_libraries(Launcher_logic
     Launcher_iconfix
     QuaZip::QuaZip
     hoedown
-    Launcher_rainbow
+    PolyMC_rainbow
     LocalPeer
 )
 
diff --git a/libraries/rainbow/CMakeLists.txt b/libraries/rainbow/CMakeLists.txt
index 833538e3..a07135c3 100644
--- a/libraries/rainbow/CMakeLists.txt
+++ b/libraries/rainbow/CMakeLists.txt
@@ -9,14 +9,14 @@ src/rainbow.cpp
 )
 
 add_definitions(-DRAINBOW_LIBRARY)
-add_library(Launcher_rainbow SHARED ${RAINBOW_SOURCES})
-target_include_directories(Launcher_rainbow PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")
+add_library(PolyMC_rainbow SHARED ${RAINBOW_SOURCES})
+target_include_directories(PolyMC_rainbow PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")
 
-target_link_libraries(Launcher_rainbow Qt5::Core Qt5::Gui)
+target_link_libraries(PolyMC_rainbow Qt5::Core Qt5::Gui)
 
 # Install it
 install(
-    TARGETS Launcher_rainbow
+    TARGETS PolyMC_rainbow
     RUNTIME DESTINATION ${LIBRARY_DEST_DIR}
     LIBRARY DESTINATION ${LIBRARY_DEST_DIR}
 )
-- 
cgit 


From 3b7cc4391a8788f5b940a66a92e1ab2b7ae80d6d Mon Sep 17 00:00:00 2001
From: Sefa Eyeoglu <contact@scrumplex.net>
Date: Sat, 12 Feb 2022 18:17:56 +0100
Subject: fix: don't use custom for version channel

Closes #159
---
 buildconfig/BuildConfig.cpp.in | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/buildconfig/BuildConfig.cpp.in b/buildconfig/BuildConfig.cpp.in
index 5d5167ec..074ce8de 100644
--- a/buildconfig/BuildConfig.cpp.in
+++ b/buildconfig/BuildConfig.cpp.in
@@ -30,15 +30,17 @@ Config::Config()
 
     GIT_COMMIT = "@Launcher_GIT_COMMIT@";
     GIT_REFSPEC = "@Launcher_GIT_REFSPEC@";
-    if(GIT_REFSPEC.startsWith("refs/heads/") && !UPDATER_BASE.isEmpty() && !BUILD_PLATFORM.isEmpty() && VERSION_BUILD >= 0)
+    if(GIT_REFSPEC.startsWith("refs/heads/"))
     {
         VERSION_CHANNEL = GIT_REFSPEC;
         VERSION_CHANNEL.remove("refs/heads/");
-        UPDATER_ENABLED = true;
+        if(!UPDATER_BASE.isEmpty() && !BUILD_PLATFORM.isEmpty() && VERSION_BUILD >= 0) {
+            UPDATER_ENABLED = true;
+        }
     }
     else
     {
-        VERSION_CHANNEL = QObject::tr("custom");
+        VERSION_CHANNEL = QObject::tr("unknown");
     }
 
     VERSION_STR = "@Launcher_VERSION_STRING@";
-- 
cgit 


From 9ddbaaf7e8b844200b5d33c7b4702beaf201c55f Mon Sep 17 00:00:00 2001
From: Sefa Eyeoglu <contact@scrumplex.net>
Date: Sat, 12 Feb 2022 19:04:22 +0100
Subject: feat: use commit hash for channel if ref not available

---
 buildconfig/BuildConfig.cpp.in | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/buildconfig/BuildConfig.cpp.in b/buildconfig/BuildConfig.cpp.in
index 074ce8de..0ffc9326 100644
--- a/buildconfig/BuildConfig.cpp.in
+++ b/buildconfig/BuildConfig.cpp.in
@@ -38,6 +38,10 @@ Config::Config()
             UPDATER_ENABLED = true;
         }
     }
+    else if (!GIT_COMMIT.isEmpty())
+    {
+        VERSION_CHANNEL = GIT_COMMIT.mid(0, 8);
+    }
     else
     {
         VERSION_CHANNEL = QObject::tr("unknown");
-- 
cgit 


From bb02226870a21c08ec534295ea0dcb8dd4c542cf Mon Sep 17 00:00:00 2001
From: Sefa Eyeoglu <contact@scrumplex.net>
Date: Sat, 12 Feb 2022 20:08:50 +0100
Subject: feat(ui): add custom MSA client id setting

---
 launcher/Application.cpp               |   7 +-
 launcher/CMakeLists.txt                |   6 +-
 launcher/ui/pages/global/APIPage.cpp   |  67 ++++++++++++
 launcher/ui/pages/global/APIPage.h     |  60 +++++++++++
 launcher/ui/pages/global/APIPage.ui    | 179 +++++++++++++++++++++++++++++++++
 launcher/ui/pages/global/PastePage.cpp |  63 ------------
 launcher/ui/pages/global/PastePage.h   |  60 -----------
 launcher/ui/pages/global/PastePage.ui  | 127 -----------------------
 8 files changed, 314 insertions(+), 255 deletions(-)
 create mode 100644 launcher/ui/pages/global/APIPage.cpp
 create mode 100644 launcher/ui/pages/global/APIPage.h
 create mode 100644 launcher/ui/pages/global/APIPage.ui
 delete mode 100644 launcher/ui/pages/global/PastePage.cpp
 delete mode 100644 launcher/ui/pages/global/PastePage.h
 delete mode 100644 launcher/ui/pages/global/PastePage.ui

diff --git a/launcher/Application.cpp b/launcher/Application.cpp
index 93cefc28..5e70c729 100644
--- a/launcher/Application.cpp
+++ b/launcher/Application.cpp
@@ -14,7 +14,7 @@
 #include "ui/pages/global/ProxyPage.h"
 #include "ui/pages/global/ExternalToolsPage.h"
 #include "ui/pages/global/AccountListPage.h"
-#include "ui/pages/global/PastePage.h"
+#include "ui/pages/global/APIPage.h"
 #include "ui/pages/global/CustomCommandsPage.h"
 
 #include "ui/themes/ITheme.h"
@@ -719,6 +719,9 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv)
 
         m_settings->registerSetting("CloseAfterLaunch", false);
 
+        // Custom MSA credentials
+        m_settings->registerSetting("MSAClientIDOverride", "");
+
         // Init page provider
         {
             m_globalSettingsProvider = std::make_shared<GenericPageProvider>(tr("Settings"));
@@ -730,7 +733,7 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv)
             m_globalSettingsProvider->addPage<ProxyPage>();
             m_globalSettingsProvider->addPage<ExternalToolsPage>();
             m_globalSettingsProvider->addPage<AccountListPage>();
-            m_globalSettingsProvider->addPage<PastePage>();
+            m_globalSettingsProvider->addPage<APIPage>();
         }
         qDebug() << "<> Settings loaded.";
     }
diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt
index 3d2d4382..90149c3b 100644
--- a/launcher/CMakeLists.txt
+++ b/launcher/CMakeLists.txt
@@ -723,8 +723,8 @@ SET(LAUNCHER_SOURCES
     ui/pages/global/LauncherPage.h
     ui/pages/global/ProxyPage.cpp
     ui/pages/global/ProxyPage.h
-    ui/pages/global/PastePage.cpp
-    ui/pages/global/PastePage.h
+    ui/pages/global/APIPage.cpp
+    ui/pages/global/APIPage.h
 
     # GUI - platform pages
     ui/pages/modplatform/VanillaPage.cpp
@@ -871,7 +871,7 @@ qt5_wrap_ui(LAUNCHER_UI
     ui/pages/global/AccountListPage.ui
     ui/pages/global/JavaPage.ui
     ui/pages/global/LauncherPage.ui
-    ui/pages/global/PastePage.ui
+    ui/pages/global/APIPage.ui
     ui/pages/global/ProxyPage.ui
     ui/pages/global/MinecraftPage.ui
     ui/pages/global/ExternalToolsPage.ui
diff --git a/launcher/ui/pages/global/APIPage.cpp b/launcher/ui/pages/global/APIPage.cpp
new file mode 100644
index 00000000..ad79e00c
--- /dev/null
+++ b/launcher/ui/pages/global/APIPage.cpp
@@ -0,0 +1,67 @@
+/* Copyright 2013-2021 MultiMC & PolyMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "APIPage.h"
+#include "ui_APIPage.h"
+
+#include <QMessageBox>
+#include <QFileDialog>
+#include <QStandardPaths>
+#include <QTabBar>
+#include <QVariant>
+
+#include "settings/SettingsObject.h"
+#include "tools/BaseProfiler.h"
+#include "Application.h"
+
+APIPage::APIPage(QWidget *parent) :
+    QWidget(parent),
+    ui(new Ui::APIPage)
+{
+    static QRegularExpression validUrlRegExp("https?://.+");
+    ui->setupUi(this);
+    ui->urlChoices->setValidator(new QRegularExpressionValidator(validUrlRegExp, ui->urlChoices));
+    ui->tabWidget->tabBar()->hide();\
+    loadSettings();
+}
+
+APIPage::~APIPage()
+{
+    delete ui;
+}
+
+void APIPage::loadSettings()
+{
+    auto s = APPLICATION->settings();
+    QString pastebinURL = s->get("PastebinURL").toString();
+    ui->urlChoices->setCurrentText(pastebinURL);
+    QString msaClientID = s->get("MSAClientIDOverride").toString();
+    ui->msaClientID->setText(msaClientID);
+}
+
+void APIPage::applySettings()
+{
+    auto s = APPLICATION->settings();
+    QString pastebinURL = ui->urlChoices->currentText();
+    s->set("PastebinURL", pastebinURL);
+    QString msaClientID = ui->msaClientID->text();
+    s->set("MSAClientIDOverride", msaClientID);
+}
+
+bool APIPage::apply()
+{
+    applySettings();
+    return true;
+}
diff --git a/launcher/ui/pages/global/APIPage.h b/launcher/ui/pages/global/APIPage.h
new file mode 100644
index 00000000..9474ebbb
--- /dev/null
+++ b/launcher/ui/pages/global/APIPage.h
@@ -0,0 +1,60 @@
+/* Copyright 2013-2021 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <QWidget>
+
+#include "ui/pages/BasePage.h"
+#include <Application.h>
+
+namespace Ui {
+class APIPage;
+}
+
+class APIPage : public QWidget, public BasePage
+{
+    Q_OBJECT
+
+public:
+    explicit APIPage(QWidget *parent = 0);
+    ~APIPage();
+
+    QString displayName() const override
+    {
+        return tr("APIs");
+    }
+    QIcon icon() const override
+    {
+        return APPLICATION->getThemedIcon("worlds");
+    }
+    QString id() const override
+    {
+        return "apis";
+    }
+    QString helpPage() const override
+    {
+        return "APIs";
+    }
+    virtual bool apply() override;
+
+private:
+    void loadSettings();
+    void applySettings();
+
+private:
+    Ui::APIPage *ui;
+};
+
diff --git a/launcher/ui/pages/global/APIPage.ui b/launcher/ui/pages/global/APIPage.ui
new file mode 100644
index 00000000..38bbc525
--- /dev/null
+++ b/launcher/ui/pages/global/APIPage.ui
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>APIPage</class>
+ <widget class="QWidget" name="APIPage">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>491</width>
+    <height>474</height>
+   </rect>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QTabWidget" name="tabWidget">
+     <property name="currentIndex">
+      <number>0</number>
+     </property>
+     <widget class="QWidget" name="tab">
+      <attribute name="title">
+       <string notr="true">Tab 1</string>
+      </attribute>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <item>
+        <widget class="QGroupBox" name="groupBox_paste">
+         <property name="title">
+          <string>Pastebin URL</string>
+         </property>
+         <layout class="QVBoxLayout" name="verticalLayout_3">
+          <item>
+           <widget class="Line" name="line">
+            <property name="orientation">
+             <enum>Qt::Horizontal</enum>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QLabel" name="label_2">
+            <property name="font">
+             <font>
+              <pointsize>10</pointsize>
+             </font>
+            </property>
+            <property name="text">
+             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Note: only input that starts with &lt;span style=&quot; font-weight:600;&quot;&gt;http://&lt;/span&gt; or &lt;span style=&quot; font-weight:600;&quot;&gt;https://&lt;/span&gt; will be accepted.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+            </property>
+            <property name="scaledContents">
+             <bool>false</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QComboBox" name="urlChoices">
+            <property name="editable">
+             <bool>true</bool>
+            </property>
+            <property name="insertPolicy">
+             <enum>QComboBox::NoInsert</enum>
+            </property>
+            <item>
+             <property name="text">
+              <string>https://0x0.st</string>
+             </property>
+            </item>
+            <item>
+             <property name="text">
+              <string>https://paste.polymc.org</string>
+             </property>
+            </item>
+           </widget>
+          </item>
+          <item>
+           <widget class="QLabel" name="label">
+            <property name="text">
+             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Here you can choose from a predefined list of paste services, or input the URL of a different paste service of your choice, provided it supports the same protocol as 0x0.st, that is POST a file parameter to the URL and return a link in the response body.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+            </property>
+            <property name="textFormat">
+             <enum>Qt::RichText</enum>
+            </property>
+            <property name="wordWrap">
+             <bool>true</bool>
+            </property>
+            <property name="openExternalLinks">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item>
+        <widget class="QGroupBox" name="groupBox_msa">
+         <property name="title">
+          <string>Microsoft Secured Account</string>
+         </property>
+         <layout class="QVBoxLayout" name="verticalLayout_4">
+          <item>
+           <widget class="Line" name="line_2">
+            <property name="orientation">
+             <enum>Qt::Horizontal</enum>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QLabel" name="label_3">
+            <property name="text">
+             <string>Note: you probably don't need to set this if logging in via Microsoft Secured Account already works.</string>
+            </property>
+            <property name="textFormat">
+             <enum>Qt::RichText</enum>
+            </property>
+            <property name="wordWrap">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QLineEdit" name="msaClientID">
+            <property name="placeholderText">
+             <string>(Default)</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QLabel" name="label_4">
+            <property name="text">
+             <string>Enter a custom client ID for Microsoft Secured Account here. </string>
+            </property>
+            <property name="textFormat">
+             <enum>Qt::RichText</enum>
+            </property>
+            <property name="wordWrap">
+             <bool>true</bool>
+            </property>
+            <property name="openExternalLinks">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item>
+        <spacer name="verticalSpacer">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <tabstops>
+  <tabstop>tabWidget</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/launcher/ui/pages/global/PastePage.cpp b/launcher/ui/pages/global/PastePage.cpp
deleted file mode 100644
index 7c69e1a4..00000000
--- a/launcher/ui/pages/global/PastePage.cpp
+++ /dev/null
@@ -1,63 +0,0 @@
-/* Copyright 2013-2021 MultiMC & PolyMC Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "PastePage.h"
-#include "ui_PastePage.h"
-
-#include <QMessageBox>
-#include <QFileDialog>
-#include <QStandardPaths>
-#include <QTabBar>
-#include <QVariant>
-
-#include "settings/SettingsObject.h"
-#include "tools/BaseProfiler.h"
-#include "Application.h"
-
-PastePage::PastePage(QWidget *parent) :
-    QWidget(parent),
-    ui(new Ui::PastePage)
-{
-    static QRegularExpression validUrlRegExp("https?://.+");
-    ui->setupUi(this);
-    ui->urlChoices->setValidator(new QRegularExpressionValidator(validUrlRegExp, ui->urlChoices));
-    ui->tabWidget->tabBar()->hide();\
-    loadSettings();
-}
-
-PastePage::~PastePage()
-{
-    delete ui;
-}
-
-void PastePage::loadSettings()
-{
-    auto s = APPLICATION->settings();
-    QString pastebinURL = s->get("PastebinURL").toString();
-    ui->urlChoices->setCurrentText(pastebinURL);
-}
-
-void PastePage::applySettings()
-{
-    auto s = APPLICATION->settings();
-    QString pastebinURL = ui->urlChoices->currentText();
-    s->set("PastebinURL", pastebinURL);
-}
-
-bool PastePage::apply()
-{
-    applySettings();
-    return true;
-}
diff --git a/launcher/ui/pages/global/PastePage.h b/launcher/ui/pages/global/PastePage.h
deleted file mode 100644
index d475dfd9..00000000
--- a/launcher/ui/pages/global/PastePage.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Copyright 2013-2021 MultiMC Contributors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <QWidget>
-
-#include "ui/pages/BasePage.h"
-#include <Application.h>
-
-namespace Ui {
-class PastePage;
-}
-
-class PastePage : public QWidget, public BasePage
-{
-    Q_OBJECT
-
-public:
-    explicit PastePage(QWidget *parent = 0);
-    ~PastePage();
-
-    QString displayName() const override
-    {
-        return tr("Log Upload");
-    }
-    QIcon icon() const override
-    {
-        return APPLICATION->getThemedIcon("log");
-    }
-    QString id() const override
-    {
-        return "log-upload";
-    }
-    QString helpPage() const override
-    {
-        return "Log-Upload";
-    }
-    virtual bool apply() override;
-
-private:
-    void loadSettings();
-    void applySettings();
-
-private:
-    Ui::PastePage *ui;
-};
-
diff --git a/launcher/ui/pages/global/PastePage.ui b/launcher/ui/pages/global/PastePage.ui
deleted file mode 100644
index 2d13a765..00000000
--- a/launcher/ui/pages/global/PastePage.ui
+++ /dev/null
@@ -1,127 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>PastePage</class>
- <widget class="QWidget" name="PastePage">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>491</width>
-    <height>474</height>
-   </rect>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <property name="leftMargin">
-    <number>0</number>
-   </property>
-   <property name="topMargin">
-    <number>0</number>
-   </property>
-   <property name="rightMargin">
-    <number>0</number>
-   </property>
-   <property name="bottomMargin">
-    <number>0</number>
-   </property>
-   <item>
-    <widget class="QTabWidget" name="tabWidget">
-     <property name="currentIndex">
-      <number>0</number>
-     </property>
-     <widget class="QWidget" name="tab">
-      <attribute name="title">
-       <string notr="true">Tab 1</string>
-      </attribute>
-      <layout class="QVBoxLayout" name="verticalLayout_2">
-       <item>
-        <widget class="QGroupBox" name="groupBox_2">
-         <property name="title">
-          <string>Pastebin URL</string>
-         </property>
-         <layout class="QVBoxLayout" name="verticalLayout_3">
-          <item>
-           <widget class="Line" name="line">
-            <property name="orientation">
-             <enum>Qt::Horizontal</enum>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QLabel" name="label_2">
-            <property name="font">
-             <font>
-              <pointsize>10</pointsize>
-             </font>
-            </property>
-            <property name="text">
-             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Note: only input that starts with &lt;span style=&quot; font-weight:600;&quot;&gt;http://&lt;/span&gt; or &lt;span style=&quot; font-weight:600;&quot;&gt;https://&lt;/span&gt; will be accepted.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-            </property>
-            <property name="scaledContents">
-             <bool>false</bool>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <widget class="QComboBox" name="urlChoices">
-            <property name="editable">
-             <bool>true</bool>
-            </property>
-            <property name="insertPolicy">
-             <enum>QComboBox::NoInsert</enum>
-            </property>
-            <item>
-             <property name="text">
-              <string>https://0x0.st</string>
-             </property>
-            </item>
-            <item>
-             <property name="text">
-              <string>https://paste.polymc.org</string>
-             </property>
-            </item>
-           </widget>
-          </item>
-          <item>
-           <widget class="QLabel" name="label">
-            <property name="text">
-             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Here you can choose from a predefined list of paste services, or input the URL of a different paste service of your choice, provided it supports the same protocol as 0x0.st, that is POST a file parameter to the URL and return a link in the response body.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-            </property>
-            <property name="textFormat">
-             <enum>Qt::RichText</enum>
-            </property>
-            <property name="wordWrap">
-             <bool>true</bool>
-            </property>
-            <property name="openExternalLinks">
-             <bool>true</bool>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </widget>
-       </item>
-       <item>
-        <spacer name="verticalSpacer">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>20</width>
-           <height>216</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
-      </layout>
-     </widget>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <tabstops>
-  <tabstop>tabWidget</tabstop>
- </tabstops>
- <resources/>
- <connections/>
-</ui>
-- 
cgit 


From 0854e83ce48cb30b28bd05986970e506c1106e4e Mon Sep 17 00:00:00 2001
From: Sefa Eyeoglu <contact@scrumplex.net>
Date: Sat, 12 Feb 2022 20:20:51 +0100
Subject: feat: implement MSA client id override

Closes #11
---
 launcher/Application.cpp                     | 10 ++++++++++
 launcher/Application.h                       |  2 ++
 launcher/minecraft/auth/steps/MSAStep.cpp    |  2 +-
 launcher/ui/pages/global/AccountListPage.cpp |  2 +-
 4 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/launcher/Application.cpp b/launcher/Application.cpp
index 5e70c729..a3d6216e 100644
--- a/launcher/Application.cpp
+++ b/launcher/Application.cpp
@@ -1519,3 +1519,13 @@ QString Application::getJarsPath()
     }
     return m_jarsPath;
 }
+
+QString Application::getMSAClientID() 
+{
+    QString clientIDOverride = m_settings->get("MSAClientIDOverride").toString();
+    if (!clientIDOverride.isEmpty()) {
+        return clientIDOverride;
+    }
+
+    return BuildConfig.MSA_CLIENT_ID;
+}
diff --git a/launcher/Application.h b/launcher/Application.h
index c1cd8224..fb41d647 100644
--- a/launcher/Application.h
+++ b/launcher/Application.h
@@ -117,6 +117,8 @@ public:
 
     QString getJarsPath();
 
+    QString getMSAClientID();
+
     /// this is the root of the 'installation'. Used for automatic updates
     const QString &root() {
         return m_rootPath;
diff --git a/launcher/minecraft/auth/steps/MSAStep.cpp b/launcher/minecraft/auth/steps/MSAStep.cpp
index bc10aa4e..779aee43 100644
--- a/launcher/minecraft/auth/steps/MSAStep.cpp
+++ b/launcher/minecraft/auth/steps/MSAStep.cpp
@@ -14,7 +14,7 @@ using Activity = Katabasis::Activity;
 MSAStep::MSAStep(AccountData* data, Action action) : AuthStep(data), m_action(action) {
     OAuth2::Options opts;
     opts.scope = "XboxLive.signin offline_access";
-    opts.clientIdentifier = BuildConfig.MSA_CLIENT_ID;
+    opts.clientIdentifier = APPLICATION->getMSAClientID();
     opts.authorizationUrl = "https://login.microsoftonline.com/consumers/oauth2/v2.0/devicecode";
     opts.accessTokenUrl = "https://login.microsoftonline.com/consumers/oauth2/v2.0/token";
 
diff --git a/launcher/ui/pages/global/AccountListPage.cpp b/launcher/ui/pages/global/AccountListPage.cpp
index 396d320f..ea310acd 100644
--- a/launcher/ui/pages/global/AccountListPage.cpp
+++ b/launcher/ui/pages/global/AccountListPage.cpp
@@ -73,7 +73,7 @@ AccountListPage::AccountListPage(QWidget *parent)
     updateButtonStates();
 
     // Xbox authentication won't work without a client identifier, so disable the button if it is missing
-    ui->actionAddMicrosoft->setVisible(BuildConfig.MSA_CLIENT_ID.size() != 0);
+    ui->actionAddMicrosoft->setVisible(!APPLICATION->getMSAClientID().isEmpty());
 }
 
 AccountListPage::~AccountListPage()
-- 
cgit 


From 159d868b77e6962632e925caf80a347122203d27 Mon Sep 17 00:00:00 2001
From: Sefa Eyeoglu <contact@scrumplex.net>
Date: Sat, 12 Feb 2022 20:30:42 +0100
Subject: fix(ui): explain why 'Add Microsoft' might be disabled

---
 launcher/ui/pages/global/AccountListPage.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/launcher/ui/pages/global/AccountListPage.cpp b/launcher/ui/pages/global/AccountListPage.cpp
index ea310acd..740697a4 100644
--- a/launcher/ui/pages/global/AccountListPage.cpp
+++ b/launcher/ui/pages/global/AccountListPage.cpp
@@ -73,7 +73,10 @@ AccountListPage::AccountListPage(QWidget *parent)
     updateButtonStates();
 
     // Xbox authentication won't work without a client identifier, so disable the button if it is missing
-    ui->actionAddMicrosoft->setVisible(!APPLICATION->getMSAClientID().isEmpty());
+    if (APPLICATION->getMSAClientID().isEmpty()) {
+        ui->actionAddMicrosoft->setVisible(false);
+        ui->actionAddMicrosoft->setToolTip(tr("No Microsoft Secured Account client ID was set."));
+    }
 }
 
 AccountListPage::~AccountListPage()
-- 
cgit 


From a309f4e72143b28865d5a8b94dcf913d3a95773f Mon Sep 17 00:00:00 2001
From: Sefa Eyeoglu <contact@scrumplex.net>
Date: Sat, 12 Feb 2022 21:09:25 +0100
Subject: fix: MSA = Microsoft Authentication

---
 launcher/ui/pages/global/APIPage.ui          | 6 +++---
 launcher/ui/pages/global/AccountListPage.cpp | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/launcher/ui/pages/global/APIPage.ui b/launcher/ui/pages/global/APIPage.ui
index 38bbc525..28c53b79 100644
--- a/launcher/ui/pages/global/APIPage.ui
+++ b/launcher/ui/pages/global/APIPage.ui
@@ -103,7 +103,7 @@
        <item>
         <widget class="QGroupBox" name="groupBox_msa">
          <property name="title">
-          <string>Microsoft Secured Account</string>
+          <string>Microsoft Authentication</string>
          </property>
          <layout class="QVBoxLayout" name="verticalLayout_4">
           <item>
@@ -116,7 +116,7 @@
           <item>
            <widget class="QLabel" name="label_3">
             <property name="text">
-             <string>Note: you probably don't need to set this if logging in via Microsoft Secured Account already works.</string>
+             <string>Note: you probably don't need to set this if logging in via Microsoft Authentication already works.</string>
             </property>
             <property name="textFormat">
              <enum>Qt::RichText</enum>
@@ -136,7 +136,7 @@
           <item>
            <widget class="QLabel" name="label_4">
             <property name="text">
-             <string>Enter a custom client ID for Microsoft Secured Account here. </string>
+             <string>Enter a custom client ID for Microsoft Authentication here. </string>
             </property>
             <property name="textFormat">
              <enum>Qt::RichText</enum>
diff --git a/launcher/ui/pages/global/AccountListPage.cpp b/launcher/ui/pages/global/AccountListPage.cpp
index 740697a4..eb1ee8d3 100644
--- a/launcher/ui/pages/global/AccountListPage.cpp
+++ b/launcher/ui/pages/global/AccountListPage.cpp
@@ -75,7 +75,7 @@ AccountListPage::AccountListPage(QWidget *parent)
     // Xbox authentication won't work without a client identifier, so disable the button if it is missing
     if (APPLICATION->getMSAClientID().isEmpty()) {
         ui->actionAddMicrosoft->setVisible(false);
-        ui->actionAddMicrosoft->setToolTip(tr("No Microsoft Secured Account client ID was set."));
+        ui->actionAddMicrosoft->setToolTip(tr("No Microsoft Authentication client ID was set."));
     }
 }
 
-- 
cgit 


From 5779f20fa1633577889b7bda839c5486eb2ba922 Mon Sep 17 00:00:00 2001
From: swirl <swurl@swurl.xyz>
Date: Sun, 13 Feb 2022 13:35:04 -0500
Subject: make wsl work

---
 launcher/Application.cpp | 21 ---------------------
 1 file changed, 21 deletions(-)

diff --git a/launcher/Application.cpp b/launcher/Application.cpp
index a3d6216e..6bf090e1 100644
--- a/launcher/Application.cpp
+++ b/launcher/Application.cpp
@@ -192,27 +192,6 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv)
     #endif
     startTime = QDateTime::currentDateTime();
 
-#ifdef Q_OS_LINUX
-    {
-        QFile osrelease("/proc/sys/kernel/osrelease");
-        if (osrelease.open(QFile::ReadOnly | QFile::Text)) {
-            QTextStream in(&osrelease);
-            auto contents = in.readAll();
-            if(
-                contents.contains("WSL", Qt::CaseInsensitive) ||
-                contents.contains("Microsoft", Qt::CaseInsensitive)
-            ) {
-                showFatalErrorMessage(
-                    "Unsupported system detected!",
-                    "Linux-on-Windows distributions are not supported.\n\n"
-                    "Please use the Windows binary when playing on Windows."
-                );
-                return;
-            }
-        }
-    }
-#endif
-
     // Don't quit on hiding the last window
     this->setQuitOnLastWindowClosed(false);
 
-- 
cgit 


From 929a035f96ed1fbeeae2515f7d54fd9b004af4f6 Mon Sep 17 00:00:00 2001
From: Lenny McLennington <lennymclennington@protonmail.com>
Date: Sun, 13 Feb 2022 18:47:54 +0000
Subject: Revert "make wsl work"

This reverts commit 5779f20fa1633577889b7bda839c5486eb2ba922.
---
 launcher/Application.cpp | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/launcher/Application.cpp b/launcher/Application.cpp
index 6bf090e1..a3d6216e 100644
--- a/launcher/Application.cpp
+++ b/launcher/Application.cpp
@@ -192,6 +192,27 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv)
     #endif
     startTime = QDateTime::currentDateTime();
 
+#ifdef Q_OS_LINUX
+    {
+        QFile osrelease("/proc/sys/kernel/osrelease");
+        if (osrelease.open(QFile::ReadOnly | QFile::Text)) {
+            QTextStream in(&osrelease);
+            auto contents = in.readAll();
+            if(
+                contents.contains("WSL", Qt::CaseInsensitive) ||
+                contents.contains("Microsoft", Qt::CaseInsensitive)
+            ) {
+                showFatalErrorMessage(
+                    "Unsupported system detected!",
+                    "Linux-on-Windows distributions are not supported.\n\n"
+                    "Please use the Windows binary when playing on Windows."
+                );
+                return;
+            }
+        }
+    }
+#endif
+
     // Don't quit on hiding the last window
     this->setQuitOnLastWindowClosed(false);
 
-- 
cgit