From 0ab4c58343291f4c02937c6b90ebc1406bcc0049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 22 Jul 2023 01:30:20 +0200 Subject: [PATCH] Improve handling of server/token errors --- Core/RetroAchievements.cpp | 24 ++++++++++++++++++++++-- Core/RetroAchievements.h | 4 ++++ UI/RetroAchievementScreens.cpp | 15 ++++++++++++++- assets/lang/en_US.ini | 1 + 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/Core/RetroAchievements.cpp b/Core/RetroAchievements.cpp index 9bac7b9c5e..e3df57556b 100644 --- a/Core/RetroAchievements.cpp +++ b/Core/RetroAchievements.cpp @@ -77,6 +77,7 @@ std::string s_game_hash; std::set g_activeChallenges; bool g_isIdentifying = false; bool g_isLoggingIn = false; +int g_loginResult; // rc_client implementation static rc_client_t *g_rcClient; @@ -320,15 +321,20 @@ static void login_token_callback(int result, const char *error_message, rc_clien g_OSD.Show(OSDType::MESSAGE_WARNING, di->T("Failed to connect to server, check your internet connection.")); break; } - case RC_INVALID_STATE: case RC_API_FAILURE: + case RC_INVALID_STATE: case RC_MISSING_VALUE: case RC_INVALID_JSON: default: + { + auto ac = GetI18NCategory(I18NCat::ACHIEVEMENTS); ERROR_LOG(ACHIEVEMENTS, "Failure logging in via token: %d, %s", result, error_message); + g_OSD.Show(OSDType::MESSAGE_WARNING, ac->T("Failed logging in to RetroAchievements")); OnAchievementsLoginStateChange(); break; } + } + g_loginResult = result; g_isLoggingIn = false; } @@ -356,6 +362,19 @@ void Initialize() { rc_client_set_event_handler(g_rcClient, event_handler_callback); + TryLoginByToken(); +} + +bool HasToken() { + return !NativeLoadSecret(RA_TOKEN_SECRET_NAME).empty(); +} + +bool LoginProblems(std::string *errorString) { + // TODO: Set error string. + return g_loginResult != RC_OK; +} + +void TryLoginByToken() { std::string api_token = NativeLoadSecret(RA_TOKEN_SECRET_NAME); if (!api_token.empty()) { g_isLoggingIn = true; @@ -398,6 +417,7 @@ static void login_password_callback(int result, const char *error_message, rc_cl } g_OSD.RemoveProgressBar("cheevos_async_login", true, 0.1f); + g_loginResult = RC_OK; // For these, we don't want the "permanence" of the login-by-token failure, this prevents LoginProblems from returning true. g_isLoggingIn = false; } @@ -420,7 +440,7 @@ void Logout() { NativeSaveSecret(RA_TOKEN_SECRET_NAME, ""); g_Config.Save("Achievements logout"); g_activeChallenges.clear(); - + g_loginResult = RC_OK; // Allow trying again OnAchievementsLoginStateChange(); } diff --git a/Core/RetroAchievements.h b/Core/RetroAchievements.h index 5e524cc79a..81648c7b8d 100644 --- a/Core/RetroAchievements.h +++ b/Core/RetroAchievements.h @@ -82,6 +82,10 @@ rc_client_t *GetClient(); void Initialize(); void UpdateSettings(); +bool LoginProblems(std::string *errorString); +bool HasToken(); +void TryLoginByToken(); + /// Called when the system is being shut down. If Shutdown() returns false, the shutdown should be aborted if possible. bool Shutdown(); diff --git a/UI/RetroAchievementScreens.cpp b/UI/RetroAchievementScreens.cpp index 143a49c238..a181bbe7aa 100644 --- a/UI/RetroAchievementScreens.cpp +++ b/UI/RetroAchievementScreens.cpp @@ -290,7 +290,20 @@ void RetroAchievementsSettingsScreen::CreateAccountTab(UI::ViewGroup *viewGroup) return UI::EVENT_DONE; }); } else { - if (System_GetPropertyBool(SYSPROP_HAS_LOGIN_DIALOG)) { + std::string errorMessage; + if (Achievements::LoginProblems(&errorMessage)) { + viewGroup->Add(new NoticeView(NoticeLevel::WARN, ac->T("Failed logging in to RetroAchievements"), errorMessage)); + if (Achievements::HasToken()) { + viewGroup->Add(new Choice(di->T("Retry")))->OnClick.Add([=](UI::EventParams &) -> UI::EventReturn { + Achievements::TryLoginByToken(); + return UI::EVENT_DONE; + }); + } + viewGroup->Add(new Choice(di->T("Log out")))->OnClick.Add([=](UI::EventParams &) -> UI::EventReturn { + Achievements::Logout(); + return UI::EVENT_DONE; + }); + } else if (System_GetPropertyBool(SYSPROP_HAS_LOGIN_DIALOG)) { viewGroup->Add(new Choice(ac->T("Log in")))->OnClick.Add([=](UI::EventParams &) -> UI::EventReturn { System_AskUsernamePassword(ac->T("Log in"), [](const std::string &value, int) { std::vector parts; diff --git a/assets/lang/en_US.ini b/assets/lang/en_US.ini index d0cecb4147..ef8b09e2eb 100644 --- a/assets/lang/en_US.ini +++ b/assets/lang/en_US.ini @@ -30,6 +30,7 @@ Account = Account Achievement Unlocked = Achievement Unlocked Achievements = Achievements Achievements are disabled = Achievements are disabled +Can't log in to RetroAchievements right now = Can't log in to RetroAchievements right now Challenge Mode = Challenge Mode Challenge Mode (no savestates) = Challenge Mode (no savestates) Contacting RetroAchievements server... = Contacting RetroAchievements server...