From cd4bfdd7431688668bd055e0c3e9f2ddc3cf861b Mon Sep 17 00:00:00 2001 From: Tunglies Date: Mon, 31 Mar 2025 21:43:29 +0800 Subject: [PATCH] feat: change proxy mode to close connections if enable auto close connections --- src-tauri/src/feat/clash.rs | 21 +++++++++++++++++++ .../src_crates/crate_mihomo_api/src/lib.rs | 19 +++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src-tauri/src/feat/clash.rs b/src-tauri/src/feat/clash.rs index a5da53ed..1a32f934 100644 --- a/src-tauri/src/feat/clash.rs +++ b/src-tauri/src/feat/clash.rs @@ -37,6 +37,19 @@ pub fn restart_app() { }); } +fn after_change_clash_mode() { + tauri::async_runtime::block_on(tauri::async_runtime::spawn_blocking(|| { + tauri::async_runtime::block_on(async { + let connections = MihomoManager::global().get_connections().await.unwrap(); + let connections = connections["connections"].as_array().unwrap(); + for connection in connections { + let id = connection["id"].as_str().unwrap(); + let _ = MihomoManager::global().delete_connection(id).await; + } + }) + })); +} + /// Change Clash mode (rule/global/direct/script) pub fn change_clash_mode(mode: String) { let mut mapping = Mapping::new(); @@ -57,6 +70,14 @@ pub fn change_clash_mode(mode: String) { logging_error!(Type::Tray, true, tray::Tray::global().update_menu()); logging_error!(Type::Tray, true, tray::Tray::global().update_icon(None)); } + + let is_auto_close_connection = Config::verge() + .data() + .auto_close_connection + .unwrap_or(false); + if is_auto_close_connection { + after_change_clash_mode(); + } } Err(err) => println!("{err}"), } diff --git a/src-tauri/src_crates/crate_mihomo_api/src/lib.rs b/src-tauri/src_crates/crate_mihomo_api/src/lib.rs index 48cf01fc..61a2d3c2 100644 --- a/src-tauri/src_crates/crate_mihomo_api/src/lib.rs +++ b/src-tauri/src_crates/crate_mihomo_api/src/lib.rs @@ -140,4 +140,23 @@ impl MihomoManager { let response = self.send_request(Method::GET, url, None).await?; Ok(response) } + + pub async fn get_connections(&self) -> Result { + let url = format!("{}/connections", self.mihomo_server); + let response = self.send_request(Method::GET, url, None).await?; + Ok(response) + } + + pub async fn delete_connection(&self, id: &str) -> Result<(), String> { + let url = format!("{}/connections/{}", self.mihomo_server, id); + let response = self.send_request(Method::DELETE, url, None).await?; + if response["code"] == 204 { + Ok(()) + } else { + Err(response["message"] + .as_str() + .unwrap_or("unknown error") + .to_string()) + } + } }