refactor: wip

This commit is contained in:
GyDi
2022-11-16 01:26:41 +08:00
parent ee68d80d0a
commit abdbf158d1
11 changed files with 247 additions and 90 deletions

View File

@@ -1,7 +1,7 @@
use super::{clash_api, logger::Logger};
use crate::{
config::*,
enhance,
enhance, log_err,
utils::{self, dirs},
};
use anyhow::{bail, Context, Result};
@@ -14,8 +14,6 @@ use tokio::time::sleep;
#[derive(Debug)]
pub struct CoreManager {
clash_core: Arc<Mutex<String>>,
sidecar: Arc<Mutex<Option<CommandChild>>>,
#[allow(unused)]
@@ -29,7 +27,6 @@ impl CoreManager {
static CORE_MANAGER: OnceCell<CoreManager> = OnceCell::new();
CORE_MANAGER.get_or_init(|| CoreManager {
clash_core: Arc::new(Mutex::new("clash".into())),
sidecar: Arc::new(Mutex::new(None)),
runtime_config: Arc::new(Mutex::new(RuntimeResult::default())),
use_service_mode: Arc::new(Mutex::new(false)),
@@ -50,14 +47,14 @@ impl CoreManager {
}
}
// 使用配置的核心
let verge = VergeN::global().config.lock();
if let Some(verge_core) = verge.clash_core.as_ref() {
if verge_core == "clash" || verge_core == "clash-meta" {
let mut clash_core = self.clash_core.lock();
*clash_core = verge_core.clone();
}
}
// // 使用配置的核心
// let verge_core = { Config::verge().clash_core.clone() };
// if let Some(verge_core) = verge_core {
// if verge_core == "clash" || verge_core == "clash-meta" {
// let mut clash_core = self.clash_core.lock();
// *clash_core = verge_core;
// }
// }
// 启动clash
self.run_core()?;
@@ -76,7 +73,8 @@ impl CoreManager {
let config_path = dirs::clash_runtime_yaml();
let config_path = dirs::path_to_str(&config_path)?;
let clash_core = { self.clash_core.lock().clone() };
let clash_core = { Config::verge().latest().clash_core.clone() };
let clash_core = clash_core.unwrap_or("clash".into());
let output = Command::new_sidecar(clash_core)?
.args(["-t", "-f", config_path])
@@ -104,7 +102,8 @@ impl CoreManager {
let app_dir = dirs::app_home_dir();
let app_dir = dirs::path_to_str(&app_dir)?;
let clash_core = { self.clash_core.lock().clone() };
let clash_core = { Config::verge().latest().clash_core.clone() };
let clash_core = clash_core.unwrap_or("clash".into());
// fix #212
let args = match clash_core.as_str() {
@@ -177,30 +176,23 @@ impl CoreManager {
// 清掉旧日志
Logger::global().clear_log();
let old_core = {
let mut self_core = self.clash_core.lock();
let old_core = self_core.to_owned(); // 保存一下旧值
*self_core = clash_core.clone();
old_core
};
{
Config::verge().draft().clash_core = Some(clash_core);
}
match self.run_core() {
Ok(_) => {
// 更新到配置文件
{
VergeN::global().config.lock().clash_core = Some(clash_core);
}
let _ = VergeN::global().save_file();
log_err!({
Config::verge().apply();
Config::verge().latest().save_file()
});
sleep(Duration::from_millis(100)).await; // 等一会儿再更新配置
self.activate_config().await?;
Ok(())
}
Err(err) => {
// 恢复旧的值
let mut self_core = self.clash_core.lock();
*self_core = old_core;
Config::verge().discard();
Err(err)
}
}
@@ -215,15 +207,15 @@ impl CoreManager {
/// 激活一个配置
pub async fn activate_config(&self) -> Result<()> {
let clash_config = { ClashN::global().config.lock().clone() };
let clash_config = { Config::clash().latest().clone() };
let tun_mode = { VergeN::global().config.lock().enable_tun_mode.clone() };
let tun_mode = { Config::verge().latest().enable_tun_mode.clone() };
let tun_mode = tun_mode.unwrap_or(false);
let pa = { ProfilesN::global().config.lock().gen_activate()? };
let pa = { Config::profiles().latest().gen_activate()? };
let (config, exists_keys, logs) =
enhance::enhance_config(clash_config, pa.current, pa.chain, pa.valid, tun_mode);
enhance::enhance_config(clash_config.0, pa.current, pa.chain, pa.valid, tun_mode);
// 保存到文件中
let runtime_path = dirs::clash_runtime_yaml();

View File

@@ -1,4 +1,4 @@
use crate::{config, feat, log_err};
use crate::{config::Config, feat, log_err};
use anyhow::{bail, Result};
use once_cell::sync::OnceCell;
use parking_lot::Mutex;
@@ -24,9 +24,9 @@ impl Hotkey {
pub fn init(&self, app_handle: AppHandle) -> Result<()> {
*self.app_handle.lock() = Some(app_handle);
let verge = config::VergeN::global().config.lock();
let verge = Config::verge();
if let Some(hotkeys) = verge.hotkeys.as_ref() {
if let Some(hotkeys) = verge.latest().hotkeys.as_ref() {
for hotkey in hotkeys.iter() {
let mut iter = hotkey.split(',');
let func = iter.next();

View File

@@ -1,4 +1,4 @@
use crate::{config, log_err};
use crate::{config::Config, log_err};
use anyhow::{anyhow, bail, Result};
use auto_launch::{AutoLaunch, AutoLaunchBuilder};
use once_cell::sync::OnceCell;
@@ -43,7 +43,7 @@ impl Sysopt {
/// init the sysproxy
pub fn init_sysproxy(&self) -> Result<()> {
let port = { config::ClashN::global().info.lock().port.clone() };
let port = { Config::clash().latest().get_info()?.port };
if port.is_none() {
bail!("clash port is none");
@@ -51,16 +51,20 @@ impl Sysopt {
let port = port.unwrap().parse::<u16>()?;
let verge = config::VergeN::global().config.lock();
let enable = verge.enable_system_proxy.clone().unwrap_or(false);
let bypass = verge.system_proxy_bypass.clone();
let bypass = bypass.unwrap_or(DEFAULT_BYPASS.into());
let (enable, bypass) = {
let verge = Config::verge();
let verge = verge.latest();
(
verge.enable_system_proxy.clone().unwrap_or(false),
verge.system_proxy_bypass.clone(),
)
};
let current = Sysproxy {
enable,
host: String::from("127.0.0.1"),
port,
bypass,
bypass: bypass.unwrap_or(DEFAULT_BYPASS.into()),
};
if enable {
@@ -87,16 +91,18 @@ impl Sysopt {
return self.init_sysproxy();
}
let verge = config::VergeN::global().config.lock();
let enable = verge.enable_system_proxy.clone().unwrap_or(false);
let bypass = verge.system_proxy_bypass.clone();
let bypass = bypass.unwrap_or(DEFAULT_BYPASS.into());
let (enable, bypass) = {
let verge = Config::verge();
let verge = verge.latest();
(
verge.enable_system_proxy.clone().unwrap_or(false),
verge.system_proxy_bypass.clone(),
)
};
let mut sysproxy = cur_sysproxy.take().unwrap();
sysproxy.enable = enable;
sysproxy.bypass = bypass;
sysproxy.bypass = bypass.unwrap_or(DEFAULT_BYPASS.into());
sysproxy.set_system_proxy()?;
*cur_sysproxy = Some(sysproxy);
@@ -138,8 +144,13 @@ impl Sysopt {
/// init the auto launch
pub fn init_launch(&self) -> Result<()> {
let verge = config::VergeN::global().config.lock();
let enable = verge.enable_auto_launch.clone().unwrap_or(false);
let enable = {
Config::verge()
.latest()
.enable_auto_launch
.clone()
.unwrap_or(false)
};
let app_exe = current_exe()?;
let app_exe = dunce::canonicalize(app_exe)?;
@@ -202,10 +213,13 @@ impl Sysopt {
drop(auto_launch);
return self.init_launch();
}
let verge = config::VergeN::global().config.lock();
let enable = verge.enable_auto_launch.clone().unwrap_or(false);
let enable = {
Config::verge()
.latest()
.enable_auto_launch
.clone()
.unwrap_or(false)
};
let auto_launch = auto_launch.as_ref().unwrap();
match enable {
@@ -238,13 +252,16 @@ impl Sysopt {
loop {
sleep(Duration::from_secs(wait_secs)).await;
let verge = config::VergeN::global().config.lock();
let enable = verge.enable_system_proxy.clone().unwrap_or(false);
let guard = verge.enable_proxy_guard.clone().unwrap_or(false);
let guard_duration = verge.proxy_guard_duration.clone().unwrap_or(10);
let bypass = verge.system_proxy_bypass.clone();
drop(verge);
let (enable, guard, guard_duration, bypass) = {
let verge = Config::verge();
let verge = verge.latest();
(
verge.enable_system_proxy.clone().unwrap_or(false),
verge.enable_proxy_guard.clone().unwrap_or(false),
verge.proxy_guard_duration.clone().unwrap_or(10),
verge.system_proxy_bypass.clone(),
)
};
// stop loop
if !enable || !guard {
@@ -256,20 +273,21 @@ impl Sysopt {
log::debug!(target: "app", "try to guard the system proxy");
let port = { config::ClashN::global().info.lock().port.clone() };
match port.unwrap_or("".into()).parse::<u16>() {
Ok(port) => {
let sysproxy = Sysproxy {
enable: true,
host: "127.0.0.1".into(),
port,
bypass: bypass.unwrap_or(DEFAULT_BYPASS.into()),
};
if let Ok(info) = { Config::clash().latest().get_info() } {
match info.port.unwrap_or("".into()).parse::<u16>() {
Ok(port) => {
let sysproxy = Sysproxy {
enable: true,
host: "127.0.0.1".into(),
port,
bypass: bypass.unwrap_or(DEFAULT_BYPASS.into()),
};
log_err!(sysproxy.set_system_proxy());
}
Err(_) => {
log::error!(target: "app", "failed to parse clash port in guard proxy")
log_err!(sysproxy.set_system_proxy());
}
Err(_) => {
log::error!(target: "app", "failed to parse clash port in guard proxy")
}
}
}
}

View File

@@ -1,5 +1,5 @@
use crate::log_err;
use crate::{config, feat, utils::resolve};
use crate::{config::Config, feat, utils::resolve};
use anyhow::Result;
use tauri::{
api, AppHandle, CustomMenuItem, Manager, SystemTrayEvent, SystemTrayMenu, SystemTrayMenuItem,
@@ -10,10 +10,7 @@ pub struct Tray {}
impl Tray {
pub fn tray_menu(app_handle: &AppHandle) -> SystemTrayMenu {
let zh = {
let verge = config::VergeN::global().config.lock();
verge.language == Some("zh".into())
};
let zh = { Config::verge().latest().language == Some("zh".into()) };
let version = app_handle.package_info().version.to_string();
@@ -76,8 +73,9 @@ impl Tray {
pub fn update_part(app_handle: &AppHandle) -> Result<()> {
let mode = {
let clash = config::ClashN::global().config.lock();
clash
Config::clash()
.latest()
.0
.get("mode")
.map(|val| val.as_str().unwrap_or("rule"))
.unwrap_or("rule")
@@ -91,7 +89,8 @@ impl Tray {
let _ = tray.get_item("direct_mode").set_selected(mode == "direct");
let _ = tray.get_item("script_mode").set_selected(mode == "script");
let verge = config::VergeN::global().config.lock();
let verge = Config::verge();
let verge = verge.latest();
let system_proxy = verge.enable_system_proxy.as_ref().unwrap_or(&false);
let tun_mode = verge.enable_tun_mode.as_ref().unwrap_or(&false);