feat: 更改节点测速
This commit is contained in:
parent
9123d5f0e4
commit
becc03acfd
@ -1,11 +1,12 @@
|
|||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
import 'package:kaer_with_panels/app/utils/kr_log_util.dart';
|
import 'package:kaer_with_panels/app/utils/kr_log_util.dart';
|
||||||
import 'package:kaer_with_panels/app/services/kr_subscribe_service.dart';
|
import 'package:kaer_with_panels/app/services/kr_subscribe_service.dart';
|
||||||
import 'package:kaer_with_panels/app/services/singbox_imp/kr_sing_box_imp.dart';
|
import 'package:kaer_with_panels/app/services/singbox_imp/kr_sing_box_imp.dart';
|
||||||
import '../../../localization/app_translations.dart';
|
import '../../../localization/app_translations.dart';
|
||||||
import 'package:kaer_with_panels/app/modules/kr_home/controllers/kr_home_controller.dart';
|
import 'package:kaer_with_panels/app/modules/kr_home/controllers/kr_home_controller.dart';
|
||||||
|
|
||||||
class HINodeListController extends GetxController {
|
class HINodeListController extends GetxController with WidgetsBindingObserver {
|
||||||
/// 订阅服务
|
/// 订阅服务
|
||||||
final KRSubscribeService kr_subscribeService = KRSubscribeService();
|
final KRSubscribeService kr_subscribeService = KRSubscribeService();
|
||||||
|
|
||||||
@ -94,4 +95,40 @@ class HINodeListController extends GetxController {
|
|||||||
KRLogUtil.kr_i('调试模式已重置', tag: 'HINodeListController');
|
KRLogUtil.kr_i('调试模式已重置', tag: 'HINodeListController');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onInit() {
|
||||||
|
super.onInit();
|
||||||
|
WidgetsBinding.instance.addObserver(this);
|
||||||
|
ever(homeController.kr_cutTag, (tag) {
|
||||||
|
if (homeController.kr_isLatency.value) return;
|
||||||
|
KRLogUtil.kr_i('🔄 节点切换成功 - 自动触发延迟测试', tag: 'HINodeListView');
|
||||||
|
homeController.kr_urlTest();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onReady() {
|
||||||
|
super.onReady();
|
||||||
|
if (homeController.kr_isLatency.value) return;
|
||||||
|
KRLogUtil.kr_i('🔄 节点列表显示 - 自动触发延迟测试', tag: 'HINodeListView');
|
||||||
|
homeController.kr_urlTest();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void didChangeAppLifecycleState(AppLifecycleState state) {
|
||||||
|
super.didChangeAppLifecycleState(state);
|
||||||
|
// 当应用从后台切换回前台时
|
||||||
|
if (state == AppLifecycleState.resumed) {
|
||||||
|
if (homeController.kr_isLatency.value) return;
|
||||||
|
KRLogUtil.kr_i('🔄 节点列表显示 - 自动触发延迟测试', tag: 'HINodeListView');
|
||||||
|
homeController.kr_urlTest();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onClose() {
|
||||||
|
WidgetsBinding.instance.removeObserver(this);
|
||||||
|
super.onClose();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -84,16 +84,9 @@ class HINodeListView extends GetView<HINodeListController> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 构建国家/地区分组列表
|
/// 构建国家/地区分组列表(废弃不使用)
|
||||||
Widget _kr_buildRegionList(BuildContext context) {
|
Widget _kr_buildRegionList(BuildContext context) {
|
||||||
return Obx(() {
|
return Obx(() {
|
||||||
// 自动触发延迟测试(仅在未连接状态下)
|
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
||||||
if (!controller.homeController.kr_isConnected.value && !controller.homeController.kr_isLatency.value) {
|
|
||||||
KRLogUtil.kr_i('🔄 节点列表显示 - 自动触发延迟测试', tag: 'HINodeListView');
|
|
||||||
controller.homeController.kr_urlTest();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return _kr_buildListContainer(
|
return _kr_buildListContainer(
|
||||||
context,
|
context,
|
||||||
child: ListView(
|
child: ListView(
|
||||||
@ -217,14 +210,6 @@ class HINodeListView extends GetView<HINodeListController> {
|
|||||||
/// 构建默认的订阅节点列表
|
/// 构建默认的订阅节点列表
|
||||||
Widget _buildSubscribeList(BuildContext context) {
|
Widget _buildSubscribeList(BuildContext context) {
|
||||||
return Obx(() {
|
return Obx(() {
|
||||||
|
|
||||||
// 自动触发延迟测试(仅在未连接状态下)
|
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
||||||
if (!controller.homeController.kr_isConnected.value && !controller.homeController.kr_isLatency.value) {
|
|
||||||
KRLogUtil.kr_i('🔄 节点列表显示 - 自动触发延迟测试', tag: 'HINodeListView');
|
|
||||||
controller.homeController.kr_urlTest();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return _kr_buildListContainer(
|
return _kr_buildListContainer(
|
||||||
context,
|
context,
|
||||||
child: ListView(
|
child: ListView(
|
||||||
@ -293,7 +278,14 @@ class HINodeListView extends GetView<HINodeListController> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
// 2. 第二个 Text: "根据网络IP自动匹配最快线路"
|
// 2. 第二个 Text: "根据网络IP自动匹配最快线路"
|
||||||
Obx(() {
|
Text(
|
||||||
|
'根据网络IP自动匹配最快线路', // 默认文本
|
||||||
|
style: KrAppTextStyle(
|
||||||
|
fontSize: 10,
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
/* Obx(() {
|
||||||
// 当选择全局 auto 时,显示当前选中的节点信息
|
// 当选择全局 auto 时,显示当前选中的节点信息
|
||||||
if (controller.homeController.kr_cutTag.value == 'auto') {
|
if (controller.homeController.kr_cutTag.value == 'auto') {
|
||||||
final autoNodeInfo = controller.homeController.kr_getGlobalAutoSelectedNode();
|
final autoNodeInfo = controller.homeController.kr_getGlobalAutoSelectedNode();
|
||||||
@ -314,7 +306,7 @@ class HINodeListView extends GetView<HINodeListController> {
|
|||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}),
|
}),*/
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@ -1438,19 +1438,7 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
|
|||||||
print('当前活动组----$group}');
|
print('当前活动组----$group}');
|
||||||
|
|
||||||
// 处理全局 auto 模式
|
// 处理全局 auto 模式
|
||||||
if (kr_cutTag.value == 'auto' && group.type == ProxyType.urltest && group.tag == 'auto') {
|
if (kr_cutTag.value.endsWith('auto') && group.type == ProxyType.urltest && group.tag == 'auto') {
|
||||||
final selectedNode = group.selected;
|
|
||||||
final node = kr_subscribeService.keyList[selectedNode];
|
|
||||||
return {
|
|
||||||
'nodeName': selectedNode,
|
|
||||||
'delay': node?.urlTestDelay.value ?? -2,
|
|
||||||
'country': node?.country ?? '',
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// 处理 country-auto 模式
|
|
||||||
if (kr_cutTag.value.endsWith('-auto') && group.type == ProxyType.urltest) {
|
|
||||||
if (group.tag == kr_cutTag.value) {
|
|
||||||
final selectedNode = group.selected;
|
final selectedNode = group.selected;
|
||||||
final node = kr_subscribeService.keyList[selectedNode];
|
final node = kr_subscribeService.keyList[selectedNode];
|
||||||
return {
|
return {
|
||||||
@ -1460,8 +1448,6 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
print('hhhhhh${kr_subscribeService.keyList}', );
|
|
||||||
|
|
||||||
// 处理 country-auto 模式的备用方案(当 SingBox 组数据不可用时)
|
// 处理 country-auto 模式的备用方案(当 SingBox 组数据不可用时)
|
||||||
if (kr_cutTag.value.endsWith('-auto')) {
|
if (kr_cutTag.value.endsWith('-auto')) {
|
||||||
@ -2280,7 +2266,8 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
|
|||||||
|
|
||||||
for (var node in allNodes) {
|
for (var node in allNodes) {
|
||||||
final delay = node.urlTestDelay.value;
|
final delay = node.urlTestDelay.value;
|
||||||
if (delay > 0 && delay < 3000 && delay < fastestDelay) {
|
KRLogUtil.kr_w('🔍 检查节点 ${node.tag} 的延迟: $delay', tag: 'HomeController');
|
||||||
|
if (delay > 0 && delay < fastestDelay) {
|
||||||
fastestDelay = delay;
|
fastestDelay = delay;
|
||||||
fastestNode = node;
|
fastestNode = node;
|
||||||
}
|
}
|
||||||
@ -2446,7 +2433,7 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
|
|||||||
KRLogUtil.kr_d('找到 selector 组: ${group.tag}, 选中: ${group.selected}', tag: 'HomeController');
|
KRLogUtil.kr_d('找到 selector 组: ${group.tag}, 选中: ${group.selected}', tag: 'HomeController');
|
||||||
|
|
||||||
// 如果是auto模式,从urltest组获取延迟
|
// 如果是auto模式,从urltest组获取延迟
|
||||||
if (kr_cutTag.value == "auto") {
|
if (kr_cutTag.value.endsWith('auto')) {
|
||||||
for (var item in group.items) {
|
for (var item in group.items) {
|
||||||
if (item.tag == "auto" && item.urlTestDelay != 0) {
|
if (item.tag == "auto" && item.urlTestDelay != 0) {
|
||||||
kr_currentNodeLatency.value = item.urlTestDelay;
|
kr_currentNodeLatency.value = item.urlTestDelay;
|
||||||
@ -2455,17 +2442,6 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 如果是国家-auto模式,从对应的国家urltest组获取延迟
|
|
||||||
else if (kr_cutTag.value.endsWith('-auto')) {
|
|
||||||
final countryCode = kr_cutTag.value.replaceAll('-auto', '');
|
|
||||||
for (var item in group.items) {
|
|
||||||
if (item.tag == kr_cutTag.value && item.urlTestDelay != 0) {
|
|
||||||
kr_currentNodeLatency.value = item.urlTestDelay;
|
|
||||||
KRLogUtil.kr_i('✅ ${countryCode}-auto模式延迟值: ${item.urlTestDelay}ms', tag: 'HomeController');
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 手动选择模式
|
// 手动选择模式
|
||||||
else {
|
else {
|
||||||
for (var item in group.items) {
|
for (var item in group.items) {
|
||||||
|
|||||||
@ -642,15 +642,7 @@ class KRSingBoxImp {
|
|||||||
"enable-fake-dns": false,
|
"enable-fake-dns": false,
|
||||||
"enable-dns-routing": true,
|
"enable-dns-routing": true,
|
||||||
"independent-dns-cache": true,
|
"independent-dns-cache": true,
|
||||||
"rules": [
|
"rules": _kr_buildHiddifyRules(),
|
||||||
// ✅ 自定义域名直连规则 - 添加到 HiddifyOptions.Rules 中
|
|
||||||
// 这样 Native 层的 config.BuildConfig() 会将其包含到最终配置
|
|
||||||
// 注意:libcore 要求 domains 字段使用前缀格式,如 "domain:ip.sb" 表示 domain_suffix
|
|
||||||
{
|
|
||||||
"domains": "domain:api.hifast.biz", // domain: 前缀表示 domain_suffix 匹配
|
|
||||||
"outbound": "bypass" // bypass = direct
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"mux": {
|
"mux": {
|
||||||
"enable": false,
|
"enable": false,
|
||||||
"padding": false,
|
"padding": false,
|
||||||
@ -709,6 +701,57 @@ class KRSingBoxImp {
|
|||||||
return op;
|
return op;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<Map<String, dynamic>> _kr_buildHiddifyRules() {
|
||||||
|
final rules = <Map<String, dynamic>>[];
|
||||||
|
rules.add({
|
||||||
|
"domains": "domain:api.hifast.biz",
|
||||||
|
"outbound": "bypass"
|
||||||
|
});
|
||||||
|
|
||||||
|
final nodeDomains = _kr_collectNodeDomains();
|
||||||
|
for (final d in nodeDomains) {
|
||||||
|
rules.add({
|
||||||
|
"domains": "domain:$d",
|
||||||
|
"outbound": "bypass"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
KRLogUtil.kr_i('✅ 节点域名白名单数量: ${nodeDomains.length}', tag: 'SingBox');
|
||||||
|
KRLogUtil.kr_i('✅ 节点域名白名单集合: ${jsonEncode(nodeDomains.toList())}', tag: 'SingBox');
|
||||||
|
return rules;
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<String> _kr_collectNodeDomains() {
|
||||||
|
final set = <String>{};
|
||||||
|
|
||||||
|
void addFromOutbound(Map<String, dynamic> o) {
|
||||||
|
final server = o['server']?.toString();
|
||||||
|
if (server != null && server.isNotEmpty && InternetAddress.tryParse(server) == null) {
|
||||||
|
set.add(server.toLowerCase());
|
||||||
|
}
|
||||||
|
|
||||||
|
final tls = o['tls'];
|
||||||
|
if (tls is Map) {
|
||||||
|
final sni = tls['server_name']?.toString();
|
||||||
|
if (sni != null && sni.isNotEmpty && InternetAddress.tryParse(sni) == null) {
|
||||||
|
set.add(sni.toLowerCase());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (final g in kr_outbounds) {
|
||||||
|
addFromOutbound(g);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (final g in Kr_allOutbounds) {
|
||||||
|
for (final it in g.outboundList) {
|
||||||
|
addFromOutbound(it.config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return set;
|
||||||
|
}
|
||||||
|
|
||||||
/// 动态构建 DNS 配置
|
/// 动态构建 DNS 配置
|
||||||
///
|
///
|
||||||
/// - 真机:使用远程 DoH + 本地系统 DNS,final 指向远程
|
/// - 真机:使用远程 DoH + 本地系统 DNS,final 指向远程
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user