diff --git a/src/main/config/controledMihomo.ts b/src/main/config/controledMihomo.ts index b58af84..4ecfd83 100644 --- a/src/main/config/controledMihomo.ts +++ b/src/main/config/controledMihomo.ts @@ -20,23 +20,7 @@ export async function getControledMihomoConfig(force = false): Promise): Promise { const { useNameserverPolicy, controlDns = true, controlSniff = true } = await getAppConfig() - if (!controlDns) { - delete controledMihomoConfig.dns - delete controledMihomoConfig.hosts - } else { - // 从不接管状态恢复 - if (controledMihomoConfig.dns?.ipv6 === undefined) { - controledMihomoConfig.dns = defaultControledMihomoConfig.dns - } - } - if (!controlSniff) { - delete controledMihomoConfig.sniffer - } else { - // 从不接管状态恢复 - if (!controledMihomoConfig.sniffer) { - controledMihomoConfig.sniffer = defaultControledMihomoConfig.sniffer - } - } + if (patch.hosts) { controledMihomoConfig.hosts = patch.hosts } @@ -45,12 +29,37 @@ export async function patchControledMihomoConfig(patch: Partial): controledMihomoConfig.dns['nameserver-policy'] = patch.dns['nameserver-policy'] } controledMihomoConfig = deepMerge(controledMihomoConfig, patch) + + // 覆写开关控制 + let configForProfile = { ...controledMihomoConfig } + + if (!controlDns) { + delete configForProfile.dns + delete configForProfile.hosts + } else { + if (configForProfile.dns?.ipv6 === undefined) { + configForProfile.dns = defaultControledMihomoConfig.dns + } + } + if (!controlSniff) { + delete configForProfile.sniffer + } else { + if (!configForProfile.sniffer) { + configForProfile.sniffer = defaultControledMihomoConfig.sniffer + } + } + if (!useNameserverPolicy) { - delete controledMihomoConfig?.dns?.['nameserver-policy'] + delete configForProfile?.dns?.['nameserver-policy'] } if (process.platform === 'darwin') { - delete controledMihomoConfig?.tun?.device + delete configForProfile?.tun?.device } + + const originalConfig = controledMihomoConfig + controledMihomoConfig = configForProfile await generateProfile() + controledMihomoConfig = originalConfig + await writeFile(controledMihomoConfigPath(), yaml.stringify(controledMihomoConfig), 'utf-8') } diff --git a/src/renderer/src/locales/en-US.json b/src/renderer/src/locales/en-US.json index 1be43c9..afe79b2 100644 --- a/src/renderer/src/locales/en-US.json +++ b/src/renderer/src/locales/en-US.json @@ -285,6 +285,7 @@ "sniffer.skipDstAddress.placeholder": "Example: 1.1.1.1/32", "sniffer.skipSrcAddress.title": "Skip Source Address Sniffing", "sniffer.skipSrcAddress.placeholder": "Example: 192.168.1.1/24", + "sniffer.saveOnly": "Save Only", "sysproxy.title": "System Proxy", "sysproxy.host.title": "Proxy Host", "sysproxy.host.placeholder": "Default 127.0.0.1, do not modify unless necessary", @@ -343,6 +344,7 @@ "dns.customHosts.list": "Hosts List", "dns.customHosts.domainPlaceholder": "Domain", "dns.customHosts.valuePlaceholder": "Domain or IP", + "dns.saveOnly": "Save Only", "profiles.title": "Profile Management", "profiles.updateAll": "Update All Profiles", "profiles.useProxy": "Proxy", diff --git a/src/renderer/src/locales/fa-IR.json b/src/renderer/src/locales/fa-IR.json index b873ecd..3ccee90 100644 --- a/src/renderer/src/locales/fa-IR.json +++ b/src/renderer/src/locales/fa-IR.json @@ -276,6 +276,7 @@ "sniffer.skipDstAddress.placeholder": "مثال: 1.1.1.1/32", "sniffer.skipSrcAddress.title": "رد کردن تشخیص آدرس مبدا", "sniffer.skipSrcAddress.placeholder": "مثال: 192.168.1.1/24", + "sniffer.saveOnly": "فقط ذخیره", "sysproxy.title": "پراکسی سیستم", "sysproxy.host.title": "میزبان پراکسی", "sysproxy.host.placeholder": "پیش‌فرض 127.0.0.1، در صورت عدم نیاز تغییر ندهید", @@ -334,6 +335,7 @@ "dns.customHosts.list": "لیست Hosts", "dns.customHosts.domainPlaceholder": "دامنه", "dns.customHosts.valuePlaceholder": "دامنه یا IP", + "dns.saveOnly": "فقط ذخیره", "profiles.title": "مدیریت پروفایل", "profiles.updateAll": "به‌روزرسانی همه پروفایل‌ها", "profiles.useProxy": "پراکسی", diff --git a/src/renderer/src/locales/ru-RU.json b/src/renderer/src/locales/ru-RU.json index f64b09d..84bb8bb 100644 --- a/src/renderer/src/locales/ru-RU.json +++ b/src/renderer/src/locales/ru-RU.json @@ -276,6 +276,7 @@ "sniffer.skipDstAddress.placeholder": "Пример: 1.1.1.1/32", "sniffer.skipSrcAddress.title": "Пропустить анализ исходных адресов", "sniffer.skipSrcAddress.placeholder": "Пример: 192.168.1.1/24", + "sniffer.saveOnly": "Только сохранить", "sysproxy.title": "Системный прокси", "sysproxy.host.title": "Хост прокси", "sysproxy.host.placeholder": "По умолчанию 127.0.0.1, не изменяйте без необходимости", @@ -334,6 +335,7 @@ "dns.customHosts.list": "Список Hosts", "dns.customHosts.domainPlaceholder": "Домен", "dns.customHosts.valuePlaceholder": "Домен или IP", + "dns.saveOnly": "Только сохранить", "profiles.title": "Управление профилями", "profiles.updateAll": "Обновить все профили", "profiles.useProxy": "Прокси", diff --git a/src/renderer/src/locales/zh-CN.json b/src/renderer/src/locales/zh-CN.json index 5e72336..c114f5f 100644 --- a/src/renderer/src/locales/zh-CN.json +++ b/src/renderer/src/locales/zh-CN.json @@ -285,6 +285,7 @@ "sniffer.skipDstAddress.placeholder": "例:1.1.1.1/32", "sniffer.skipSrcAddress.title": "跳过来源地址嗅探", "sniffer.skipSrcAddress.placeholder": "例:192.168.1.1/24", + "sniffer.saveOnly": "仅保存", "sysproxy.title": "系统代理", "sysproxy.host.title": "代理主机", "sysproxy.host.placeholder": "默认 127.0.0.1 若无特殊需求请勿修改", @@ -343,6 +344,7 @@ "dns.customHosts.list": "Hosts 列表", "dns.customHosts.domainPlaceholder": "域名", "dns.customHosts.valuePlaceholder": "域名或 IP", + "dns.saveOnly": "仅保存", "profiles.title": "订阅管理", "profiles.updateAll": "更新全部订阅", "profiles.useProxy": "代理", diff --git a/src/renderer/src/pages/dns.tsx b/src/renderer/src/pages/dns.tsx index 0ac56b4..364ec1e 100644 --- a/src/renderer/src/pages/dns.tsx +++ b/src/renderer/src/pages/dns.tsx @@ -13,7 +13,7 @@ const DNS: React.FC = () => { const { t } = useTranslation() const { controledMihomoConfig, patchControledMihomoConfig } = useControledMihomoConfig() const { appConfig, patchAppConfig } = useAppConfig() - const { nameserverPolicy, useNameserverPolicy } = appConfig || {} + const { nameserverPolicy, useNameserverPolicy, controlDns = true } = appConfig || {} const { dns, hosts } = controledMihomoConfig || {} const { enable = true, @@ -128,8 +128,10 @@ const DNS: React.FC = () => { try { setChanged(false) await patchControledMihomoConfig(patch) - await patchMihomoConfig(patch) - await restartCore() + if (controlDns) { + await patchMihomoConfig(patch) + await restartCore() + } } catch (e) { alert(e) } @@ -175,7 +177,7 @@ const DNS: React.FC = () => { onSave(result) }} > - {t('common.save')} + {controlDns ? t('common.save') : t('dns.saveOnly')} ) } diff --git a/src/renderer/src/pages/sniffer.tsx b/src/renderer/src/pages/sniffer.tsx index a8591c7..3bf13c6 100644 --- a/src/renderer/src/pages/sniffer.tsx +++ b/src/renderer/src/pages/sniffer.tsx @@ -3,7 +3,8 @@ import BasePage from '@renderer/components/base/base-page' import SettingCard from '@renderer/components/base/base-setting-card' import SettingItem from '@renderer/components/base/base-setting-item' import { useControledMihomoConfig } from '@renderer/hooks/use-controled-mihomo-config' -import { restartCore } from '@renderer/utils/ipc' +import { useAppConfig } from '@renderer/hooks/use-app-config' +import { restartCore, patchMihomoConfig } from '@renderer/utils/ipc' import React, { ReactNode, useState } from 'react' import { MdDeleteForever } from 'react-icons/md' import { useTranslation } from 'react-i18next' @@ -11,6 +12,8 @@ import { useTranslation } from 'react-i18next' const Sniffer: React.FC = () => { const { t } = useTranslation() const { controledMihomoConfig, patchControledMihomoConfig } = useControledMihomoConfig() + const { appConfig } = useAppConfig() + const { controlSniff = true } = appConfig || {} const { sniffer } = controledMihomoConfig || {} const { enable = true, @@ -42,6 +45,7 @@ const Sniffer: React.FC = () => { } = sniffer || {} const [changed, setChanged] = useState(false) const [values, originSetValues] = useState({ + enable, parsePureIP, forceDNSMapping, overrideDestination, @@ -60,16 +64,11 @@ const Sniffer: React.FC = () => { try { setChanged(false) await patchControledMihomoConfig(patch) - await restartCore() - } catch (e) { - alert(e) - } - } - const onEnableChange = async (enable: boolean): Promise => { - try { - await patchControledMihomoConfig({ sniffer: { enable } }) - await restartCore() + if (controlSniff) { + await patchMihomoConfig(patch) + await restartCore() + } } catch (e) { alert(e) } @@ -140,17 +139,20 @@ const Sniffer: React.FC = () => { onPress={() => onSave({ sniffer: { + enable: values.enable, 'parse-pure-ip': values.parsePureIP, 'force-dns-mapping': values.forceDNSMapping, 'override-destination': values.overrideDestination, sniff: values.sniff, 'skip-domain': values.skipDomain, - 'force-domain': values.forceDomain + 'force-domain': values.forceDomain, + 'skip-dst-address': values.skipDstAddress, + 'skip-src-address': values.skipSrcAddress } }) } > - {t('common.save')} + {controlSniff ? t('common.save') : t('sniffer.saveOnly')} ) } @@ -159,8 +161,10 @@ const Sniffer: React.FC = () => { { + setValues({ ...values, enable: v }) + }} />