diff --git a/launcher/LaunchController.cpp b/launcher/LaunchController.cpp index f817fd278..86a5a61e1 100644 --- a/launcher/LaunchController.cpp +++ b/launcher/LaunchController.cpp @@ -41,6 +41,7 @@ #include "minecraft/auth/AccountList.h" #include "ui/InstanceWindow.h" +#include "net/NetUtils.h" #include "ui/dialogs/CustomMessageBox.h" #include "ui/dialogs/MSALoginDialog.h" #include "ui/dialogs/ProfileSelectDialog.h" @@ -185,8 +186,16 @@ LaunchDecision LaunchController::decideLaunchMode() case AccountState::Offline: { if (m_wantedLaunchMode == LaunchMode::Normal) { QMessageBox msg(m_parentWidget); - msg.setWindowTitle(tr("Auth servers offline")); - msg.setText(tr("The Minecraft authentication servers are currently unavailable.")); + + auto netErr = accountToCheck->accountData()->networkError; + if (Net::isServerError(netErr)) { + msg.setWindowTitle(tr("Auth servers offline")); + msg.setText(tr("The Minecraft authentication servers are currently unavailable.\n\n%1").arg(accountToCheck->lastError())); + } else { + msg.setWindowTitle(tr("No internet connection")); + msg.setText(tr("Unable to connect to the internet.\n\n%1").arg(accountToCheck->lastError())); + } + msg.setIcon(QMessageBox::Warning); auto* launchOfflineButton = msg.addButton(tr("Launch Offline"), QMessageBox::AcceptRole); diff --git a/launcher/minecraft/auth/AccountData.h b/launcher/minecraft/auth/AccountData.h index 5fbe3213b..96ef94f30 100644 --- a/launcher/minecraft/auth/AccountData.h +++ b/launcher/minecraft/auth/AccountData.h @@ -41,6 +41,7 @@ #include #include +#include #include enum class Validity { None, Assumed, Certain }; @@ -118,5 +119,6 @@ struct AccountData { // runtime only information (not saved with the account) QString internalId; QString errorString; + QNetworkReply::NetworkError networkError = QNetworkReply::NoError; AccountState accountState = AccountState::Unchecked; }; diff --git a/launcher/minecraft/auth/steps/LauncherLoginStep.cpp b/launcher/minecraft/auth/steps/LauncherLoginStep.cpp index 701261b52..4ceed8586 100644 --- a/launcher/minecraft/auth/steps/LauncherLoginStep.cpp +++ b/launcher/minecraft/auth/steps/LauncherLoginStep.cpp @@ -60,6 +60,7 @@ void LauncherLoginStep::onRequestDone(QByteArray* response) emit finished(AccountTaskState::STATE_FAILED_SOFT, tr("Failed to get Minecraft access token: %1").arg(m_request->errorString())); } else { + m_data->networkError = m_request->error(); emit finished(AccountTaskState::STATE_OFFLINE, tr("Failed to get Minecraft access token: %1").arg(m_request->errorString())); } return; diff --git a/launcher/minecraft/auth/steps/MinecraftProfileStep.cpp b/launcher/minecraft/auth/steps/MinecraftProfileStep.cpp index 7e089cf86..b95682b2b 100644 --- a/launcher/minecraft/auth/steps/MinecraftProfileStep.cpp +++ b/launcher/minecraft/auth/steps/MinecraftProfileStep.cpp @@ -56,6 +56,7 @@ void MinecraftProfileStep::onRequestDone(QByteArray* response) emit finished(AccountTaskState::STATE_FAILED_SOFT, tr("Minecraft Java profile acquisition failed: %1").arg(m_request->errorString())); } else { + m_data->networkError = m_request->error(); emit finished(AccountTaskState::STATE_OFFLINE, tr("Minecraft Java profile acquisition failed: %1").arg(m_request->errorString())); } diff --git a/launcher/minecraft/auth/steps/XboxAuthorizationStep.cpp b/launcher/minecraft/auth/steps/XboxAuthorizationStep.cpp index 4890f4da1..422aa1a54 100644 --- a/launcher/minecraft/auth/steps/XboxAuthorizationStep.cpp +++ b/launcher/minecraft/auth/steps/XboxAuthorizationStep.cpp @@ -67,6 +67,7 @@ void XboxAuthorizationStep::onRequestDone(QByteArray* response) emit finished(AccountTaskState::STATE_FAILED_SOFT, tr("Unknown STS error for %1 services: %2").arg(m_authorizationKind, m_request->errorString())); } else { + m_data->networkError = m_request->error(); emit finished(AccountTaskState::STATE_OFFLINE, tr("Failed to get authorization for %1 services: %2").arg(m_authorizationKind, m_request->errorString())); } diff --git a/launcher/minecraft/auth/steps/XboxUserStep.cpp b/launcher/minecraft/auth/steps/XboxUserStep.cpp index e2971dcd9..382750218 100644 --- a/launcher/minecraft/auth/steps/XboxUserStep.cpp +++ b/launcher/minecraft/auth/steps/XboxUserStep.cpp @@ -59,6 +59,7 @@ void XboxUserStep::onRequestDone(QByteArray* response) if (Net::isApplicationError(m_request->error()) && !Net::isServerError(m_request->error())) { emit finished(AccountTaskState::STATE_FAILED_SOFT, tr("Xbox user authentication failed: %1").arg(m_request->errorString())); } else { + m_data->networkError = m_request->error(); emit finished(AccountTaskState::STATE_OFFLINE, tr("Xbox user authentication failed: %1").arg(m_request->errorString())); } return;