2025-03-04 01:01:24 +08:00
|
|
|
use super::CmdResult;
|
2025-06-05 13:43:02 +08:00
|
|
|
use crate::{core::handle, module::mihomo::MihomoManager, state::proxy::CmdProxyState};
|
2025-05-26 16:08:16 +08:00
|
|
|
use std::{
|
2025-06-05 13:43:02 +08:00
|
|
|
sync::Mutex,
|
2025-05-26 16:08:16 +08:00
|
|
|
time::{Duration, Instant},
|
|
|
|
|
};
|
2025-06-05 13:43:02 +08:00
|
|
|
use tauri::Manager;
|
2025-05-25 21:34:48 +08:00
|
|
|
|
2025-06-05 13:43:02 +08:00
|
|
|
const PROVIDERS_REFRESH_INTERVAL: Duration = Duration::from_secs(3);
|
2025-03-05 00:45:08 +08:00
|
|
|
|
2025-03-04 01:01:24 +08:00
|
|
|
#[tauri::command]
|
|
|
|
|
pub async fn get_proxies() -> CmdResult<serde_json::Value> {
|
2025-05-25 21:34:48 +08:00
|
|
|
let manager = MihomoManager::global();
|
2025-03-27 05:09:36 +08:00
|
|
|
|
2025-05-25 21:34:48 +08:00
|
|
|
manager
|
2025-03-19 02:04:01 +08:00
|
|
|
.refresh_proxies()
|
|
|
|
|
.await
|
2025-05-25 21:34:48 +08:00
|
|
|
.map(|_| manager.get_proxies())
|
|
|
|
|
.or_else(|_| Ok(manager.get_proxies()))
|
2025-03-04 01:01:24 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[tauri::command]
|
|
|
|
|
pub async fn get_providers_proxies() -> CmdResult<serde_json::Value> {
|
2025-06-05 13:43:02 +08:00
|
|
|
let app_handle = handle::Handle::global().app_handle().unwrap();
|
|
|
|
|
let cmd_proxy_state = app_handle.state::<Mutex<CmdProxyState>>();
|
2025-05-25 21:34:48 +08:00
|
|
|
|
|
|
|
|
let should_refresh = {
|
2025-06-05 13:43:02 +08:00
|
|
|
let mut state = cmd_proxy_state.lock().unwrap();
|
|
|
|
|
let now = Instant::now();
|
|
|
|
|
if now.duration_since(state.last_refresh_time) > PROVIDERS_REFRESH_INTERVAL {
|
|
|
|
|
state.need_refresh = true;
|
|
|
|
|
state.last_refresh_time = now;
|
2025-05-25 21:34:48 +08:00
|
|
|
}
|
2025-06-05 13:43:02 +08:00
|
|
|
state.need_refresh
|
2025-05-25 21:34:48 +08:00
|
|
|
};
|
|
|
|
|
|
2025-06-05 13:43:02 +08:00
|
|
|
if should_refresh {
|
|
|
|
|
let manager = MihomoManager::global();
|
|
|
|
|
if let Err(e) = manager.refresh_providers_proxies().await {
|
|
|
|
|
log::warn!(target: "app", "providers_proxies刷新失败: {}", e);
|
|
|
|
|
return Err(e.into());
|
|
|
|
|
}
|
2025-05-25 21:34:48 +08:00
|
|
|
|
2025-06-05 13:43:02 +08:00
|
|
|
let mut state = cmd_proxy_state.lock().unwrap();
|
|
|
|
|
state.providers_proxies = manager.get_providers_proxies().clone();
|
|
|
|
|
state.need_refresh = false;
|
|
|
|
|
log::debug!(target: "app", "providers_proxies刷新成功");
|
2025-05-25 21:34:48 +08:00
|
|
|
}
|
|
|
|
|
|
2025-06-05 13:43:02 +08:00
|
|
|
let providers_proxies = {
|
|
|
|
|
let state = cmd_proxy_state.lock().unwrap();
|
|
|
|
|
state.providers_proxies.clone()
|
|
|
|
|
};
|
|
|
|
|
Ok(providers_proxies)
|
2025-03-05 00:45:08 +08:00
|
|
|
}
|