refactor: DNS control module with override logic

This commit is contained in:
ezequielnick 2025-08-05 13:24:21 +08:00
parent 10b7c5c851
commit b1871591c0
8 changed files with 45 additions and 43 deletions

View File

@ -79,6 +79,7 @@ export const defaultControledMihomoConfig: Partial<IMihomoConfig> = {
'fake-ip-filter': ['*', '+.lan', '+.local', 'time.*.com', 'ntp.*.com', '+.market.xiaomi.com'],
'use-hosts': false,
'use-system-hosts': false,
'default-nameserver': ['tls://223.5.5.5'],
nameserver: ['https://120.53.53.53/dns-query', 'https://223.5.5.5/dns-query'],
'proxy-server-nameserver': ['https://120.53.53.53/dns-query', 'https://223.5.5.5/dns-query'],
'direct-nameserver': []

View File

@ -16,7 +16,6 @@ const MihomoConfig: React.FC = () => {
const { appConfig, patchAppConfig } = useAppConfig()
const {
diffWorkDir = false,
controlDns = true,
controlSniff = true,
delayTestConcurrency,
delayTestTimeout,
@ -193,21 +192,7 @@ const MihomoConfig: React.FC = () => {
}}
/>
</SettingItem>
<SettingItem title={t('mihomo.controlDns')} divider>
<Switch
size="sm"
isSelected={controlDns}
onValueChange={async (v) => {
try {
await patchAppConfig({ controlDns: v })
await patchControledMihomoConfig({})
await restartCore()
} catch (e) {
alert(e)
}
}}
/>
</SettingItem>
<SettingItem title={t('mihomo.controlSniff')} divider>
<Switch
size="sm"

View File

@ -3,7 +3,7 @@ import { useControledMihomoConfig } from '@renderer/hooks/use-controled-mihomo-c
import BorderSwitch from '@renderer/components/base/border-swtich'
import { LuServer } from 'react-icons/lu'
import { useLocation, useNavigate } from 'react-router-dom'
import { patchMihomoConfig } from '@renderer/utils/ipc'
import { restartCore } from '@renderer/utils/ipc'
import { useSortable } from '@dnd-kit/sortable'
import { CSS } from '@dnd-kit/utilities'
import { useAppConfig } from '@renderer/hooks/use-app-config'
@ -15,15 +15,13 @@ interface Props {
}
const DNSCard: React.FC<Props> = (props) => {
const { t } = useTranslation()
const { appConfig } = useAppConfig()
const { appConfig, patchAppConfig } = useAppConfig()
const { iconOnly } = props
const { dnsCardStatus = 'col-span-1', controlDns = true } = appConfig || {}
const location = useLocation()
const navigate = useNavigate()
const match = location.pathname.includes('/dns')
const { controledMihomoConfig, patchControledMihomoConfig } = useControledMihomoConfig()
const { dns, tun } = controledMihomoConfig || {}
const { enable = true } = dns || {}
const { patchControledMihomoConfig } = useControledMihomoConfig()
const {
attributes,
listeners,
@ -35,14 +33,19 @@ const DNSCard: React.FC<Props> = (props) => {
id: 'dns'
})
const transform = tf ? { x: tf.x, y: tf.y, scaleX: 1, scaleY: 1 } : null
const onChange = async (enable: boolean): Promise<void> => {
await patchControledMihomoConfig({ dns: { enable } })
await patchMihomoConfig({ dns: { enable } })
const onChange = async (controlDns: boolean): Promise<void> => {
try {
await patchAppConfig({ controlDns })
await patchControledMihomoConfig({})
await restartCore()
} catch (e) {
alert(e)
}
}
if (iconOnly) {
return (
<div className={`${dnsCardStatus} ${!controlDns ? 'hidden' : ''} flex justify-center`}>
<div className={`${dnsCardStatus} flex justify-center`}>
<Tooltip content={t('sider.cards.dns')} placement="right">
<Button
size="sm"
@ -68,7 +71,7 @@ const DNSCard: React.FC<Props> = (props) => {
transition,
zIndex: isDragging ? 'calc(infinity)' : undefined
}}
className={`${dnsCardStatus} ${!controlDns ? 'hidden' : ''} dns-card`}
className={`${dnsCardStatus} dns-card`}
>
<Card
fullWidth
@ -90,9 +93,9 @@ const DNSCard: React.FC<Props> = (props) => {
/>
</Button>
<BorderSwitch
isShowBorder={match && enable}
isSelected={enable}
isDisabled={tun?.enable}
isShowBorder={match && controlDns}
isSelected={controlDns}
isDisabled={false}
onValueChange={onChange}
/>
</div>

View File

@ -98,7 +98,6 @@
"mihomo.cpuPriority.low": "Low",
"mihomo.workDir.title": "Separate Work Directory for Different Subscriptions",
"mihomo.workDir.tooltip": "Enable to avoid conflicts when different subscriptions have proxy groups with the same name",
"mihomo.controlDns": "Control DNS Settings",
"mihomo.controlSniff": "Control Domain Sniffing",
"mihomo.autoCloseConnection": "Auto Close Connection",
"mihomo.pauseSSID.title": "Direct Connection for Specific WiFi SSIDs",
@ -216,7 +215,7 @@
"sider.cards.override": "Override",
"sider.cards.connections": "Connections",
"sider.cards.core": "Core Settings",
"sider.cards.dns": "DNS",
"sider.cards.dns": "DNS Override",
"sider.cards.sniff": "Sniffing",
"sider.cards.logs": "Logs",
"sider.cards.substore": "Sub-Store",
@ -316,6 +315,7 @@
"tun.notifications.firewallResetSuccess": "Firewall Reset Successful",
"tun.error.tunPermissionDenied": "TUN interface start failed, please try to manually grant core permissions",
"dns.title": "DNS Settings",
"dns.enable": "Enable DNS",
"dns.enhancedMode.title": "Domain Mapping Mode",
"dns.enhancedMode.fakeIp": "Fake IP",
"dns.enhancedMode.redirHost": "Real IP",
@ -512,8 +512,8 @@
"guide.tunSetting.description": "Here you can modify virtual network card settings. Mihomo Party has theoretically solved all permission issues. If your virtual network card is still not working, try resetting the firewall (Windows) or manually authorizing the core (MacOS/Linux) and then restart the core.",
"guide.override.title": "Override",
"guide.override.description": "Mihomo Party provides powerful override functionality to customize your imported subscription configurations, such as adding rules and customizing proxy groups. You can directly import override files written by others or write your own. <b>Remember to enable the override file on the subscription you want to override</b>. For override file syntax, please refer to the <a href=\"https://mihomo.party/docs/guide/override\" target=\"_blank\">official documentation</a>.",
"guide.dns.title": "DNS",
"guide.dns.description": "The software takes control of the core's DNS settings by default. If you need to use the DNS settings from your subscription configuration, you can disable 'Control DNS Settings' in the application settings. The same applies to domain sniffing.",
"guide.dns.title": "DNS OVRD",
"guide.dns.description": "The software defaults to using the application's DNS settings to override the subscription configuration. If you need to use the DNS settings from the subscription configuration, please disable this feature. The same applies to domain sniffing.",
"guide.end.title": "Tutorial Complete",
"guide.end.description": "Now that you understand the basic usage of the software, import your subscription and start using it. Enjoy!\nYou can also join our official <a href=\"https://t.me/mihomo_party_group\" target=\"_blank\">Telegram group</a> for the latest news."
}

View File

@ -101,7 +101,6 @@
"mihomo.cpuPriority.low": "پایین",
"mihomo.workDir.title": "استفاده از پوشه کاری مجزا برای اشتراک‌های مختلف",
"mihomo.workDir.tooltip": "برای جلوگیری از تداخل گروه‌های پراکسی با نام یکسان در اشتراک‌های مختلف",
"mihomo.controlDns": "کنترل تنظیمات DNS",
"mihomo.controlSniff": "کنترل تشخیص دامنه",
"mihomo.autoCloseConnection": "بستن خودکار اتصال",
"mihomo.pauseSSID.title": "اتصال مستقیم برای SSIDهای خاص",
@ -207,7 +206,7 @@
"sider.cards.override": "جایگزینی",
"sider.cards.connections": "اتصالات",
"sider.cards.core": "تنظیمات هسته",
"sider.cards.dns": "DNS",
"sider.cards.dns": "بازنویسی دی‌ان‌اس",
"sider.cards.sniff": "تشخیص دامنه",
"sider.cards.logs": "گزارش‌ها",
"sider.cards.substore": "ساب استور",
@ -307,6 +306,7 @@
"tun.notifications.firewallResetSuccess": "بازنشانی دیوار آتش با موفقیت انجام شد",
"tun.error.tunPermissionDenied": "راه‌اندازی رابط TUN با شکست مواجه شد، لطفا به صورت دستی به هسته مجوز دهید",
"dns.title": "تنظیمات DNS",
"dns.enable": "فعال‌سازی DNS",
"dns.enhancedMode.title": "حالت نگاشت دامنه",
"dns.enhancedMode.fakeIp": "IP جعلی",
"dns.enhancedMode.redirHost": "IP واقعی",
@ -504,7 +504,7 @@
"guide.override.title": "Override",
"guide.override.description": "میهومو پارتی قابلیت‌های قدرتمند جایگزینی را برای سفارشی‌سازی پیکربندی‌های اشتراک وارد شده، مانند افزودن قوانین و سفارشی‌سازی گروه‌های پراکسی ارائه می‌دهد. می‌توانید مستقیماً فایل‌های جایگزینی نوشته شده توسط دیگران را وارد کنید یا فایل‌های خود را بنویسید. <b>فراموش نکنید که فایل جایگزینی را روی اشتراکی که می‌خواهید جایگزین کنید فعال کنید</b>. برای نحو فایل جایگزینی، لطفاً به <a href=\"https://mihomo.party/docs/guide/override\" target=\"_blank\">مستندات رسمی</a> مراجعه کنید.",
"guide.dns.title": "DNS",
"guide.dns.description": "نرم‌افزار به طور پیش‌فرض کنترل تنظیمات DNS هسته را در دست می‌گیرد. اگر نیاز دارید از تنظیمات DNS پیکربندی اشتراک خود استفاده کنید، می‌توانید 'کنترل تنظیمات DNS' را در تنظیمات برنامه غیرفعال کنید. همین مورد برای تشخیص دامنه نیز صدق می‌کند.",
"guide.dns.description": "نرم‌افزار به‌طور پیش‌فرض از تنظیمات DNS برنامه برای بازنویسی پیکربندی اشتراک استفاده می‌کند. اگر نیاز به استفاده از تنظیمات DNS موجود در پیکربندی اشتراک دارید، لطفاً این قابلیت را غیرفعال کنید. همین موضوع برای شناسایی دامنه نیز صدق می‌کند.",
"guide.end.title": "پایان آموزش",
"guide.end.description": "اکنون که با استفاده اساسی از نرم‌افزار آشنا شدید، اشتراک خود را وارد کنید و از آن استفاده کنید. لذت ببرید!\nهمچنین می‌توانید برای آخرین اخبار به <a href=\"https://t.me/mihomo_party_group\" target=\"_blank\">گروه تلگرام</a> ما بپیوندید."
}

View File

@ -101,7 +101,6 @@
"mihomo.cpuPriority.low": "Низкий",
"mihomo.workDir.title": "Отдельные рабочие каталоги для разных подписок",
"mihomo.workDir.tooltip": "Включите для избежания конфликтов при наличии групп прокси с одинаковыми именами в разных подписках",
"mihomo.controlDns": "Управление настройками DNS",
"mihomo.controlSniff": "Управление сниффингом доменов",
"mihomo.autoCloseConnection": "Автозакрытие соединений",
"mihomo.pauseSSID.title": "Прямое подключение для определённых WiFi SSID",
@ -207,7 +206,7 @@
"sider.cards.override": "Переопределения",
"sider.cards.connections": "Подключения",
"sider.cards.core": "Настройки ядра",
"sider.cards.dns": "DNS",
"sider.cards.dns": "Переопределение DNS",
"sider.cards.sniff": "Анализ трафика",
"sider.cards.logs": "Журналы",
"sider.cards.substore": "Sub-Store",
@ -307,6 +306,7 @@
"tun.notifications.firewallResetSuccess": "Брандмауэр успешно сброшен",
"tun.error.tunPermissionDenied": "Ошибка запуска TUN, попробуйте вручную предоставить разрешения ядру",
"dns.title": "Настройки DNS",
"dns.enable": "Включить DNS",
"dns.enhancedMode.title": "Режим маппинга доменов",
"dns.enhancedMode.fakeIp": "Фиктивный IP",
"dns.enhancedMode.redirHost": "Реальный IP",
@ -504,7 +504,7 @@
"guide.override.title": "Переопределение",
"guide.override.description": "Mihomo Party предоставляет мощную функцию переопределения для настройки импортированных конфигураций подписки, таких как добавление правил и настройка групп прокси. Вы можете напрямую импортировать файлы переопределения, написанные другими, или написать свои собственные. <b>Не забудьте включить файл переопределения для подписки, которую вы хотите переопределить</b>. Синтаксис файла переопределения см. в <a href=\"https://mihomo.party/docs/guide/override\" target=\"_blank\">официальной документации</a>.",
"guide.dns.title": "DNS",
"guide.dns.description": о умолчанию программа контролирует настройки DNS ядра. Если вам нужно использовать настройки DNS из конфигурации подписки, вы можете отключить 'Контроль настроек DNS' в настройках приложения. То же самое относится к сниффингу доменов.",
"guide.dns.description": рограммное обеспечение по умолчанию использует настройки DNS приложения для переопределения конфигурации подписки. Если вам нужно использовать настройки DNS из конфигурации подписки, пожалуйста, отключите эту функцию. То же самое относится к определению домена.",
"guide.end.title": "Руководство завершено",
"guide.end.description": "Теперь, когда вы понимаете основы использования программы, импортируйте свою подписку и начните использовать ее. Приятного использования!\nВы также можете присоединиться к нашей официальной <a href=\"https://t.me/mihomo_party_group\" target=\"_blank\">группе Telegram</a> для получения последних новостей."
}

View File

@ -101,7 +101,6 @@
"mihomo.cpuPriority.low": "低",
"mihomo.workDir.title": "不同订阅使用独立工作目录",
"mihomo.workDir.tooltip": "启用后可避免不同订阅中存在相同名称的代理组时发生冲突",
"mihomo.controlDns": "控制 DNS 设置",
"mihomo.controlSniff": "控制域名嗅探",
"mihomo.autoCloseConnection": "自动关闭连接",
"mihomo.pauseSSID.title": "指定 WiFi SSID 直连",
@ -216,7 +215,7 @@
"sider.cards.override": "覆写",
"sider.cards.connections": "连接",
"sider.cards.core": "内核设置",
"sider.cards.dns": "DNS",
"sider.cards.dns": "DNS覆写",
"sider.cards.sniff": "域名嗅探",
"sider.cards.logs": "日志",
"sider.cards.substore": "Sub-Store",
@ -316,6 +315,7 @@
"tun.notifications.firewallResetSuccess": "防火墙重设成功",
"tun.error.tunPermissionDenied": "虚拟网卡启动失败,请尝试手动授予内核权限",
"dns.title": "DNS 设置",
"dns.enable": "启用 DNS",
"dns.enhancedMode.title": "域名映射模式",
"dns.enhancedMode.fakeIp": "虚假 IP",
"dns.enhancedMode.redirHost": "真实 IP",
@ -513,7 +513,7 @@
"guide.override.title": "覆写",
"guide.override.description": "Mihomo Party 提供强大的覆写功能,可以对您导入的订阅配置进行个性化修改,如添加规则、自定义代理组等,您可以直接导入别人写好的覆写文件,也可以自己动手编写,<b>编辑好覆写文件一定要记得在需要覆写的订阅上启用</b>,覆写文件的语法请参考 <a href=\"https://mihomo.party/docs/guide/override\" target=\"_blank\">官方文档</a>",
"guide.dns.title": "DNS",
"guide.dns.description": "软件默认接管了内核的 DNS 设置,如果您需要使用订阅配置中的 DNS 设置,可以到应用设置中关闭\"接管 DNS 设置\",域名嗅探同理",
"guide.dns.description": "软件默认使用应用的 DNS 设置覆盖订阅配置,如果您需要使用订阅配置中的 DNS 设置,请关闭此功能,域名嗅探同理",
"guide.end.title": "教程结束",
"guide.end.description": "现在您已经了解了软件的基本用法,导入您的订阅开始使用吧,祝您使用愉快!\n您还可以加入我们的官方 <a href=\"https://t.me/mihomo_party_group\" target=\"_blank\">Telegram 群组</a> 获取最新资讯"
}

View File

@ -5,7 +5,7 @@ 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 { useAppConfig } from '@renderer/hooks/use-app-config'
import { restartCore } from '@renderer/utils/ipc'
import { restartCore, patchMihomoConfig } from '@renderer/utils/ipc'
import React, { Key, ReactNode, useState } from 'react'
import { useTranslation } from 'react-i18next'
@ -16,6 +16,7 @@ const DNS: React.FC = () => {
const { nameserverPolicy, useNameserverPolicy } = appConfig || {}
const { dns, hosts } = controledMihomoConfig || {}
const {
enable = true,
ipv6 = false,
'fake-ip-range': fakeIPRange = '198.18.0.1/16',
'fake-ip-filter': fakeIPFilter = [
@ -40,6 +41,7 @@ const DNS: React.FC = () => {
} = dns || {}
const [changed, setChanged] = useState(false)
const [values, originSetValues] = useState({
enable,
ipv6,
useHosts,
enhancedMode,
@ -126,6 +128,7 @@ const DNS: React.FC = () => {
try {
setChanged(false)
await patchControledMihomoConfig(patch)
await patchMihomoConfig(patch)
await restartCore()
} catch (e) {
alert(e)
@ -143,6 +146,7 @@ const DNS: React.FC = () => {
color="primary"
onPress={() => {
const dnsConfig = {
enable: values.enable,
ipv6: values.ipv6,
'fake-ip-range': values.fakeIPRange,
'fake-ip-filter': values.fakeIPFilter,
@ -177,6 +181,15 @@ const DNS: React.FC = () => {
}
>
<SettingCard>
<SettingItem title={t('dns.enable')} divider>
<Switch
size="sm"
isSelected={values.enable}
onValueChange={(v) => {
setValues({ ...values, enable: v })
}}
/>
</SettingItem>
<SettingItem title={t('dns.enhancedMode.title')} divider>
<Tabs
size="sm"