diff options
Diffstat (limited to 'gui/MainWindow.cpp')
-rw-r--r-- | gui/MainWindow.cpp | 73 |
1 files changed, 72 insertions, 1 deletions
diff --git a/gui/MainWindow.cpp b/gui/MainWindow.cpp index 8c75776d..324b770d 100644 --- a/gui/MainWindow.cpp +++ b/gui/MainWindow.cpp @@ -521,7 +521,7 @@ void MainWindow::on_actionAddInstance_triggered() newInstance->setName(newInstDlg.instName()); newInstance->setIconKey(newInstDlg.iconKey()); MMC->instances()->add(InstancePtr(newInstance)); - return; + break; case InstanceFactory::InstExists: { @@ -544,6 +544,77 @@ void MainWindow::on_actionAddInstance_triggered() break; } } + + //Copy-pasta to make it so you can't play without a real account + std::shared_ptr<MojangAccountList> accounts = MMC->accounts(); + MojangAccountPtr account = accounts->activeAccount(); + if (accounts->count() <= 0) + { + // Tell the user they need to log in at least one account in order to play. + auto reply = CustomMessageBox::selectable(this, tr("No Accounts"), + tr("In order to use MultiMC, you must have at least one Mojang or Minecraft account logged in to MultiMC." + "Would you like to open the account manager to add an account now?"), + QMessageBox::Information, QMessageBox::Yes | QMessageBox::No)->exec(); + + if (reply == QMessageBox::Yes) + { + // Open the account manager. + on_actionManageAccounts_triggered(); + } + } + else if (account.get() == nullptr) + { + // If no default account is set, ask the user which one to use. + AccountSelectDialog selectDialog(tr("Which account would you like to use?"), + AccountSelectDialog::GlobalDefaultCheckbox, this); + + selectDialog.exec(); + + // Launch the instance with the selected account. + account = selectDialog.selectedAccount(); + + // If the user said to use the account as default, do that. + if (selectDialog.useAsGlobalDefault() && account.get() != nullptr) + accounts->setActiveAccount(account->username()); + } + + // if no account is selected, we bail + if (!account.get()) + return; + + // do the login. if the account has an access token, try to refresh it first. + if(account->accountStatus() != NotVerified) + { + // We'll need to validate the access token to make sure the account is still logged in. + ProgressDialog progDialog(this); + auto task = account->login(); + progDialog.exec(task.get()); + + auto status = account->accountStatus(); + if(status != NotVerified) + { + ProgressDialog loadDialog(this); + auto update = newInstance->doUpdate(false); + connect(update.get(), &Task::failed , [this](QString reason) { + QString error = QString("Initial instance load failed: %1").arg(reason); + CustomMessageBox::selectable(this, tr("Error"), error, QMessageBox::Warning)->show(); + }); + loadDialog.exec(update.get()); + } + // revert from online to verified. + account->downgrade(); + return; + } + if (loginWithPassword(account, tr("Your account is currently not logged in. Please enter your password to log in again."))) + { + ProgressDialog loadDialog(this); + auto update = newInstance->doUpdate(false); + connect(update.get(), &Task::failed , [this](QString reason) { + QString error = QString("Instance load failed: %1").arg(reason); + CustomMessageBox::selectable(this, tr("Error"), error, QMessageBox::Warning)->show(); + }); + loadDialog.exec(update.get()); + } } void MainWindow::on_actionCopyInstance_triggered() |