From b85d5f69308bcfefe6513a09c34aab4dcb1f59fd Mon Sep 17 00:00:00 2001 From: Wyvest Date: Fri, 2 Jan 2026 00:36:43 +0900 Subject: [PATCH] refresh accounts function --- apps/oneclient/desktop/src/lib.rs | 2 ++ apps/oneclient/frontend/src/bindings.gen.ts | 20 +++++++------ apps/onelauncher/desktop/src/lib.rs | 2 ++ packages/core/src/api/credentials.rs | 31 +++++++++++++++++++++ packages/core/src/api/tauri/commands.rs | 17 +++++++++++ packages/core/src/store/credentials.rs | 2 +- 6 files changed, 64 insertions(+), 10 deletions(-) diff --git a/apps/oneclient/desktop/src/lib.rs b/apps/oneclient/desktop/src/lib.rs index 8deebfc9..bc04f3da 100644 --- a/apps/oneclient/desktop/src/lib.rs +++ b/apps/oneclient/desktop/src/lib.rs @@ -96,6 +96,8 @@ async fn initialize_state(handle: &tauri::AppHandle) -> LauncherResult<()> { State::get().await?; + onelauncher_core::api::credentials::refresh_accounts().await?; + tracing::info!("initialized launcher successfully"); Ok(()) } diff --git a/apps/oneclient/frontend/src/bindings.gen.ts b/apps/oneclient/frontend/src/bindings.gen.ts index a7fa2e49..c12c93d8 100644 --- a/apps/oneclient/frontend/src/bindings.gen.ts +++ b/apps/oneclient/frontend/src/bindings.gen.ts @@ -303,12 +303,10 @@ export type VersionType = */ "old_beta" -const ARGS_MAP = { 'core':'{"searchPackages":["provider","query"],"getPackage":["provider","slug"],"getRunningProcessesByClusterId":["cluster_id"],"getWorlds":["id"],"getGameVersions":[],"getLogs":["id"],"getPackageVersions":["provider","slug","mc_version","loader","offset","limit"],"downloadExternalPackage":["package","cluster_id","force","skip_compatibility"],"installModpack":["modpack","cluster_id"],"getLinkedPackages":["cluster_id"],"createCluster":["options"],"setDefaultUser":["uuid"],"changeSkin":["access_token","skin_url","skin_variant"],"convertUsernameUUID":["username_uuid"],"readSettings":[],"getLogByName":["id","name"],"updateClusterProfile":["name","profile"],"getLoadersForVersion":["mc_version"],"getDefaultUser":["fallback"],"fetchMinecraftProfile":["uuid"],"getScreenshots":["id"],"uploadSkinBytes":["access_token","skin_data","image_format","skin_variant"],"getProfileOrDefault":["name"],"launchCluster":["id","uuid","search_for_java"],"isClusterRunning":["cluster_id"],"removePackage":["cluster_id","package_hash"],"getClusters":[],"getUsers":[],"setClusterStage":["id","stage"],"getClusterById":["id"],"createSettingsProfile":["name"],"getUser":["uuid"],"changeCape":["access_token","cape_uuid"],"fetchLoggedInProfile":["access_token"],"removeCape":["access_token"],"getUsersFromAuthor":["provider","author"],"removeCluster":["id"],"setDiscordRPCMessage":["message"],"getMultiplePackages":["provider","slugs"],"removeUser":["uuid"],"writeSettings":["setting"],"updateClusterById":["id","request"],"getPackageBody":["provider","body"],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"],"open":["input"],"getRunningProcesses":[],"openMsaLogin":[],"killProcess":["pid"],"getGlobalProfile":[]}', 'oneclient':'{"getBundlesFor":["cluster_id"],"installUpdate":[],"getVersions":[],"getClustersGroupedByMajor":[],"checkForUpdate":[]}', 'folders':'{"openCluster":["folder_name"],"fromCluster":["folder_name"]}', 'events':'{"message":["event"],"ingress":["event"],"process":["event"]}', 'debug':'{"openDevTools":[],"getGitCommitHash":[],"getPackageVersion":[],"getType":[],"getPlatform":[],"getLocale":[],"isInDev":[],"getArch":[],"getOsVersion":[],"getBuildTimestamp":[],"getFamily":[]}' } +const ARGS_MAP = { 'events':'{"process":["event"],"ingress":["event"],"message":["event"]}', 'core':'{"updateClusterProfile":["name","profile"],"getUsers":[],"fetchLoggedInProfile":["access_token"],"killProcess":["pid"],"getUsersFromAuthor":["provider","author"],"convertUsernameUUID":["username_uuid"],"changeSkin":["access_token","skin_url","skin_variant"],"getDefaultUser":["fallback"],"getScreenshots":["id"],"getGlobalProfile":[],"fetchMinecraftProfile":["uuid"],"getPackageVersions":["provider","slug","mc_version","loader","offset","limit"],"getClusterById":["id"],"getLogs":["id"],"refreshAccounts":[],"getClusters":[],"createCluster":["options"],"removeCluster":["id"],"isClusterRunning":["cluster_id"],"updateClusterById":["id","request"],"getGameVersions":[],"launchCluster":["id","uuid","search_for_java"],"openMsaLogin":[],"refreshAccount":["uuid"],"searchPackages":["provider","query"],"getLinkedPackages":["cluster_id"],"getLoadersForVersion":["mc_version"],"getRunningProcesses":[],"getLogByName":["id","name"],"readSettings":[],"installModpack":["modpack","cluster_id"],"getMultiplePackages":["provider","slugs"],"downloadPackage":["provider","package_id","version_id","cluster_id","skip_compatibility"],"removePackage":["cluster_id","package_hash"],"getWorlds":["id"],"setClusterStage":["id","stage"],"setDefaultUser":["uuid"],"writeSettings":["setting"],"getPackageBody":["provider","body"],"downloadExternalPackage":["package","cluster_id","force","skip_compatibility"],"removeUser":["uuid"],"changeCape":["access_token","cape_uuid"],"getPackage":["provider","slug"],"open":["input"],"uploadSkinBytes":["access_token","skin_data","image_format","skin_variant"],"createSettingsProfile":["name"],"setDiscordRPCMessage":["message"],"removeCape":["access_token"],"getUser":["uuid"],"getRunningProcessesByClusterId":["cluster_id"],"getProfileOrDefault":["name"]}', 'oneclient':'{"getBundlesFor":["cluster_id"],"checkForUpdate":[],"installUpdate":[],"getVersions":[],"getClustersGroupedByMajor":[]}', 'folders':'{"openCluster":["folder_name"],"fromCluster":["folder_name"]}', 'debug':'{"getOsVersion":[],"openDevTools":[],"isInDev":[],"getBuildTimestamp":[],"getPackageVersion":[],"getLocale":[],"getType":[],"getPlatform":[],"getGitCommitHash":[],"getFamily":[],"getArch":[]}' } export type Router = { 'events': { ingress: (event: IngressPayload) => Promise, message: (event: MessagePayload) => Promise, process: (event: ProcessPayload) => Promise }, -'folders': { fromCluster: (folderName: string) => Promise, -openCluster: (folderName: string) => Promise }, 'core': { getClusters: () => Promise, getClusterById: (id: number) => Promise, removeCluster: (id: number) => Promise, @@ -336,6 +334,8 @@ removeUser: (uuid: string) => Promise, getDefaultUser: (fallback: boolean | null) => Promise, setDefaultUser: (uuid: string | null) => Promise, openMsaLogin: () => Promise, +refreshAccounts: () => Promise, +refreshAccount: (uuid: string) => Promise, readSettings: () => Promise, writeSettings: (setting: Settings) => Promise, searchPackages: (provider: Provider, query: SearchQuery) => Promise>, @@ -358,6 +358,13 @@ removeCape: (accessToken: string) => Promise, convertUsernameUUID: (usernameUuid: string) => Promise, setDiscordRPCMessage: (message: string) => Promise, open: (input: string) => Promise }, +'folders': { fromCluster: (folderName: string) => Promise, +openCluster: (folderName: string) => Promise }, +'oneclient': { getClustersGroupedByMajor: () => Promise>, +getBundlesFor: (clusterId: number) => Promise, +getVersions: () => Promise, +checkForUpdate: () => Promise, +installUpdate: () => Promise }, 'debug': { openDevTools: () => Promise, isInDev: () => Promise, getArch: () => Promise, @@ -368,12 +375,7 @@ getPlatform: () => Promise, getOsVersion: () => Promise, getGitCommitHash: () => Promise, getBuildTimestamp: () => Promise, -getPackageVersion: () => Promise }, -'oneclient': { getClustersGroupedByMajor: () => Promise>, -getBundlesFor: (clusterId: number) => Promise, -getVersions: () => Promise, -checkForUpdate: () => Promise, -installUpdate: () => Promise } }; +getPackageVersion: () => Promise } }; export type { InferCommandOutput } diff --git a/apps/onelauncher/desktop/src/lib.rs b/apps/onelauncher/desktop/src/lib.rs index 6d5fc8af..06718675 100644 --- a/apps/onelauncher/desktop/src/lib.rs +++ b/apps/onelauncher/desktop/src/lib.rs @@ -99,6 +99,8 @@ async fn initialize_state(handle: &tauri::AppHandle) -> LauncherResult<()> { State::get().await?; + onelauncher_core::api::credentials::refresh_accounts().await?; + tracing::info!("initialized launcher successfully"); Ok(()) } diff --git a/packages/core/src/api/credentials.rs b/packages/core/src/api/credentials.rs index e3c4a26b..bdd7c760 100644 --- a/packages/core/src/api/credentials.rs +++ b/packages/core/src/api/credentials.rs @@ -95,3 +95,34 @@ pub fn get_fake_user() -> MinecraftCredentials { expires: chrono::Utc::now() + chrono::Duration::days(1), } } + +/// Refresh a specific user account by [`uuid::Uuid`]. +#[tracing::instrument] +pub async fn refresh_account(user_id: uuid::Uuid) -> LauncherResult> { + let state = State::get().await?; + let mut store = state.credentials.write().await; + + if let Some(user) = store.users.get(&user_id).cloned() { + store.refresh_token(&user).await + } else { + Ok(None) + } +} + +/// Refresh all user accounts. +#[tracing::instrument] +pub async fn refresh_accounts() -> LauncherResult> { + let state = State::get().await?; + let mut store = state.credentials.write().await; + + let users: Vec = store.users.values().cloned().collect(); + let mut refreshed_users = Vec::new(); + + for user in users { + if let Some(refreshed) = store.refresh_token(&user).await? { + refreshed_users.push(refreshed); + } + } + + Ok(refreshed_users) +} diff --git a/packages/core/src/api/tauri/commands.rs b/packages/core/src/api/tauri/commands.rs index 32f7bc55..4a4dff83 100644 --- a/packages/core/src/api/tauri/commands.rs +++ b/packages/core/src/api/tauri/commands.rs @@ -135,6 +135,12 @@ pub trait TauriLauncherApi { async fn open_msa_login( app_handle: AppHandle, ) -> LauncherResult>; + + #[taurpc(alias = "refreshAccounts")] + async fn refresh_accounts() -> LauncherResult>; + + #[taurpc(alias = "refreshAccount")] + async fn refresh_account(uuid: uuid::Uuid) -> LauncherResult>; // endregion: users // MARK: API: settings @@ -642,6 +648,17 @@ impl TauriLauncherApi for TauriLauncherApiImpl { Ok(None) } + async fn refresh_accounts(self) -> LauncherResult> { + api::credentials::refresh_accounts().await + } + + async fn refresh_account( + self, + uuid: uuid::Uuid, + ) -> LauncherResult> { + api::credentials::refresh_account(uuid).await + } + async fn get_users_from_author( self, provider: Provider, diff --git a/packages/core/src/store/credentials.rs b/packages/core/src/store/credentials.rs index 9cd0c08c..79cc2677 100644 --- a/packages/core/src/store/credentials.rs +++ b/packages/core/src/store/credentials.rs @@ -215,7 +215,7 @@ impl CredentialsStore { } /// Refresh the current stored [`MinecraftCredentials`]. - async fn refresh_token( + pub async fn refresh_token( &mut self, creds: &MinecraftCredentials, ) -> LauncherResult> {