From 86935068f522dedbb6673afd7075f156648abbb6 Mon Sep 17 00:00:00 2001 From: timoreo 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(-) (limited to 'launcher/ui') 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 #include #include #include +#include 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 35d2ae3ef789eef49bb7514d42deca43f339fda3 Mon Sep 17 00:00:00 2001 From: Lenny McLennington 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(-) (limited to 'launcher/ui') 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.
# 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 @@ - <html><body><h1>Upgrade is required</h1><p>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.</p><p>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.</p><p>Please report any issues on our <a href="https://github.com/PolyMC/PolyMC/issues">github issues page</a>.</p><p>There is also a <a href="https://discord.gg/GtPmv93">discord channel for testing here</a>.</p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Noto Sans'; font-size:11pt; font-weight:400; font-style:normal;"> +<h1 style=" margin-top:18px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600;">Upgrade is required</span></h1> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">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.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">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.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Please report any issues on our <a href="https://github.com/PolyMC/PolyMC/issues"><span style=" text-decoration: underline; color:#3584e4;">github issues page</span></a>.</p></body></html> true -- cgit From f8ca6b4867d1b01310269293426c65ef78c5ec67 Mon Sep 17 00:00:00 2001 From: dada513 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 (limited to 'launcher/ui') 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 +#include + +#include + +NewsChecker::NewsChecker(shared_qobject_ptr 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 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 +#include +#include + +#include + +#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 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 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 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 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 +#include + +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 +#include +#include +#include + +#include + +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 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 #include #include +#include #include #include #include @@ -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 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 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 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 m_newsChecker; unique_qobject_ptr m_notificationChecker; InstancePtr m_selectedInstance; -- cgit From 70f8cb81b8bbdf8bc2f4931981002ab56125361d Mon Sep 17 00:00:00 2001 From: dada513 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(-) (limited to 'launcher/ui') 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 8d2e7db178b764838014a457bec81e946e0f937d Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu 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(-) (limited to 'launcher/ui') 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 #include #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?
Help us with translations!") - .arg("https://github.com/MultiMC/Launcher/wiki/Translating-MultiMC"); + .arg(BuildConfig.TRANSLATIONS_URL); helpUsLabel->setText(text); } -- cgit From bb02226870a21c08ec534295ea0dcb8dd4c542cf Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu 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 (limited to 'launcher/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(tr("Settings")); @@ -730,7 +733,7 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv) m_globalSettingsProvider->addPage(); m_globalSettingsProvider->addPage(); m_globalSettingsProvider->addPage(); - m_globalSettingsProvider->addPage(); + m_globalSettingsProvider->addPage(); } 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 +#include +#include +#include +#include + +#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 + +#include "ui/pages/BasePage.h" +#include + +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 @@ + + + APIPage + + + + 0 + 0 + 491 + 474 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 0 + + + + Tab 1 + + + + + + Pastebin URL + + + + + + Qt::Horizontal + + + + + + + + 10 + + + + <html><head/><body><p>Note: only input that starts with <span style=" font-weight:600;">http://</span> or <span style=" font-weight:600;">https://</span> will be accepted.</p></body></html> + + + false + + + + + + + true + + + QComboBox::NoInsert + + + + https://0x0.st + + + + + https://paste.polymc.org + + + + + + + + <html><head/><body><p>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.</p></body></html> + + + Qt::RichText + + + true + + + true + + + + + + + + + + Microsoft Secured Account + + + + + + Qt::Horizontal + + + + + + + Note: you probably don't need to set this if logging in via Microsoft Secured Account already works. + + + Qt::RichText + + + true + + + + + + + (Default) + + + + + + + Enter a custom client ID for Microsoft Secured Account here. + + + Qt::RichText + + + true + + + true + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + tabWidget + + + + 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 -#include -#include -#include -#include - -#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 - -#include "ui/pages/BasePage.h" -#include - -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 @@ - - - PastePage - - - - 0 - 0 - 491 - 474 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 0 - - - - Tab 1 - - - - - - Pastebin URL - - - - - - Qt::Horizontal - - - - - - - - 10 - - - - <html><head/><body><p>Note: only input that starts with <span style=" font-weight:600;">http://</span> or <span style=" font-weight:600;">https://</span> will be accepted.</p></body></html> - - - false - - - - - - - true - - - QComboBox::NoInsert - - - - https://0x0.st - - - - - https://paste.polymc.org - - - - - - - - <html><head/><body><p>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.</p></body></html> - - - Qt::RichText - - - true - - - true - - - - - - - - - - Qt::Vertical - - - - 20 - 216 - - - - - - - - - - - - tabWidget - - - - -- cgit From 0854e83ce48cb30b28bd05986970e506c1106e4e Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu 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(-) (limited to 'launcher/ui') 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 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(-) (limited to 'launcher/ui') 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 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(-) (limited to 'launcher/ui') 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 @@ - Microsoft Secured Account + Microsoft Authentication @@ -116,7 +116,7 @@ - Note: you probably don't need to set this if logging in via Microsoft Secured Account already works. + Note: you probably don't need to set this if logging in via Microsoft Authentication already works. Qt::RichText @@ -136,7 +136,7 @@ - Enter a custom client ID for Microsoft Secured Account here. + Enter a custom client ID for Microsoft Authentication here. Qt::RichText 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