diff options
| -rw-r--r-- | src/nxmaccessmanager.cpp | 4 | ||||
| -rw-r--r-- | src/settingsdialog.cpp | 161 | ||||
| -rw-r--r-- | src/settingsdialog.h | 12 |
3 files changed, 129 insertions, 48 deletions
diff --git a/src/nxmaccessmanager.cpp b/src/nxmaccessmanager.cpp index c0a6c227..40ab19b9 100644 --- a/src/nxmaccessmanager.cpp +++ b/src/nxmaccessmanager.cpp @@ -313,7 +313,7 @@ void NexusKeyValidator::start(const QString& key) return; } - qDebug("Checking Nexus API Key..."); + m_active = true; setState(Connecting); const QString requestUrl(NexusBaseUrl + "/users/validate"); @@ -328,11 +328,11 @@ void NexusKeyValidator::start(const QString& key) m_reply = m_manager.get(request); if (!m_reply) { + close(); setState(Error, QObject::tr("Failed to request %1").arg(requestUrl)); return; } - m_active = true; m_timeout.start(NXMAccessManager::ValidationTimeout); QObject::connect( diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp index 0131d20b..12dbc482 100644 --- a/src/settingsdialog.cpp +++ b/src/settingsdialog.cpp @@ -104,20 +104,6 @@ SettingsDialog::SettingsDialog(PluginContainer *pluginContainer, Settings* setti , m_keyChanged(false) , m_GeometriesReset(false) { - m_nexusLogin.keyChanged = [&](auto&& s){ onKeyChanged(s); }; - m_nexusLogin.stateChanged = [&](auto&& s, auto&& e){ onStateChanged(s, e); }; - - connect( - NexusInterface::instance(m_PluginContainer)->getAccessManager(), - &NXMAccessManager::validateSuccessful, - [&]{ onManualKeyValidation(true, ""); }); - - connect( - NexusInterface::instance(m_PluginContainer)->getAccessManager(), - &NXMAccessManager::validateFailed, - [&](auto&& e){ onManualKeyValidation(false, e); }); - - ui->setupUi(this); ui->pluginSettingsList->setStyleSheet("QTreeWidget::item {padding-right: 10px;}"); @@ -394,44 +380,66 @@ void SettingsDialog::on_resetDialogsButton_clicked() void SettingsDialog::on_nexusConnect_clicked() { - if (m_nexusLogin.isActive()) { - m_nexusLogin.cancel(); - } else { - fetchNexusApiKey(); + if (m_nexusLogin && m_nexusLogin->isActive()) { + m_nexusLogin->cancel(); + return; } + + if (!m_nexusLogin) { + m_nexusLogin.reset(new NexusSSOLogin); + + m_nexusLogin->keyChanged = [&](auto&& s){ + onSSOKeyChanged(s); + }; + + m_nexusLogin->stateChanged = [&](auto&& s, auto&& e){ + onSSOStateChanged(s, e); + }; + } + + ui->nexusLog->clear(); + m_nexusLogin->start(); + updateNexusButtons(); } void SettingsDialog::on_nexusManualKey_clicked() { - NexusManualKeyDialog dialog(this); + if (m_nexusValidator && m_nexusValidator->isActive()) { + m_nexusValidator->cancel(); + return; + } + NexusManualKeyDialog dialog(this); if (dialog.exec() != QDialog::Accepted) { return; } const auto key = dialog.key(); - if (key.isEmpty()) { clearKey(); - } else { - if (setKey(key)) { - ui->nexusLog->clear(); - ui->nexusLog->addItem(tr("Checking API key...")); - - NexusInterface::instance(m_PluginContainer)->getAccessManager()->apiCheck( - key, NXMAccessManager::Force | NXMAccessManager::HideProgress); - } + return; } -} -void SettingsDialog::fetchNexusApiKey() -{ ui->nexusLog->clear(); - m_nexusLogin.start(); - updateNexusButtons(); + ui->nexusLog->addItem(tr("Checking API key...")); + + if (!m_nexusValidator) { + m_nexusValidator.reset(new NexusKeyValidator( + *NexusInterface::instance(m_PluginContainer)->getAccessManager())); + + m_nexusValidator->stateChanged = [&](auto&& s, auto&& e){ + onValidatorStateChanged(s, e); + }; + + m_nexusValidator->finished = [&](auto&& user) { + onValidatorFinished(user); + }; + } + + m_nexusValidator->start(key); } -void SettingsDialog::onKeyChanged(const QString& key) +void SettingsDialog::onSSOKeyChanged(const QString& key) { if (key.isEmpty()) { clearKey(); @@ -440,7 +448,7 @@ void SettingsDialog::onKeyChanged(const QString& key) } } -void SettingsDialog::onStateChanged(NexusSSOLogin::States s, const QString& e) +void SettingsDialog::onSSOStateChanged(NexusSSOLogin::States s, const QString& e) { QString log; @@ -507,12 +515,72 @@ void SettingsDialog::onStateChanged(NexusSSOLogin::States s, const QString& e) updateNexusButtons(); } -void SettingsDialog::onManualKeyValidation(bool success, const QString& e) +void SettingsDialog::onValidatorStateChanged( + NexusKeyValidator::States s, const QString& e) { - if (success) { - ui->nexusLog->addItem("Connected."); - } else { - ui->nexusLog->addItem("Error: " + e); + QString log; + + switch (s) + { + case NexusKeyValidator::Connecting: + { + log = tr("Connecting to Nexus..."); + break; + } + + case NexusKeyValidator::Finished: + { + log = tr("Connected."); + break; + } + + case NexusKeyValidator::InvalidJson: + { + log = tr("Invalid JSON"); + break; + } + + case NexusKeyValidator::BadResponse: + { + log = tr("Bad response"); + break; + } + + case NexusKeyValidator::Timeout: + { + log = QObject::tr( + "No answer from Nexus.\n" + "A firewall might be blocking Mod Organizer."); + + break; + } + + case NexusKeyValidator::Cancelled: + { + log = QObject::tr("Cancelled."); + break; + } + + case NexusKeyValidator::Error: + { + log = tr("Error: %1.").arg(e); + break; + } + } + + if (!log.isEmpty()) { + for (auto&& line : log.split("\n")) { + ui->nexusLog->addItem(line); + } + } + + updateNexusButtons(); +} + +void SettingsDialog::onValidatorFinished(const APIUserAccount& user) +{ + if (!user.apiKey().isEmpty()) { + setKey(user.apiKey()); } } @@ -537,24 +605,35 @@ bool SettingsDialog::clearKey() void SettingsDialog::updateNexusButtons() { - if (m_nexusLogin.isActive()) { + if (m_nexusLogin && m_nexusLogin->isActive()) { // api key is in the process of being retrieved ui->nexusConnect->setText(tr("Cancel")); ui->nexusConnect->setEnabled(true); ui->nexusDisconnect->setEnabled(false); + ui->nexusManualKey->setText(tr("Enter API Key Manually")); ui->nexusManualKey->setEnabled(false); } + else if (m_nexusValidator && m_nexusValidator->isActive()) { + // api key is in the process of being tested + ui->nexusConnect->setText(tr("Connect to Nexus")); + ui->nexusConnect->setEnabled(false); + ui->nexusDisconnect->setEnabled(false); + ui->nexusManualKey->setText(tr("Cancel")); + ui->nexusManualKey->setEnabled(true); + } else if (m_settings->hasNexusApiKey()) { // api key is present ui->nexusConnect->setText(tr("Connect to Nexus")); ui->nexusConnect->setEnabled(false); ui->nexusDisconnect->setEnabled(true); + ui->nexusManualKey->setText(tr("Enter API Key Manually")); ui->nexusManualKey->setEnabled(false); } else { // api key not present ui->nexusConnect->setText(tr("Connect to Nexus")); ui->nexusConnect->setEnabled(true); ui->nexusDisconnect->setEnabled(false); + ui->nexusManualKey->setText(tr("Enter API Key Manually")); ui->nexusManualKey->setEnabled(true); } } diff --git a/src/settingsdialog.h b/src/settingsdialog.h index 507214dd..1741fc13 100644 --- a/src/settingsdialog.h +++ b/src/settingsdialog.h @@ -142,16 +142,18 @@ private: bool m_keyChanged; QString m_ExecutableBlacklist; - NexusSSOLogin m_nexusLogin; + std::unique_ptr<NexusSSOLogin> m_nexusLogin; + std::unique_ptr<NexusKeyValidator> m_nexusValidator; bool setKey(const QString& key); bool clearKey(); void updateNexusButtons(); - void fetchNexusApiKey(); - void onKeyChanged(const QString& key); - void onStateChanged(NexusSSOLogin::States s, const QString& e); - void onManualKeyValidation(bool success, const QString& e); + void onSSOKeyChanged(const QString& key); + void onSSOStateChanged(NexusSSOLogin::States s, const QString& e); + + void onValidatorStateChanged(NexusKeyValidator::States s, const QString& e); + void onValidatorFinished(const APIUserAccount& user); }; #endif // SETTINGSDIALOG_H |
