refactor: Sniffing module with override logic

This commit is contained in:
ezequielnick 2025-08-06 13:25:57 +08:00
parent 0a064bdbb8
commit 58e0925c5b
7 changed files with 42 additions and 33 deletions

View File

@ -4,7 +4,7 @@ import SettingItem from '../base/base-setting-item'
import { Button, Input, Select, SelectItem, Switch, Tooltip } from '@heroui/react'
import { useAppConfig } from '@renderer/hooks/use-app-config'
import debounce from '@renderer/utils/debounce'
import { getGistUrl, patchControledMihomoConfig, restartCore } from '@renderer/utils/ipc'
import { getGistUrl, restartCore } from '@renderer/utils/ipc'
import { MdDeleteForever } from 'react-icons/md'
import { BiCopy } from 'react-icons/bi'
import { IoIosHelpCircle } from 'react-icons/io'
@ -16,7 +16,6 @@ const MihomoConfig: React.FC = () => {
const { appConfig, patchAppConfig } = useAppConfig()
const {
diffWorkDir = false,
controlSniff = true,
delayTestConcurrency,
delayTestTimeout,
githubToken = '',
@ -193,21 +192,7 @@ const MihomoConfig: React.FC = () => {
/>
</SettingItem>
<SettingItem title={t('mihomo.controlSniff')} divider>
<Switch
size="sm"
isSelected={controlSniff}
onValueChange={async (v) => {
try {
await patchAppConfig({ controlSniff: v })
await patchControledMihomoConfig({})
await restartCore()
} catch (e) {
alert(e)
}
}}
/>
</SettingItem>
<SettingItem title={t('mihomo.autoCloseConnection')} divider>
<Switch
size="sm"

View File

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

View File

@ -216,7 +216,7 @@
"sider.cards.connections": "Connections",
"sider.cards.core": "Core Settings",
"sider.cards.dns": "DNS Override",
"sider.cards.sniff": "Sniffing",
"sider.cards.sniff": "Sniff OVRD",
"sider.cards.logs": "Logs",
"sider.cards.substore": "Sub-Store",
"sider.cards.config": "Runtime Config",
@ -269,6 +269,7 @@
"proxies.search.placeholder": "Search Proxies",
"proxies.locate": "Locate Current Proxy",
"sniffer.title": "Domain Sniffing Settings",
"sniffer.enable": "Enable Domain Sniffing",
"sniffer.parsePureIP": "Sniff Unmapped IP Addresses",
"sniffer.forceDNSMapping": "Sniff Real IP Mappings",
"sniffer.overrideDestination": "Override Connection Address",

View File

@ -207,7 +207,7 @@
"sider.cards.connections": "اتصالات",
"sider.cards.core": "تنظیمات هسته",
"sider.cards.dns": "بازنویسی دی‌ان‌اس",
"sider.cards.sniff": "تشخیص دامنه",
"sider.cards.sniff": "لغو بو کشیدن",
"sider.cards.logs": "گزارش‌ها",
"sider.cards.substore": "ساب استور",
"sider.cards.config": "پیکربندی اجرا",
@ -260,6 +260,7 @@
"proxies.search.placeholder": "جستجوی پراکسی‌ها",
"proxies.locate": "یافتن پراکسی فعلی",
"sniffer.title": "تنظیمات تشخیص دامنه",
"sniffer.enable": "فعال کردن قابلیت شنود دامنه",
"sniffer.parsePureIP": "تشخیص آدرس‌های IP بدون نگاشت",
"sniffer.forceDNSMapping": "تشخیص نگاشت‌های IP واقعی",
"sniffer.overrideDestination": "جایگزینی آدرس اتصال",

View File

@ -207,7 +207,7 @@
"sider.cards.connections": "Подключения",
"sider.cards.core": "Настройки ядра",
"sider.cards.dns": "Переопределение DNS",
"sider.cards.sniff": "Анализ трафика",
"sider.cards.sniff": "переопределение сниффинга",
"sider.cards.logs": "Журналы",
"sider.cards.substore": "Sub-Store",
"sider.cards.config": "Конфигурация",
@ -260,6 +260,7 @@
"proxies.search.placeholder": "Поиск прокси",
"proxies.locate": "Найти текущий прокси",
"sniffer.title": "Настройки анализа доменов",
"sniffer.enable": "Включить анализ домена",
"sniffer.parsePureIP": "Анализировать немаппированные IP-адреса",
"sniffer.forceDNSMapping": "Анализировать реальные IP-маппинги",
"sniffer.overrideDestination": "Переопределить адрес подключения",

View File

@ -216,7 +216,7 @@
"sider.cards.connections": "连接",
"sider.cards.core": "内核设置",
"sider.cards.dns": "DNS覆写",
"sider.cards.sniff": "域名嗅探",
"sider.cards.sniff": "嗅探覆写",
"sider.cards.logs": "日志",
"sider.cards.substore": "Sub-Store",
"sider.cards.config": "运行时配置",
@ -269,6 +269,7 @@
"proxies.search.placeholder": "搜索节点",
"proxies.locate": "定位到当前节点",
"sniffer.title": "域名嗅探设置",
"sniffer.enable": "启用域名嗅探",
"sniffer.parsePureIP": "对未映射 IP 地址嗅探",
"sniffer.forceDNSMapping": "对真实 IP 映射嗅探",
"sniffer.overrideDestination": "覆盖连接地址",

View File

@ -13,6 +13,7 @@ const Sniffer: React.FC = () => {
const { controledMihomoConfig, patchControledMihomoConfig } = useControledMihomoConfig()
const { sniffer } = controledMihomoConfig || {}
const {
enable = true,
'parse-pure-ip': parsePureIP = true,
'force-dns-mapping': forceDNSMapping = true,
'override-destination': overrideDestination = false,
@ -65,6 +66,15 @@ const Sniffer: React.FC = () => {
}
}
const onEnableChange = async (enable: boolean): Promise<void> => {
try {
await patchControledMihomoConfig({ sniffer: { enable } })
await restartCore()
} catch (e) {
alert(e)
}
}
const handleSniffPortChange = (protocol: keyof typeof sniff, value: string): void => {
setValues({
...values,
@ -146,6 +156,13 @@ const Sniffer: React.FC = () => {
}
>
<SettingCard>
<SettingItem title={t('sniffer.enable')} divider>
<Switch
size="sm"
isSelected={enable}
onValueChange={onEnableChange}
/>
</SettingItem>
<SettingItem title={t('sniffer.overrideDestination')} divider>
<Switch
size="sm"