import '../response/kr_node_group_list.dart'; import 'kr_group_outbound_list.dart'; import '../response/kr_node_list.dart'; import 'kr_outbound_item.dart'; import 'package:flutter/foundation.dart'; /// 表示出站项列表的模型类 class KrOutboundsList { /// 服务器分组 final List groupOutboundList = []; // 存储服务器分组的列表 /// 国家分组,包含所有国家 final List countryOutboundList = []; // 存储国家分组的列表 /// 全部列表 final List allList = []; // 存储国家分组的列表 // 配置json final List> configJsonList = []; /// 标签列表 final Map keyList = {}; // 存储国家分组的列表 /// 处理出站项并将其分组 /// [list] 是要处理的出站项列表 void processOutboundItems(List list,List groupList) { final Map> tagGroups = {}; final Map> countryGroups = {}; // 用于追踪已使用的标签 final Map tagCounter = {}; for (var element in list) { // 生成唯一标签 var baseName = element.name; if (tagCounter.containsKey(baseName)) { tagCounter[baseName] = tagCounter[baseName]! + 1; element.name = "${baseName}_${tagCounter[baseName]}"; } else { tagCounter[baseName] = 0; } final KROutboundItem item = KROutboundItem(element); // 🔍 调试日志:验证 country 字段传递 if (kDebugMode) { print('🗺️ 构建节点: name="${element.name}", tag="${item.tag}", country="${item.country}"'); } if (kDebugMode) { print(' - element.country: "${element.country}"'); } if (kDebugMode) { print(' - item.country: "${item.country}"'); } if (kDebugMode) { print(' - country.isEmpty: ${item.country.isEmpty}'); } // 检查节点配置是否有效(必须包含 type 字段) if (item.config.isEmpty || !item.config.containsKey('type')) { if (kDebugMode) { print('⚠️ 跳过无效节点: ${element.name},配置为空或缺少 type 字段'); } continue; // 跳过无效节点 } allList.add(item); // 根据标签分组出站项 for (var tag in element.tags) { tagGroups.putIfAbsent(tag, () => []); tagGroups[tag]?.add(item); } // 根据国家分组出站项 countryGroups.putIfAbsent(element.country, () => []); countryGroups[element.country]?.add(item); configJsonList.add(item.config); keyList[item.tag] = item; if (kDebugMode) { print('✅ keyList["${item.tag}"] 已设置,country="${item.country}"'); } } // 生成国家自动选择虚拟节点 _generateCountryAutoNodes(countryGroups); // 将标签分组转换为 KRGroupOutboundList 并添加到 groupOutboundList for (var tag in tagGroups.keys) { final item = KRGroupOutboundList( tag: tag, outboundList: tagGroups[tag]!); for (var group in groupList) { if (item.tag == group.name) { item.icon = group.icon; break; } } groupOutboundList.add(item); // 添加标签分组到列表 } // 将国家分组转换为 KRCountryOutboundList 并添加到 countryOutboundList for (var country in countryGroups.keys) { countryOutboundList.add(KRCountryOutboundList( country: country, outboundList: countryGroups[country]!)); // 添加国家分组到列表 } } /// 生成国家自动选择虚拟节点 void _generateCountryAutoNodes(Map> countryGroups) { for (var entry in countryGroups.entries) { final country = entry.key; final nodes = entry.value; final autoTag = '${country}-auto'; if (kDebugMode) { print('🤖 生成国家自动选择节点: $autoTag, 包含 ${nodes.length} 个节点'); } // 构建 urltest 配置 final urltestConfig = { 'type': 'urltest', 'tag': autoTag, 'outbounds': nodes.map((node) => node.tag).toList(), 'url': 'https://www.google.com/generate_204', 'interval': '10m', 'tolerance': 50, "interrupt_exist_connections": true, }; // 创建虚拟节点 final virtualNode = KROutboundItem.fromVirtual(autoTag, country, urltestConfig); // 添加到各个列表 allList.add(virtualNode); keyList[autoTag] = virtualNode; // configJsonList.add(urltestConfig); if (kDebugMode) { print('✅ 生成虚拟节点: $autoTag, 配置: ${urltestConfig.toString()}'); } } } }