diff --git a/Changelog.md b/Changelog.md index c5786a35f..95b8c8dce 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,12 @@ +## v2.5.7 + +
+ ✨ 新增功能 + +- 新增「永不」选项,可关闭自动检查更新并清除已下载的更新包 + +
+ ## v2.5.6
diff --git a/crates/clash-verge-i18n/locales/ar.yml b/crates/clash-verge-i18n/locales/ar.yml index 0441ea1be..2da79e7f2 100644 --- a/crates/clash-verge-i18n/locales/ar.yml +++ b/crates/clash-verge-i18n/locales/ar.yml @@ -34,6 +34,7 @@ notifications: body: A new version (v{version}) has been downloaded and is ready to install. installNow: Install Now later: Later + never: Never service: adminInstallPrompt: يتطلب تثبيت خدمة Clash Verge صلاحيات المسؤول. adminUninstallPrompt: يتطلب إلغاء تثبيت خدمة Clash Verge صلاحيات المسؤول. diff --git a/crates/clash-verge-i18n/locales/de.yml b/crates/clash-verge-i18n/locales/de.yml index 9396f4a49..db4bb3e89 100644 --- a/crates/clash-verge-i18n/locales/de.yml +++ b/crates/clash-verge-i18n/locales/de.yml @@ -34,6 +34,7 @@ notifications: body: A new version (v{version}) has been downloaded and is ready to install. installNow: Install Now later: Later + never: Never service: adminInstallPrompt: Für die Installation des Clash-Verge-Dienstes sind Administratorrechte erforderlich. adminUninstallPrompt: Für die Deinstallation des Clash-Verge-Dienstes sind Administratorrechte erforderlich. diff --git a/crates/clash-verge-i18n/locales/en.yml b/crates/clash-verge-i18n/locales/en.yml index 4a32fdc65..af507c498 100644 --- a/crates/clash-verge-i18n/locales/en.yml +++ b/crates/clash-verge-i18n/locales/en.yml @@ -34,6 +34,7 @@ notifications: body: A new version (v{version}) has been downloaded and is ready to install. installNow: Install Now later: Later + never: Never service: adminInstallPrompt: Installing the Clash Verge service requires administrator privileges. adminUninstallPrompt: Uninstalling the Clash Verge service requires administrator privileges. diff --git a/crates/clash-verge-i18n/locales/es.yml b/crates/clash-verge-i18n/locales/es.yml index 87f115333..c1ef2c5e1 100644 --- a/crates/clash-verge-i18n/locales/es.yml +++ b/crates/clash-verge-i18n/locales/es.yml @@ -34,6 +34,7 @@ notifications: body: A new version (v{version}) has been downloaded and is ready to install. installNow: Install Now later: Later + never: Never service: adminInstallPrompt: Instalar el servicio de Clash Verge requiere privilegios de administrador. adminUninstallPrompt: Desinstalar el servicio de Clash Verge requiere privilegios de administrador. diff --git a/crates/clash-verge-i18n/locales/fa.yml b/crates/clash-verge-i18n/locales/fa.yml index 8c538a4a7..cd718ac73 100644 --- a/crates/clash-verge-i18n/locales/fa.yml +++ b/crates/clash-verge-i18n/locales/fa.yml @@ -34,6 +34,7 @@ notifications: body: A new version (v{version}) has been downloaded and is ready to install. installNow: Install Now later: Later + never: Never service: adminInstallPrompt: نصب سرویس Clash Verge به دسترسی مدیر نیاز دارد. adminUninstallPrompt: حذف سرویس Clash Verge به دسترسی مدیر نیاز دارد. diff --git a/crates/clash-verge-i18n/locales/id.yml b/crates/clash-verge-i18n/locales/id.yml index 00c4788be..e51a64e8c 100644 --- a/crates/clash-verge-i18n/locales/id.yml +++ b/crates/clash-verge-i18n/locales/id.yml @@ -34,6 +34,7 @@ notifications: body: A new version (v{version}) has been downloaded and is ready to install. installNow: Install Now later: Later + never: Never service: adminInstallPrompt: Menginstal layanan Clash Verge memerlukan hak administrator. adminUninstallPrompt: Menghapus instalasi layanan Clash Verge memerlukan hak administrator. diff --git a/crates/clash-verge-i18n/locales/jp.yml b/crates/clash-verge-i18n/locales/jp.yml index eea0c41d1..1b8719d73 100644 --- a/crates/clash-verge-i18n/locales/jp.yml +++ b/crates/clash-verge-i18n/locales/jp.yml @@ -34,6 +34,7 @@ notifications: body: A new version (v{version}) has been downloaded and is ready to install. installNow: Install Now later: Later + never: Never service: adminInstallPrompt: Clash Verge サービスのインストールには管理者権限が必要です。 adminUninstallPrompt: Clash Verge サービスのアンインストールには管理者権限が必要です。 diff --git a/crates/clash-verge-i18n/locales/ko.yml b/crates/clash-verge-i18n/locales/ko.yml index 7166e8c72..e870c382e 100644 --- a/crates/clash-verge-i18n/locales/ko.yml +++ b/crates/clash-verge-i18n/locales/ko.yml @@ -34,6 +34,7 @@ notifications: body: A new version (v{version}) has been downloaded and is ready to install. installNow: Install Now later: Later + never: Never service: adminInstallPrompt: Clash Verge 서비스 설치에는 관리자 권한이 필요합니다. adminUninstallPrompt: Clash Verge 서비스 제거에는 관리자 권한이 필요합니다. diff --git a/crates/clash-verge-i18n/locales/ru.yml b/crates/clash-verge-i18n/locales/ru.yml index 2c931fa1d..0f4e5f2d2 100644 --- a/crates/clash-verge-i18n/locales/ru.yml +++ b/crates/clash-verge-i18n/locales/ru.yml @@ -34,6 +34,7 @@ notifications: body: Новая версия (v{version}) скачана и готова к установке. installNow: Установить сейчас later: Позже + never: Никогда service: adminInstallPrompt: Для установки службы Clash Verge требуются права администратора. adminUninstallPrompt: Для удаления службы Clash Verge требуются права администратора. diff --git a/crates/clash-verge-i18n/locales/tr.yml b/crates/clash-verge-i18n/locales/tr.yml index cf3c666a4..eed1b6897 100644 --- a/crates/clash-verge-i18n/locales/tr.yml +++ b/crates/clash-verge-i18n/locales/tr.yml @@ -34,6 +34,7 @@ notifications: body: Yeni bir sürüm (v{version}) indirildi ve kurulmaya hazır. installNow: Şimdi Kur later: Daha Sonra + never: Asla service: adminInstallPrompt: Clash Verge hizmetini kurmak için yönetici ayrıcalıkları gerekir. adminUninstallPrompt: Clash Verge hizmetini kaldırmak için yönetici ayrıcalıkları gerekir. diff --git a/crates/clash-verge-i18n/locales/tt.yml b/crates/clash-verge-i18n/locales/tt.yml index 4067dfdd7..0f5ffa0a9 100644 --- a/crates/clash-verge-i18n/locales/tt.yml +++ b/crates/clash-verge-i18n/locales/tt.yml @@ -34,6 +34,7 @@ notifications: body: A new version (v{version}) has been downloaded and is ready to install. installNow: Install Now later: Later + never: Never service: adminInstallPrompt: Clash Verge хезмәтен урнаштыру өчен администратор хокуклары кирәк. adminUninstallPrompt: Clash Verge хезмәтен бетерү өчен администратор хокуклары кирәк. diff --git a/crates/clash-verge-i18n/locales/zh.yml b/crates/clash-verge-i18n/locales/zh.yml index 8774cbefb..c321ce110 100644 --- a/crates/clash-verge-i18n/locales/zh.yml +++ b/crates/clash-verge-i18n/locales/zh.yml @@ -34,6 +34,7 @@ notifications: body: 新版本 (v{version}) 已下载完成,是否立即安装? installNow: 立即安装 later: 稍后 + never: 永不 service: adminInstallPrompt: 安装 Clash Verge 服务需要管理员权限 adminUninstallPrompt: 卸载 Clash Verge 服务需要管理员权限 diff --git a/crates/clash-verge-i18n/locales/zhtw.yml b/crates/clash-verge-i18n/locales/zhtw.yml index da73ba929..01c23b2cd 100644 --- a/crates/clash-verge-i18n/locales/zhtw.yml +++ b/crates/clash-verge-i18n/locales/zhtw.yml @@ -34,6 +34,7 @@ notifications: body: 新版本(v{version})已下載完成,是否立即安裝? installNow: 立即安裝 later: 稍後 + never: 永不 service: adminInstallPrompt: 安裝 Clash Verge 服務需要管理員權限 adminUninstallPrompt: 解除安裝 Clash Verge 服務需要管理員權限 diff --git a/src-tauri/src/core/updater.rs b/src-tauri/src/core/updater.rs index 2cb56f9ea..b3ba85632 100644 --- a/src-tauri/src/core/updater.rs +++ b/src-tauri/src/core/updater.rs @@ -1,4 +1,8 @@ -use crate::{config::Config, singleton, utils::dirs}; +use crate::{ + config::{Config, IVerge}, + singleton, + utils::dirs, +}; use anyhow::{Context as _, Result}; use chrono::Utc; use clash_verge_logging::{Type, logging}; @@ -179,10 +183,24 @@ impl SilentUpdater { current_version ); - // Preserve the cache when skipped so the next launch asks again. - if !Self::ask_user_to_install(app_handle, cached_version).await { - logging!(info, Type::System, "User skipped update install, starting normally"); - return false; + match Self::ask_user_to_install(app_handle, cached_version).await { + StartupUpdateChoice::Install => {} + StartupUpdateChoice::Later => { + logging!(info, Type::System, "User skipped update install, starting normally"); + return false; + } + StartupUpdateChoice::Never => { + let patch = IVerge { + auto_check_update: Some(false), + ..Default::default() + }; + if let Err(e) = crate::feat::patch_verge(&patch, false).await { + logging!(warn, Type::System, "Failed to disable automatic update checks: {e:#}"); + } + Self::delete_cache(); + logging!(info, Type::System, "User disabled automatic update checks"); + return false; + } } let bytes = match Self::read_cache_bytes() { @@ -304,13 +322,14 @@ impl SilentUpdater { } impl SilentUpdater { - async fn ask_user_to_install(app_handle: &tauri::AppHandle, version: &str) -> bool { - use tauri_plugin_dialog::{DialogExt as _, MessageDialogButtons, MessageDialogKind}; + async fn ask_user_to_install(app_handle: &tauri::AppHandle, version: &str) -> StartupUpdateChoice { + use tauri_plugin_dialog::{DialogExt as _, MessageDialogButtons, MessageDialogKind, MessageDialogResult}; let title = clash_verge_i18n::t!("notifications.updateReady.title"); let body = clash_verge_i18n::t!("notifications.updateReady.body").replace("{version}", version); let install_now = clash_verge_i18n::t!("notifications.updateReady.installNow").into_owned(); let later = clash_verge_i18n::t!("notifications.updateReady.later").into_owned(); + let never = clash_verge_i18n::t!("notifications.updateReady.never").into_owned(); let (tx, rx) = tokio::sync::oneshot::channel(); @@ -318,16 +337,31 @@ impl SilentUpdater { .dialog() .message(body) .title(title) - .buttons(MessageDialogButtons::OkCancelCustom(install_now, later)) + .buttons(MessageDialogButtons::YesNoCancelCustom( + install_now.clone(), + later.clone(), + never.clone(), + )) .kind(MessageDialogKind::Info) - .show(move |confirmed| { - let _ = tx.send(confirmed); + .show_with_result(move |result| { + let _ = tx.send(result); }); - rx.await.unwrap_or(false) + match rx.await.unwrap_or(MessageDialogResult::Cancel) { + MessageDialogResult::Custom(label) if label == install_now => StartupUpdateChoice::Install, + MessageDialogResult::Custom(label) if label == later => StartupUpdateChoice::Later, + MessageDialogResult::Custom(label) if label == never => StartupUpdateChoice::Never, + _ => StartupUpdateChoice::Later, + } } } +enum StartupUpdateChoice { + Install, + Later, + Never, +} + impl SilentUpdater { /// Uses injected HTML so the splash has no bundled-file dependency. fn show_update_splash(app_handle: &tauri::AppHandle, version: &str) {