diff --git a/changelog.md b/changelog.md index 68ff929..dba073c 100644 --- a/changelog.md +++ b/changelog.md @@ -1,9 +1,12 @@ ## 1.8.5 +**本次更新增加了大家期待已久的托盘图标根据代理状态实时变化颜色,系统代理为蓝色,虚拟网卡为绿色,双开为红色;完善 Smart 规则写,当原有规则中有 url-test 和 load-balance 组时,自动替换为 Smart 规则组;当没有 url-test 和 load-balance 时,增加 全局 Smart 规则组,接管全部流量** + ### 新功能 (Feat) - 支持 cron 表达式以自定义订阅更新频率(#766) - 修复权限检查并优化TUN与自启联动(#977) - 托盘图标能根据代理状态实时变化颜色 + - 更健壮完善的 Smart 覆写规则 ### 修复 (Fix) - Windows 下当前运行内核权限检测(之前没有正确检测管理员权限运行的内核) - Windows 下 开机自启 按钮卡顿问题 隐藏运行黑框 现在申请权限会弹通知 diff --git a/src/main/config/smartOverride.ts b/src/main/config/smartOverride.ts index ec8a58c..8b6e9e2 100644 --- a/src/main/config/smartOverride.ts +++ b/src/main/config/smartOverride.ts @@ -30,6 +30,124 @@ function main(config) { config['proxy-groups'] = [] } + // 首先检查是否存在 url-test 或 load-balance 代理组 + let hasUrlTestOrLoadBalance = false + for (let i = 0; i < config['proxy-groups'].length; i++) { + const group = config['proxy-groups'][i] + if (group && group.type) { + const groupType = group.type.toLowerCase() + if (groupType === 'url-test' || groupType === 'load-balance') { + hasUrlTestOrLoadBalance = true + break + } + } + } + + // 如果存在 url-test 或 load-balance 代理组,只进行类型转换 + if (hasUrlTestOrLoadBalance) { + console.log('[Smart Override] Found url-test or load-balance groups, converting to smart type') + + // 记录需要更新引用的代理组名称映射 + const nameMapping = new Map() + + for (let i = 0; i < config['proxy-groups'].length; i++) { + const group = config['proxy-groups'][i] + if (group && group.type) { + const groupType = group.type.toLowerCase() + if (groupType === 'url-test' || groupType === 'load-balance') { + console.log('[Smart Override] Converting group:', group.name, 'from', group.type, 'to smart') + + // 记录原名称和新名称的映射关系 + const originalName = group.name + + // 保留原有配置,只修改 type 和添加 Smart 特有配置 + group.type = 'smart' + + // 为代理组名称添加 (Smart Group) 后缀 + if (group.name && !group.name.includes('(Smart Group)')) { + group.name = group.name + '(Smart Group)' + nameMapping.set(originalName, group.name) + } + + // 添加 Smart 特有配置 + if (!group['policy-priority']) { + group['policy-priority'] = '' // policy-priority: <1 means lower priority, >1 means higher priority, the default is 1, pattern support regex and string + } + group.uselightgbm = ${useLightGBM} + group.collectdata = ${collectData} + group.strategy = '${strategy}' + + // 移除 url-test 和 load-balance 特有的配置 + if (group.url) delete group.url + if (group.interval) delete group.interval + if (group.tolerance) delete group.tolerance + if (group.lazy) delete group.lazy + if (group.expected_status) delete group['expected-status'] + } + } + } + + // 更新配置文件中其他位置对代理组名称的引用 + if (nameMapping.size > 0) { + console.log('[Smart Override] Updating references to renamed groups:', Array.from(nameMapping.entries())) + + // 更新代理组中的 proxies 字段引用 + if (config['proxy-groups'] && Array.isArray(config['proxy-groups'])) { + config['proxy-groups'].forEach(group => { + if (group && group.proxies && Array.isArray(group.proxies)) { + group.proxies = group.proxies.map(proxyName => { + if (nameMapping.has(proxyName)) { + console.log('[Smart Override] Updated proxy reference:', proxyName, '→', nameMapping.get(proxyName)) + return nameMapping.get(proxyName) + } + return proxyName + }) + } + }) + } + + // 更新规则中的代理组引用 + if (config.rules && Array.isArray(config.rules)) { + config.rules = config.rules.map(rule => { + if (typeof rule === 'string') { + let updatedRule = rule + nameMapping.forEach((newName, oldName) => { + // 使用简单的字符串替换,检查是否完全匹配 + if (updatedRule.includes(oldName)) { + updatedRule = updatedRule.split(oldName).join(newName) + console.log('[Smart Override] Updated rule reference:', oldName, '→', newName) + } + }) + return updatedRule + } else if (typeof rule === 'object' && rule !== null) { + // 处理对象格式的规则 + ['target', 'proxy'].forEach(field => { + if (rule[field] && nameMapping.has(rule[field])) { + console.log('[Smart Override] Updated rule object reference:', rule[field], '→', nameMapping.get(rule[field])) + rule[field] = nameMapping.get(rule[field]) + } + }) + } + return rule + }) + } + + // 更新其他可能的配置字段引用 + ['mode', 'proxy-mode'].forEach(field => { + if (config[field] && nameMapping.has(config[field])) { + console.log('[Smart Override] Updated config field', field + ':', config[field], '→', nameMapping.get(config[field])) + config[field] = nameMapping.get(config[field]) + } + }) + } + + console.log('[Smart Override] Conversion completed, skipping other operations') + return config + } + + // 如果没有 url-test 或 load-balance 代理组,执行原有逻辑 + console.log('[Smart Override] No url-test or load-balance groups found, executing original logic') + // 查找现有的 Smart 代理组并更新 let smartGroupExists = false for (let i = 0; i < config['proxy-groups'].length; i++) { diff --git a/src/renderer/src/locales/en-US.json b/src/renderer/src/locales/en-US.json index 9466f78..3a0ff6d 100644 --- a/src/renderer/src/locales/en-US.json +++ b/src/renderer/src/locales/en-US.json @@ -121,7 +121,7 @@ "mihomo.smartVersion": "Smart", "mihomo.enableSmartCore": "Enable Smart Core", "mihomo.enableSmartOverride": "Use Auto Smart Rule Override", - "mihomo.smartOverrideTooltip": "Use Party's built-in smart override script to extract all nodes from subscriptions and replace default rules. Perfect for users who don't want to tinker, one-click functionality; if using global mode, please select the node named 'Smart Group'", + "mihomo.smartOverrideTooltip": "Use the built-in smart override script in Party to replace url-test and load-balance with the Smart rule group; if the above rule groups are not present, extract all nodes from the subscription and replace the default rules, suitable for users who don’t want to hassle, with the feature taking effect with one click; if using global mode, please select the node named 'Smart Group.'", "mihomo.smartCoreUseLightGBM": "Use LightGBM", "mihomo.smartCoreCollectData": "Collect Data", "mihomo.smartCoreStrategy": "Strategy Mode", diff --git a/src/renderer/src/locales/zh-CN.json b/src/renderer/src/locales/zh-CN.json index 63617aa..fd059d7 100644 --- a/src/renderer/src/locales/zh-CN.json +++ b/src/renderer/src/locales/zh-CN.json @@ -121,7 +121,7 @@ "mihomo.smartVersion": "Smart 版", "mihomo.enableSmartCore": "启用 Smart 内核", "mihomo.enableSmartOverride": "使用自动 Smart 规则覆写", - "mihomo.smartOverrideTooltip": "使用 Party 自带的智能覆写脚本,提取订阅中的所有节点,并替换默认规则,适合不想折腾的用户,功能一键生效;如果使用全局模式,请选择名称为“Smart Group 的节点", + "mihomo.smartOverrideTooltip": "使用 Party 自带的智能覆写脚本,替换 url-test 和 load-balance 为 Smart 规则组;如果没有上述规则组,则提取订阅中的所有节点,并替换默认规则,适合不想折腾的用户,功能一键生效;如果使用全局模式,请选择名称为“Smart Group 的节点", "mihomo.smartCoreUseLightGBM": "使用 LightGBM", "mihomo.smartCoreCollectData": "收集数据", "mihomo.smartCoreStrategy": "策略模式",