aboutsummaryrefslogtreecommitdiff
path: root/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp')
-rw-r--r--launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp144
1 files changed, 131 insertions, 13 deletions
diff --git a/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp b/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp
index ac3869dc..39ecf179 100644
--- a/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp
+++ b/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp
@@ -1,30 +1,56 @@
+// SPDX-License-Identifier: GPL-3.0-only
/*
- * Copyright 2021 Jamie Mansfield <jmansfield@cadixdev.org>
+ * PolyMC - Minecraft Launcher
+ * Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
*
- * 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
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3.
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
*
- * 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.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * This file incorporates work covered by the following copyright and
+ * permission notice:
+ *
+ * Copyright 2021 Jamie Mansfield <jmansfield@cadixdev.org>
+ *
+ * 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 "AtlOptionalModDialog.h"
#include "ui_AtlOptionalModDialog.h"
+#include <QInputDialog>
+#include <QMessageBox>
+#include "BuildConfig.h"
+#include "Json.h"
+#include "modplatform/atlauncher/ATLShareCode.h"
+#include "Application.h"
+
AtlOptionalModListModel::AtlOptionalModListModel(QWidget *parent, QVector<ATLauncher::VersionMod> mods)
: QAbstractListModel(parent), m_mods(mods) {
-
// fill mod index
for (int i = 0; i < m_mods.size(); i++) {
auto mod = m_mods.at(i);
m_index[mod.name] = i;
}
+
// set initial state
for (int i = 0; i < m_mods.size(); i++) {
auto mod = m_mods.at(i);
@@ -77,7 +103,7 @@ QVariant AtlOptionalModListModel::data(const QModelIndex &index, int role) const
}
}
- return QVariant();
+ return {};
}
bool AtlOptionalModListModel::setData(const QModelIndex &index, const QVariant &value, int role) {
@@ -104,7 +130,7 @@ QVariant AtlOptionalModListModel::headerData(int section, Qt::Orientation orient
}
}
- return QVariant();
+ return {};
}
Qt::ItemFlags AtlOptionalModListModel::flags(const QModelIndex &index) const {
@@ -115,6 +141,69 @@ Qt::ItemFlags AtlOptionalModListModel::flags(const QModelIndex &index) const {
return flags;
}
+void AtlOptionalModListModel::useShareCode(const QString& code) {
+ m_jobPtr.reset(new NetJob("Atl::Request", APPLICATION->network()));
+ auto url = QString(BuildConfig.ATL_API_BASE_URL + "share-codes/" + code);
+ m_jobPtr->addNetAction(Net::Download::makeByteArray(QUrl(url), &m_response));
+
+ connect(m_jobPtr.get(), &NetJob::succeeded,
+ this, &AtlOptionalModListModel::shareCodeSuccess);
+ connect(m_jobPtr.get(), &NetJob::failed,
+ this, &AtlOptionalModListModel::shareCodeFailure);
+
+ m_jobPtr->start();
+}
+
+void AtlOptionalModListModel::shareCodeSuccess() {
+ m_jobPtr.reset();
+
+ QJsonParseError parse_error {};
+ auto doc = QJsonDocument::fromJson(m_response, &parse_error);
+ if (parse_error.error != QJsonParseError::NoError) {
+ qWarning() << "Error while parsing JSON response from ATL at " << parse_error.offset << " reason: " << parse_error.errorString();
+ qWarning() << m_response;
+ return;
+ }
+ auto obj = doc.object();
+
+ ATLauncher::ShareCodeResponse response;
+ try {
+ ATLauncher::loadShareCodeResponse(response, obj);
+ }
+ catch (const JSONValidationError& e) {
+ qDebug() << QString::fromUtf8(m_response);
+ qWarning() << "Error while reading response from ATLauncher: " << e.cause();
+ return;
+ }
+
+ if (response.error) {
+ // fixme: plumb in an error message
+ qWarning() << "ATLauncher API Response Error" << response.message;
+ return;
+ }
+
+ // FIXME: verify pack and version, error if not matching.
+
+ // Clear the current selection
+ for (const auto& mod : m_mods) {
+ m_selection[mod.name] = false;
+ }
+
+ // Make the selections, as per the share code.
+ for (const auto& mod : response.data.mods) {
+ m_selection[mod.name] = mod.selected;
+ }
+
+ emit dataChanged(AtlOptionalModListModel::index(0, EnabledColumn),
+ AtlOptionalModListModel::index(m_mods.size() - 1, EnabledColumn));
+}
+
+void AtlOptionalModListModel::shareCodeFailure(const QString& reason) {
+ m_jobPtr.reset();
+
+ // fixme: plumb in an error message
+}
+
void AtlOptionalModListModel::selectRecommended() {
for (const auto& mod : m_mods) {
m_selection[mod.name] = mod.recommended;
@@ -212,6 +301,8 @@ AtlOptionalModDialog::AtlOptionalModDialog(QWidget *parent, QVector<ATLauncher::
ui->treeView->header()->setSectionResizeMode(
AtlOptionalModListModel::DescriptionColumn, QHeaderView::Stretch);
+ connect(ui->shareCodeButton, &QPushButton::pressed,
+ this, &AtlOptionalModDialog::useShareCode);
connect(ui->selectRecommendedButton, &QPushButton::pressed,
listModel, &AtlOptionalModListModel::selectRecommended);
connect(ui->clearAllButton, &QPushButton::pressed,
@@ -223,3 +314,30 @@ AtlOptionalModDialog::AtlOptionalModDialog(QWidget *parent, QVector<ATLauncher::
AtlOptionalModDialog::~AtlOptionalModDialog() {
delete ui;
}
+
+void AtlOptionalModDialog::useShareCode() {
+ bool ok;
+ auto shareCode = QInputDialog::getText(
+ this,
+ tr("Select a share code"),
+ tr("Share code:"),
+ QLineEdit::Normal,
+ "",
+ &ok
+ );
+
+ if (!ok) {
+ // If the user cancels the dialog, we don't need to show any error dialogs.
+ return;
+ }
+
+ if (shareCode.isEmpty()) {
+ QMessageBox box;
+ box.setIcon(QMessageBox::Warning);
+ box.setText(tr("No share code specified!"));
+ box.exec();
+ return;
+ }
+
+ listModel->useShareCode(shareCode);
+}