feat: clash meta core supports

This commit is contained in:
GyDi
2022-05-17 01:59:49 +08:00
parent f5c6fa842a
commit be9ea4ea8e
13 changed files with 195 additions and 36 deletions

View File

@@ -45,9 +45,7 @@ windows-sys = { version = "0.36", features = ["Win32_System_LibraryLoader", "Win
[features]
default = ["custom-protocol", "tauri/ayatana-tray"]
custom-protocol = ["tauri/custom-protocol"]
meta-dev = ["clash-meta", "verge-dev"]
verge-dev = []
clash-meta = []
debug-yml = []
[profile.release]

View File

@@ -196,10 +196,16 @@ pub fn patch_verge_config(
payload: Verge,
app_handle: tauri::AppHandle,
core: State<'_, Core>,
) -> Result<(), String> {
) -> CmdResult {
wrap_err!(core.patch_verge(payload, &app_handle))
}
/// change clash core
#[tauri::command]
pub fn change_clash_core(core: State<'_, Core>, clash_core: Option<String>) -> CmdResult {
wrap_err!(core.change_core(clash_core))
}
/// restart the sidecar
#[tauri::command]
pub fn restart_sidecar(core: State<'_, Core>) -> CmdResult {

View File

@@ -65,22 +65,21 @@ impl Core {
/// initialize the core state
pub fn init(&self, app_handle: tauri::AppHandle) {
let verge = self.verge.lock();
let clash_core = verge.clash_core.clone();
let mut service = self.service.lock();
service.set_core(clash_core);
#[cfg(windows)]
{
let verge = self.verge.lock();
let enable = verge.enable_service_mode.clone();
let mut service = self.service.lock();
service.set_mode(enable.unwrap_or(false));
log_if_err!(service.start());
}
#[cfg(not(windows))]
{
let mut service = self.service.lock();
log_if_err!(service.start());
}
log_if_err!(service.start());
drop(verge);
drop(service);
log_if_err!(self.activate());
@@ -138,6 +137,31 @@ impl Core {
self.activate_enhanced(true)
}
/// change the clash core
pub fn change_core(&self, clash_core: Option<String>) -> Result<()> {
let clash_core = clash_core.unwrap_or("clash".into());
if &clash_core != "clash" && &clash_core != "clash-meta" {
bail!("invalid clash core name \"{clash_core}\"");
}
let mut verge = self.verge.lock();
verge.patch_config(Verge {
clash_core: Some(clash_core.clone()),
..Verge::default()
})?;
drop(verge);
let mut service = self.service.lock();
service.stop()?;
service.set_core(Some(clash_core));
service.start()?;
drop(service);
self.activate()?;
self.activate_enhanced(true)
}
/// Patch Clash
/// handle the clash config changed
pub fn patch_clash(&self, patch: Mapping) -> Result<()> {

View File

@@ -0,0 +1,26 @@
use anyhow::{Context, Result};
use std::env::current_exe;
pub struct CoreItem {
pub name: String,
pub path: String,
}
pub struct Multi {}
impl Multi {
pub fn list() -> Result<Vec<CoreItem>> {
let paths = current_exe()
.unwrap()
.parent()
.unwrap()
.read_dir()
.context("failed to current dir")?;
for path in paths {
dbg!(path.unwrap().path().metadata().unwrap().permissions().);
}
Ok(vec![])
}
}

View File

@@ -100,15 +100,16 @@ fn main() -> std::io::Result<()> {
})
.invoke_handler(tauri::generate_handler![
// common
cmds::restart_sidecar,
cmds::get_sys_proxy,
cmds::get_cur_proxy,
cmds::kill_sidecar,
cmds::open_app_dir,
cmds::open_logs_dir,
cmds::kill_sidecar,
cmds::restart_sidecar,
// clash
cmds::get_clash_info,
cmds::patch_clash_config,
cmds::change_clash_core,
// verge
cmds::get_verge_config,
cmds::patch_verge_config,

View File

@@ -1,9 +1,8 @@
{
"tauri": {
"bundle": {
"identifier": "top.gydi.clashverge.dev",
"externalBin": ["sidecar/clash", "sidecar/clash-meta"]
}
}
}
{
"tauri": {
"bundle": {
"identifier": "top.gydi.clashverge.dev",
"externalBin": ["sidecar/clash", "sidecar/clash-meta"]
}
}
}

View File

@@ -1,7 +0,0 @@
{
"tauri": {
"bundle": {
"externalBin": ["sidecar/clash", "sidecar/clash-meta"]
}
}
}