diff --git a/.github/update.log b/.github/update.log index 1af448faa1..4fd59b6ce0 100644 --- a/.github/update.log +++ b/.github/update.log @@ -695,3 +695,4 @@ Update On Wed Jul 3 20:29:03 CEST 2024 Update On Thu Jul 4 20:30:48 CEST 2024 Update On Fri Jul 5 20:32:45 CEST 2024 Update On Sat Jul 6 20:29:28 CEST 2024 +Update On Sun Jul 7 20:30:22 CEST 2024 diff --git a/clash-nyanpasu/backend/Cargo.lock b/clash-nyanpasu/backend/Cargo.lock index a0cedb8c3f..7f19b650f6 100644 --- a/clash-nyanpasu/backend/Cargo.lock +++ b/clash-nyanpasu/backend/Cargo.lock @@ -5160,18 +5160,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.203" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.203" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", diff --git a/clash-nyanpasu/backend/tauri/icons/128x128.png b/clash-nyanpasu/backend/tauri/icons/128x128.png index ca678c4b04..d77984d9d5 100644 Binary files a/clash-nyanpasu/backend/tauri/icons/128x128.png and b/clash-nyanpasu/backend/tauri/icons/128x128.png differ diff --git a/clash-nyanpasu/backend/tauri/icons/128x128@2x.png b/clash-nyanpasu/backend/tauri/icons/128x128@2x.png index f94cf252fe..eb4a3ff77e 100644 Binary files a/clash-nyanpasu/backend/tauri/icons/128x128@2x.png and b/clash-nyanpasu/backend/tauri/icons/128x128@2x.png differ diff --git a/clash-nyanpasu/backend/tauri/icons/32x32.png b/clash-nyanpasu/backend/tauri/icons/32x32.png index 18eb4334fd..e549809607 100644 Binary files a/clash-nyanpasu/backend/tauri/icons/32x32.png and b/clash-nyanpasu/backend/tauri/icons/32x32.png differ diff --git a/clash-nyanpasu/backend/tauri/icons/Square107x107Logo.png b/clash-nyanpasu/backend/tauri/icons/Square107x107Logo.png index 25f5f2501e..88765210b3 100644 Binary files a/clash-nyanpasu/backend/tauri/icons/Square107x107Logo.png and b/clash-nyanpasu/backend/tauri/icons/Square107x107Logo.png differ diff --git a/clash-nyanpasu/backend/tauri/icons/Square142x142Logo.png b/clash-nyanpasu/backend/tauri/icons/Square142x142Logo.png index 25b7f168e3..8daf38ffbc 100644 Binary files a/clash-nyanpasu/backend/tauri/icons/Square142x142Logo.png and b/clash-nyanpasu/backend/tauri/icons/Square142x142Logo.png differ diff --git a/clash-nyanpasu/backend/tauri/icons/Square150x150Logo.png b/clash-nyanpasu/backend/tauri/icons/Square150x150Logo.png index 27c71ac324..da60534a68 100644 Binary files a/clash-nyanpasu/backend/tauri/icons/Square150x150Logo.png and b/clash-nyanpasu/backend/tauri/icons/Square150x150Logo.png differ diff --git a/clash-nyanpasu/backend/tauri/icons/Square284x284Logo.png b/clash-nyanpasu/backend/tauri/icons/Square284x284Logo.png index 44fba45be2..9abeebdcdf 100644 Binary files a/clash-nyanpasu/backend/tauri/icons/Square284x284Logo.png and b/clash-nyanpasu/backend/tauri/icons/Square284x284Logo.png differ diff --git a/clash-nyanpasu/backend/tauri/icons/Square30x30Logo.png b/clash-nyanpasu/backend/tauri/icons/Square30x30Logo.png index 05ae128e77..53c6cf751b 100644 Binary files a/clash-nyanpasu/backend/tauri/icons/Square30x30Logo.png and b/clash-nyanpasu/backend/tauri/icons/Square30x30Logo.png differ diff --git a/clash-nyanpasu/backend/tauri/icons/Square310x310Logo.png b/clash-nyanpasu/backend/tauri/icons/Square310x310Logo.png index cc61e8fbff..dadc1d667e 100644 Binary files a/clash-nyanpasu/backend/tauri/icons/Square310x310Logo.png and b/clash-nyanpasu/backend/tauri/icons/Square310x310Logo.png differ diff --git a/clash-nyanpasu/backend/tauri/icons/Square44x44Logo.png b/clash-nyanpasu/backend/tauri/icons/Square44x44Logo.png index c40f2b5c49..c4932b7c13 100644 Binary files a/clash-nyanpasu/backend/tauri/icons/Square44x44Logo.png and b/clash-nyanpasu/backend/tauri/icons/Square44x44Logo.png differ diff --git a/clash-nyanpasu/backend/tauri/icons/Square71x71Logo.png b/clash-nyanpasu/backend/tauri/icons/Square71x71Logo.png index 0dee9e8080..f9ab16fd80 100644 Binary files a/clash-nyanpasu/backend/tauri/icons/Square71x71Logo.png and b/clash-nyanpasu/backend/tauri/icons/Square71x71Logo.png differ diff --git a/clash-nyanpasu/backend/tauri/icons/Square89x89Logo.png b/clash-nyanpasu/backend/tauri/icons/Square89x89Logo.png index f13a5b56f2..ee5cc1c00f 100644 Binary files a/clash-nyanpasu/backend/tauri/icons/Square89x89Logo.png and b/clash-nyanpasu/backend/tauri/icons/Square89x89Logo.png differ diff --git a/clash-nyanpasu/backend/tauri/icons/StoreLogo.png b/clash-nyanpasu/backend/tauri/icons/StoreLogo.png index f7232eac57..94f4b41e35 100644 Binary files a/clash-nyanpasu/backend/tauri/icons/StoreLogo.png and b/clash-nyanpasu/backend/tauri/icons/StoreLogo.png differ diff --git a/clash-nyanpasu/backend/tauri/icons/icon-new.icns b/clash-nyanpasu/backend/tauri/icons/icon-new.icns deleted file mode 100644 index b83304050d..0000000000 Binary files a/clash-nyanpasu/backend/tauri/icons/icon-new.icns and /dev/null differ diff --git a/clash-nyanpasu/backend/tauri/icons/icon-new.png b/clash-nyanpasu/backend/tauri/icons/icon-new.png deleted file mode 100644 index 93ccca15ee..0000000000 Binary files a/clash-nyanpasu/backend/tauri/icons/icon-new.png and /dev/null differ diff --git a/clash-nyanpasu/backend/tauri/icons/icon.icns b/clash-nyanpasu/backend/tauri/icons/icon.icns index e3f5289cef..9c80524c93 100644 Binary files a/clash-nyanpasu/backend/tauri/icons/icon.icns and b/clash-nyanpasu/backend/tauri/icons/icon.icns differ diff --git a/clash-nyanpasu/backend/tauri/icons/icon.ico b/clash-nyanpasu/backend/tauri/icons/icon.ico index 0cd7bcd512..38f8ebd4f1 100644 Binary files a/clash-nyanpasu/backend/tauri/icons/icon.ico and b/clash-nyanpasu/backend/tauri/icons/icon.ico differ diff --git a/clash-nyanpasu/backend/tauri/icons/icon.png b/clash-nyanpasu/backend/tauri/icons/icon.png index fcbf845efa..1341f51df1 100644 Binary files a/clash-nyanpasu/backend/tauri/icons/icon.png and b/clash-nyanpasu/backend/tauri/icons/icon.png differ diff --git a/clash-nyanpasu/backend/tauri/tauri.conf.json b/clash-nyanpasu/backend/tauri/tauri.conf.json index 6543ac9607..760bf53f2c 100644 --- a/clash-nyanpasu/backend/tauri/tauri.conf.json +++ b/clash-nyanpasu/backend/tauri/tauri.conf.json @@ -22,7 +22,7 @@ "icons/32x32.png", "icons/128x128.png", "icons/128x128@2x.png", - "icons/icon-new.icns", + "icons/icon.icns", "icons/icon.ico" ], "resources": ["resources"], diff --git a/clash-nyanpasu/frontend/interface/service/types.ts b/clash-nyanpasu/frontend/interface/service/types.ts index 45db58cf58..4c28781586 100644 --- a/clash-nyanpasu/frontend/interface/service/types.ts +++ b/clash-nyanpasu/frontend/interface/service/types.ts @@ -188,6 +188,12 @@ export interface ProviderItem { proxies: Clash.Proxy[]; updatedAt: string; vehicleType: string; + subscriptionInfo?: { + Upload?: number; + Download?: number; + Total?: number; + Expire?: number; + }; } export interface Traffic { diff --git a/clash-nyanpasu/frontend/nyanpasu/package.json b/clash-nyanpasu/frontend/nyanpasu/package.json index fbb6052e6c..03f9637321 100644 --- a/clash-nyanpasu/frontend/nyanpasu/package.json +++ b/clash-nyanpasu/frontend/nyanpasu/package.json @@ -60,7 +60,7 @@ "clsx": "2.1.1", "react-resizable-panels": "2.0.20", "sass": "1.77.6", - "shiki": "1.10.1", + "shiki": "1.10.2", "tailwindcss-textshadow": "2.1.3", "vite": "5.3.3", "vite-plugin-monaco-editor": "1.1.3", diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/dashboard/dataline.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/dashboard/dataline.tsx index 712979c35d..cf5b11ecd8 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/dashboard/dataline.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/dashboard/dataline.tsx @@ -39,7 +39,7 @@ export const Dataline: FC = ({
- {total && ( + {total !== undefined && ( {t("Total")}: {parseTraffic(total).join(" ")} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/logs/log-list.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/logs/log-list.tsx index fbfd9c2bfe..fcc6466520 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/logs/log-list.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/logs/log-list.tsx @@ -1,6 +1,6 @@ import { LogMessage } from "@nyanpasu/interface"; -import { useThrottleFn } from "ahooks"; -import { useEffect, useRef } from "react"; +import { useDebounceEffect } from "ahooks"; +import { useRef } from "react"; import { VList, VListHandle } from "virtua"; import LogItem from "./log-item"; @@ -9,28 +9,24 @@ export const LogList = ({ data }: { data: LogMessage[] }) => { const shouldStickToBottom = useRef(true); - const { run: scrollToBottom } = useThrottleFn( + useDebounceEffect( () => { if (shouldStickToBottom.current) { - setTimeout(() => { - vListRef.current?.scrollToIndex(data.length - 1, { - align: "end", - smooth: true, - }); - }, 100); + vListRef.current?.scrollToIndex(data.length - 1, { + align: "end", + smooth: true, + }); } }, + [data], { wait: 100 }, ); - useEffect(() => { - scrollToBottom(); - }, [data]); - return ( {data.map((item, index) => { return ; diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/providers/proxies-provider-traffic.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/providers/proxies-provider-traffic.tsx new file mode 100644 index 0000000000..835e00516b --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/providers/proxies-provider-traffic.tsx @@ -0,0 +1,45 @@ +import parseTraffic from "@/utils/parse-traffic"; +import { LinearProgress, Tooltip } from "@mui/material"; +import { ProxiesProviderProps } from "./proxies-provider"; + +export const ProxiesProviderTraffic = ({ provider }: ProxiesProviderProps) => { + const calc = () => { + let progress = 0; + let total = 0; + let used = 0; + + if (provider.subscriptionInfo) { + const { + Download: download, + Upload: upload, + Total: t, + } = provider.subscriptionInfo; + + total = t ?? 0; + + used = (download ?? 0) + (upload ?? 0); + + progress = (used / (total ?? 0)) * 100; + } + + return { progress, total, used }; + }; + + const { progress, total, used } = calc(); + + return ( +
+
+ +
+ + +
+ {((used / total) * 100).toFixed(2)}% +
+
+
+ ); +}; + +export default ProxiesProviderTraffic; diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/providers/proxies-provider.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/providers/proxies-provider.tsx index d25b60f344..9bae593a0f 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/providers/proxies-provider.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/providers/proxies-provider.tsx @@ -1,12 +1,14 @@ import { useMessage } from "@/hooks/use-notification"; +import parseTraffic from "@/utils/parse-traffic"; import { Refresh } from "@mui/icons-material"; import LoadingButton from "@mui/lab/LoadingButton"; -import { Chip, Paper } from "@mui/material"; +import { Chip, LinearProgress, Paper, Tooltip } from "@mui/material"; import { ProviderItem, useClashCore } from "@nyanpasu/interface"; import { useLockFn } from "ahooks"; import dayjs from "dayjs"; import { useState } from "react"; import { useTranslation } from "react-i18next"; +import ProxiesProviderTraffic from "./proxies-provider-traffic"; export interface ProxiesProviderProps { provider: ProviderItem; @@ -36,7 +38,7 @@ export const ProxiesProvider = ({ provider }: ProxiesProviderProps) => { return ( {
+ {provider.subscriptionInfo && ( + + )} +
{ if (!list) return; - if (editIndex) { + if (editIndex !== null) { list[editIndex] = editString; } else { list.push(editString); diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/logs.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/logs.tsx index 629595f7e8..2c634586b9 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/logs.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/logs.tsx @@ -38,6 +38,7 @@ export default function LogPage() { full title={t("Logs")} contentStyle={{ height: "100%" }} + sectionStyle={{ height: "100%" }} header={
diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/rules.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/rules.tsx index 209de81f59..2a6021c028 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/rules.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/rules.tsx @@ -38,6 +38,7 @@ export default function RulesPage() { full title={t("Rules")} contentStyle={{ height: "100%" }} + sectionStyle={{ height: "100%" }} header={ section { position: relative; @@ -55,7 +55,7 @@ height: 100%; overflow: hidden; background-color: var(--background-color); - border-radius: var(--border-radius); + border-radius: calc(var(--border-radius) * 2); .RightContainer-Content { height: 100%; diff --git a/clash-nyanpasu/pnpm-lock.yaml b/clash-nyanpasu/pnpm-lock.yaml index eb8f3b2f01..daf9e523f2 100644 --- a/clash-nyanpasu/pnpm-lock.yaml +++ b/clash-nyanpasu/pnpm-lock.yaml @@ -313,8 +313,8 @@ importers: specifier: 1.77.6 version: 1.77.6 shiki: - specifier: 1.10.1 - version: 1.10.1 + specifier: 1.10.2 + version: 1.10.2 tailwindcss-textshadow: specifier: 2.1.3 version: 2.1.3 @@ -1505,8 +1505,8 @@ packages: cpu: [x64] os: [win32] - '@shikijs/core@1.10.1': - resolution: {integrity: sha512-qdiJS5a/QGCff7VUFIqd0hDdWly9rDp8lhVmXVrS11aazX8LOTRLHAXkkEeONNsS43EcCd7gax9LLoOz4vlFQA==} + '@shikijs/core@1.10.2': + resolution: {integrity: sha512-hCtKSC0PNmidU+TVBUiddE0sF1QsOPVbBBRQlugsKy0QJBfSj9aIQQ/pNEIv58wwM/9cAlWG1yihi+5ovZfYmA==} '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} @@ -4988,8 +4988,8 @@ packages: shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - shiki@1.10.1: - resolution: {integrity: sha512-uafV7WCgN4YYrccH6yxpnps6k38sSTlFRrwc4jycWmhWxJIm9dPrk+XkY1hZ2t0I7jmacMNb15Lf2fspa/Y3lg==} + shiki@1.10.2: + resolution: {integrity: sha512-wrddjiCJ6D8zB1MuAGZ37G37rGw+6Ntnqqbl2uXh3P8g5JxneJRRhccPnex/gqorJoXkbpTRC2x54QIsdx2b1Q==} side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} @@ -6771,7 +6771,9 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.17.2': optional: true - '@shikijs/core@1.10.1': {} + '@shikijs/core@1.10.2': + dependencies: + '@types/hast': 3.0.4 '@sindresorhus/is@4.6.0': {} @@ -10618,9 +10620,10 @@ snapshots: shell-quote@1.8.1: {} - shiki@1.10.1: + shiki@1.10.2: dependencies: - '@shikijs/core': 1.10.1 + '@shikijs/core': 1.10.2 + '@types/hast': 3.0.4 side-channel@1.0.6: dependencies: diff --git a/clash-verge-rev/.github/workflows/release.yml b/clash-verge-rev/.github/workflows/release.yml index cf5a6fc165..a5822debcf 100644 --- a/clash-verge-rev/.github/workflows/release.yml +++ b/clash-verge-rev/.github/workflows/release.yml @@ -256,3 +256,14 @@ jobs: run: pnpm updater-fixed-webview2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + submit-to-winget: + runs-on: windows-latest + needs: [release-update] + steps: + - name: Submit to Winget + uses: vedantmgoyal9/winget-releaser@main + with: + identifer: ClashVergeRev.ClashVergeRev + installers-regex: '_(arm64|x64|x86)-setup\.exe$' + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/clash-verge-rev/src-tauri/icons/tray-icon-mono.ico b/clash-verge-rev/src-tauri/icons/tray-icon-mono.ico index fcc5bae036..affcde5c7d 100644 Binary files a/clash-verge-rev/src-tauri/icons/tray-icon-mono.ico and b/clash-verge-rev/src-tauri/icons/tray-icon-mono.ico differ diff --git a/clash-verge-rev/src-tauri/icons/tray-icon-sys-mono.ico b/clash-verge-rev/src-tauri/icons/tray-icon-sys-mono.ico index dde1acbd3c..0f6d806323 100644 Binary files a/clash-verge-rev/src-tauri/icons/tray-icon-sys-mono.ico and b/clash-verge-rev/src-tauri/icons/tray-icon-sys-mono.ico differ diff --git a/clash-verge-rev/src-tauri/icons/tray-icon-tun-mono.ico b/clash-verge-rev/src-tauri/icons/tray-icon-tun-mono.ico index bc7cb4f0b0..c95d1e0471 100644 Binary files a/clash-verge-rev/src-tauri/icons/tray-icon-tun-mono.ico and b/clash-verge-rev/src-tauri/icons/tray-icon-tun-mono.ico differ diff --git a/clash-verge-rev/src-tauri/src/cmds.rs b/clash-verge-rev/src-tauri/src/cmds.rs index dd474e88a0..5576ca88e4 100644 --- a/clash-verge-rev/src-tauri/src/cmds.rs +++ b/clash-verge-rev/src-tauri/src/cmds.rs @@ -322,6 +322,17 @@ pub fn copy_icon_file(path: String, name: String) -> CmdResult { } } +#[tauri::command] +pub fn get_network_interfaces() -> Vec { + use sysinfo::Networks; + let mut result = Vec::new(); + let networks = Networks::new_with_refreshed_list(); + for (interface_name, _) in &networks { + result.push(interface_name.clone()); + } + return result; +} + #[tauri::command] pub fn open_devtools(app_handle: tauri::AppHandle) { if let Some(window) = app_handle.get_window("main") { diff --git a/clash-verge-rev/src-tauri/src/core/core.rs b/clash-verge-rev/src-tauri/src/core/core.rs index 1fa76127ea..d49cfcd726 100644 --- a/clash-verge-rev/src-tauri/src/core/core.rs +++ b/clash-verge-rev/src-tauri/src/core/core.rs @@ -7,7 +7,7 @@ use once_cell::sync::OnceCell; use parking_lot::Mutex; use serde_yaml::Mapping; use std::{sync::Arc, time::Duration}; -use sysinfo::System; +use sysinfo::{ProcessRefreshKind, RefreshKind, System}; use tauri::api::process::{Command, CommandChild, CommandEvent}; use tokio::time::sleep; @@ -44,13 +44,27 @@ impl CoreManager { let config_path = dirs::path_to_str(&config_path)?; let clash_core = { Config::verge().latest().clash_core.clone() }; - let clash_core = clash_core.unwrap_or("clash".into()); + let mut clash_core = clash_core.unwrap_or("verge-mihomo".into()); - let app_dir = dirs::app_home_dir()?; - let app_dir = dirs::path_to_str(&app_dir)?; + // compatibility + if clash_core.contains("clash") { + clash_core = "verge-mihomo".to_string(); + Config::verge().draft().patch_config(IVerge { + clash_core: Some("verge-mihomo".to_string()), + ..IVerge::default() + }); + Config::verge().apply(); + match Config::verge().data().save_file() { + Ok(_) => handle::Handle::refresh_verge(), + Err(err) => log::error!(target: "app", "{err}"), + } + } + + let test_dir = dirs::app_home_dir()?.join("test"); + let test_dir = dirs::path_to_str(&test_dir)?; let output = Command::new_sidecar(clash_core)? - .args(["-t", "-d", app_dir, "-f", config_path]) + .args(["-t", "-d", test_dir, "-f", config_path]) .output()?; if !output.status.success() { @@ -70,12 +84,6 @@ impl CoreManager { pub async fn run_core(&self) -> Result<()> { let config_path = Config::generate_file(ConfigType::Run)?; - #[allow(unused_mut)] - let mut should_kill = match self.sidecar.lock().take() { - Some(_) => true, - None => false, - }; - // 关闭tun模式 let mut disable = Mapping::new(); let mut tun = Mapping::new(); @@ -84,23 +92,19 @@ impl CoreManager { log::debug!(target: "app", "disable tun mode"); let _ = clash_api::patch_configs(&disable).await; - let mut system = System::new(); - system.refresh_all(); - let procs = system.processes_by_name("verge-mihomo"); - for proc in procs { - log::debug!(target: "app", "kill all clash process"); - proc.kill(); - } - if *self.use_service_mode.lock() { log::debug!(target: "app", "stop the core by service"); log_err!(service::stop_core_by_service().await); - should_kill = true; - } + } else { + let system = System::new_with_specifics( + RefreshKind::new().with_processes(ProcessRefreshKind::everything()), + ); + let procs = system.processes_by_name("verge-mihomo"); - // 这里得等一会儿 - if should_kill { - sleep(Duration::from_millis(500)).await; + for proc in procs { + log::debug!(target: "app", "kill all clash process"); + proc.kill(); + } } // 服务模式 @@ -237,8 +241,9 @@ impl CoreManager { let mut sidecar = self.sidecar.lock(); let _ = sidecar.take(); - let mut system = System::new(); - system.refresh_all(); + let system = System::new_with_specifics( + RefreshKind::new().with_processes(ProcessRefreshKind::everything()), + ); let procs = system.processes_by_name("verge-mihomo"); for proc in procs { log::debug!(target: "app", "kill all clash process"); @@ -287,7 +292,6 @@ impl CoreManager { /// 如果涉及端口和外部控制则需要重启 pub async fn update_config(&self) -> Result<()> { log::debug!(target: "app", "try to update clash config"); - // 更新订阅 Config::generate().await?; @@ -299,20 +303,19 @@ impl CoreManager { let path = dirs::path_to_str(&path)?; // 发送请求 发送5次 - for i in 0..5 { + for i in 0..10 { match clash_api::put_configs(path).await { Ok(_) => break, Err(err) => { - if i < 4 { + if i < 9 { log::info!(target: "app", "{err}"); } else { bail!(err); } } } - sleep(Duration::from_millis(250)).await; + sleep(Duration::from_millis(100)).await; } - Ok(()) } } diff --git a/clash-verge-rev/src-tauri/src/feat.rs b/clash-verge-rev/src-tauri/src/feat.rs index 57a192871c..e4d6503a44 100644 --- a/clash-verge-rev/src-tauri/src/feat.rs +++ b/clash-verge-rev/src-tauri/src/feat.rs @@ -107,48 +107,13 @@ pub async fn patch_clash(patch: Mapping) -> Result<()> { Config::clash().draft().patch_config(patch.clone()); let res = { - let redir_port = patch.get("redir-port"); - let tproxy_port = patch.get("tproxy-port"); - let mixed_port = patch.get("mixed-port"); - let socks_port = patch.get("socks-port"); - let port = patch.get("port"); - let enable_random_port = Config::verge().latest().enable_random_port.unwrap_or(false); - if mixed_port.is_some() && !enable_random_port { - let changed = mixed_port.unwrap() - != Config::verge() - .latest() - .verge_mixed_port - .unwrap_or(Config::clash().data().get_mixed_port()); - // 检查端口占用 - if changed { - if let Some(port) = mixed_port.unwrap().as_u64() { - if !port_scanner::local_port_available(port as u16) { - Config::clash().discard(); - bail!("port already in use"); - } - } - } - }; - // 激活订阅 - if redir_port.is_some() - || tproxy_port.is_some() - || mixed_port.is_some() - || socks_port.is_some() - || port.is_some() - || patch.get("secret").is_some() - || patch.get("external-controller").is_some() - { + if patch.get("secret").is_some() || patch.get("external-controller").is_some() { Config::generate().await?; CoreManager::global().run_core().await?; handle::Handle::refresh_clash(); } - // 更新系统代理 - if mixed_port.is_some() { - log_err!(sysopt::Sysopt::global().init_sysproxy()); - } - if patch.get("mode").is_some() { log_err!(handle::Handle::update_systray_part()); } @@ -174,7 +139,6 @@ pub async fn patch_clash(patch: Mapping) -> Result<()> { /// 一般都是一个个的修改 pub async fn patch_verge(patch: IVerge) -> Result<()> { Config::verge().draft().patch_config(patch.clone()); - let tun_mode = patch.enable_tun_mode; let auto_launch = patch.enable_auto_launch; let system_proxy = patch.enable_system_proxy; @@ -182,7 +146,7 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { let pac_content = patch.pac_file_content; let proxy_bypass = patch.system_proxy_bypass; let language = patch.language; - let port = patch.verge_mixed_port; + let mixed_port = patch.verge_mixed_port; #[cfg(target_os = "macos")] let tray_icon = patch.tray_icon; let common_tray_icon = patch.common_tray_icon; @@ -190,41 +154,62 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { let tun_tray_icon = patch.tun_tray_icon; #[cfg(not(target_os = "windows"))] let redir_enabled = patch.verge_redir_enabled; + #[cfg(not(target_os = "windows"))] + let redir_port = patch.verge_redir_port; #[cfg(target_os = "linux")] let tproxy_enabled = patch.verge_tproxy_enabled; + #[cfg(target_os = "linux")] + let tproxy_port = patch.verge_tproxy_port; let socks_enabled = patch.verge_socks_enabled; + let socks_port = patch.verge_socks_port; let http_enabled = patch.verge_http_enabled; + let http_port = patch.verge_port; let res = { let service_mode = patch.enable_service_mode; - + let mut generated = false; if service_mode.is_some() { log::debug!(target: "app", "change service mode to {}", service_mode.unwrap()); - - Config::generate().await?; - CoreManager::global().run_core().await?; + if !generated { + Config::generate().await?; + CoreManager::global().run_core().await?; + generated = true; + } } else if tun_mode.is_some() { update_core_config().await?; } #[cfg(not(target_os = "windows"))] - if redir_enabled.is_some() { - Config::generate().await?; - CoreManager::global().run_core().await?; + if redir_enabled.is_some() || redir_port.is_some() { + if !generated { + Config::generate().await?; + CoreManager::global().run_core().await?; + generated = true; + } } #[cfg(target_os = "linux")] - if tproxy_enabled.is_some() { - Config::generate().await?; - CoreManager::global().run_core().await?; + if tproxy_enabled.is_some() || tproxy_port.is_some() { + if !generated { + Config::generate().await?; + CoreManager::global().run_core().await?; + generated = true; + } } - if socks_enabled.is_some() || http_enabled.is_some() { - Config::generate().await?; - CoreManager::global().run_core().await?; + if socks_enabled.is_some() + || http_enabled.is_some() + || socks_port.is_some() + || http_port.is_some() + || mixed_port.is_some() + { + if !generated { + Config::generate().await?; + CoreManager::global().run_core().await?; + } } if auto_launch.is_some() { sysopt::Sysopt::global().update_launch()?; } if system_proxy.is_some() || proxy_bypass.is_some() - || port.is_some() + || mixed_port.is_some() || pac.is_some() || pac_content.is_some() { diff --git a/clash-verge-rev/src-tauri/src/main.rs b/clash-verge-rev/src-tauri/src/main.rs index dbdd162b26..fb11e443be 100644 --- a/clash-verge-rev/src-tauri/src/main.rs +++ b/clash-verge-rev/src-tauri/src/main.rs @@ -51,6 +51,7 @@ fn main() -> std::io::Result<()> { cmds::open_web_url, cmds::open_core_dir, cmds::get_portable_flag, + cmds::get_network_interfaces, // cmds::kill_sidecar, cmds::restart_sidecar, // clash diff --git a/clash-verge-rev/src/components/base/base-search-box.tsx b/clash-verge-rev/src/components/base/base-search-box.tsx index f3f8d53eac..eb50a46014 100644 --- a/clash-verge-rev/src/components/base/base-search-box.tsx +++ b/clash-verge-rev/src/components/base/base-search-box.tsx @@ -26,7 +26,7 @@ type SearchProps = { export const BaseSearchBox = styled((props: SearchProps) => { const { t } = useTranslation(); const inputRef = useRef(null); - const [matchCase, setMatchCase] = useState(props.matchCase ?? true); + const [matchCase, setMatchCase] = useState(props.matchCase ?? false); const [matchWholeWord, setMatchWholeWord] = useState( props.matchWholeWord ?? false ); @@ -96,7 +96,7 @@ export const BaseSearchBox = styled((props: SearchProps) => { return ( ) => { return (