From eeda898c23b61dfe2e93c7f2a84f054aaa5e1bbf Mon Sep 17 00:00:00 2001 From: Stenzek Date: Mon, 6 Jul 2026 15:39:24 +1000 Subject: [PATCH] Achievements: Separate login and progress requests Makes the login request complete quicker if achievements are enabled. --- src/core/achievements.cpp | 46 ++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/src/core/achievements.cpp b/src/core/achievements.cpp index 87828e40c..a52c24f0e 100644 --- a/src/core/achievements.cpp +++ b/src/core/achievements.cpp @@ -102,6 +102,7 @@ struct LoginWithPasswordParameters const char* username; Error* error; rc_client_async_handle_t* request; + bool is_temporary_client; bool result; }; @@ -344,7 +345,6 @@ void Achievements::ReportRCError(int err, fmt::format_string fmt, T&&... a ReportError(str); } - std::string Achievements::GetImageURL(const char* image_name, u32 type) { std::string ret; @@ -1989,14 +1989,14 @@ bool Achievements::Login(const char* username, const char* password, Error* erro auto lock = GetLock(); // We need to use a temporary client if achievements aren't currently active. - const bool needs_temporary_client = (s_state.client == nullptr); - if (needs_temporary_client && !CreateClient(lock, true)) + const bool is_temporary_client = (s_state.client == nullptr); + if (is_temporary_client && !CreateClient(lock, true)) { Error::SetString(error, "Failed to create client."); return false; } - LoginWithPasswordParameters params = {username, error, nullptr, false}; + LoginWithPasswordParameters params = {username, error, nullptr, is_temporary_client, false}; params.request = rc_client_begin_login_with_password(s_state.client, username, password, ClientLoginWithPasswordCallback, ¶ms); if (!params.request) @@ -2009,18 +2009,19 @@ bool Achievements::Login(const char* username, const char* password, Error* erro WaitForServerCallsWithYield(lock); Assert(!params.request); - // Free temporary client if we created one. - if (needs_temporary_client) - { - // Did we get enabled and disabled in the meantime? - if (!s_state.client) - return false; + // Did we get enabled and disabled in the meantime? + if (!s_state.client) + return params.result; - // Did we get enabled? Leave the client if so - if (!g_settings.achievements_enabled) - DestroyClient(lock); - else - FinishInitialize(); + // Did we get enabled? Leave the client if so + if (!g_settings.achievements_enabled) + { + DestroyClient(lock); + } + else + { + FinishLogin(); + FinishInitialize(); } // Success? Assume the callback set the error message. @@ -2062,10 +2063,6 @@ void Achievements::ClientLoginWithPasswordCallback(int result, const char* error Core::SetBaseStringSettingValue("Cheevos", "LoginTimestamp", fmt::format("{}", std::time(nullptr)).c_str()); Host::CommitBaseSettingChanges(); s_state.has_saved_credentials = true; - - // Will be using temporary client if achievements are not enabled. - if (g_settings.achievements_enabled) - FinishLogin(); } void Achievements::ClientLoginWithTokenCallback(int result, const char* error_message, rc_client_t* client, @@ -2100,6 +2097,10 @@ void Achievements::ClientLoginWithTokenCallback(int result, const char* error_me // Should be active here. DebugAssert(client == s_state.client); FinishLogin(); + + // Triggered through FinishInitialize(), which didn't load the game yet, so we need to do it here. + if (!s_state.load_game_request && System::IsValid()) + BeginLoadGame(); } void Achievements::FinishLogin() @@ -2128,9 +2129,6 @@ void Achievements::FinishLogin() s_state.logged_in_user_icon_url, user->display_name, std::move(summary), RA_LOGO_ICON_NAME, FullscreenUI::AchievementNotificationNoteType::Image); } - - if (!s_state.load_game_request && System::IsValid()) - BeginLoadGame(); } const std::string& Achievements::GetLoggedInUserName() @@ -3093,8 +3091,12 @@ void Achievements::FetchAllProgressIfMissing() const bool has_progress_database = (stmt.ColumnInt(0) > 0); if (has_progress_database) + { + DEV_LOG("Progress database already exists, skipping fetch"); return; + } + INFO_LOG("Progress database is missing, updating..."); BeginFetchAllProgressRequest(nullptr); }