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) {