alroyso 1 рік тому
батько
коміт
425f2590ba

+ 70 - 1
lib/app/controller/GlobalController.dart

@@ -70,13 +70,60 @@ class GlobalController extends GetxController {
 
   Future<void> fetchNodes() async {
     nodeModes.value = await ApiService().getNode("/api/client/v4/nodes?vless=1");
+    await makeProxy();
+    if(controllers.service.coreStatus.value == RunningState.stoped){
+      await controllers.service.reloadClashCore();
+    }
+    if (controllers.service.coreStatus.value != RunningState.running) return;
+    await controllers.core.updateVersion();
+    await updateDate();
+
+    NodeMode? targetNode;
+    if (selectedNode.value == null) {
+      targetNode = await findNodeWithMinUsers(nodeModes);
+    } else {
+      targetNode = selectedNode.value;
+    }
+    if (targetNode != null){
+      selectNode(targetNode);
+      ProxieProxiesItem? targetProxie = await findProxieByName(targetNode.name);
+      if (targetProxie != null) {
+        handleSetProxieGroup(targetProxie, targetNode.name);
+      }
+    }
+
+
+  }
+  // Future<ProxieProxiesItem> findProxieByName(String name) async {
+  //   return proxieGroups.firstWhere((proxie) => proxie['name'] == name, orElse: () => null);
+  // }
+
+  Future<ProxieProxiesItem?> findProxieByName(String name) async {
+    ProxieProxiesItem? result;
+    try {
+      result = proxieGroups.firstWhere((proxie) => proxie.all!.contains(name));
+    } catch (e) {
+      // 在这里可以处理异常,或者只是简单地返回 null
+      return null;
+    }
+    return result;
   }
 
+
+
   Future<void> makeProxy() async {
      await controllers.config.makeClashConfig(nodeModes);
-     await controllers.service.reloadClashCore();
+     // await controllers.service.reloadClashCore();
 
   }
+  Future<NodeMode> findNodeWithMinUsers(List<NodeMode> nodes) async {
+    return nodes
+        .where((node) => node.countryCode == "hk")
+        .reduce((a, b) => a.onlineUsers < b.onlineUsers ? a : b);
+  }
+
+
+
 
   Future<SystemProxyConfig> getSysProxy() async{
      return  await SystemProxy.instance.get();
@@ -152,6 +199,16 @@ class GlobalController extends GetxController {
     }
   }
 
+  Future<void> handleSetSelectProxieGroup(NodeMode proxie, String value) async {
+    if (proxie.name == value) return;
+    await controllers.core.fetchSetProxieGroup(proxie.name, value);
+    await updateDate();
+    final conn = await controllers.core.fetchConnection();
+    for (final it in conn.connections) {
+      if (it.chains.contains(proxie.name)) controllers.core.fetchCloseConnections(it.id);
+    }
+  }
+
   void watchExit() {
     // watch process kill
     // ref https://github.com/dart-lang/sdk/issues/12170
@@ -169,6 +226,18 @@ class GlobalController extends GetxController {
       handleExit();
     });
   }
+  void selectNode(NodeMode node) {
+    controllers.global.selectedNode.value = node;
+    _storeSelectedNode(node);
+  }
+
+  Future<void> _storeSelectedNode(NodeMode node) async {
+    final prefs = await SharedPreferences.getInstance();
+    // 为简化起见,我们只存储node的ID,但您可以根据需要存储更多信息
+    prefs.setInt('selectedNodeId', node.id);
+    await loadSelectedNode();
+  }
+
 
   Future<void> loadSelectedNode() async {
     final prefs = await SharedPreferences.getInstance();

+ 6 - 6
lib/app/controller/config.dart

@@ -78,15 +78,15 @@ class ConfigController extends GetxController {
     }
   }
   Future<void> makeClashConfig(List<NodeMode> nodes) async{
-    var mixedport  = 5988;
+    var mixedport  = 9888;
     bool bg = await isPortOccupied(mixedport);
-    if(!bg) {
+    if(bg) {
       mixedport = await getFreePort();
     }
-    var extePort  = 5987;
-    bg = await isPortOccupied(extePort);
-    if(!bg) {
-      mixedport = await getFreePort();
+    var extePort  = 9777;
+    final ac = await isPortOccupied(extePort);
+    if(ac) {
+      extePort = await getFreePort();
     }
     var proxies = nodes.map(nodeToYaml).toList();
 

+ 0 - 19
lib/app/data/model/NodeMode.dart

@@ -62,23 +62,4 @@ class NodeMode {
     this.vless,
     this.vlessPulkey,
   });
-}
-
-
-String nodeToYaml(NodeMode node) {
-  switch (node.type) {
-    case 'trojan':
-      return '''- { name: ${node.name}, type: ${node.type}, server: ${node.host}, port: ${node.port}, password: ${node.passwd}, udp: 1 }''';
-    case 'ss':
-      return '''- { name: ${node.name}, type: ${node.type}, server: ${node.host}, port: ${node.port}, password: ${node.passwd}, cipher: ${node.method}, udp: 1 }''';
-    case 'v2ray':
-      final type = (node.v2Type == 'v2ray' && node.vless == 1) ? 'vless' : 'vmess';
-      if (type == 'vless') {
-        return '''- { name: ${node.name}, type: $type, server: ${node.host}, port: ${node.port}, uuid: ${node.uuid}, alterId: ${node.v2AlterId}, udp: 1, flow: xtls-rprx-vision, servername: www.amazon.com, tls: true, reality-opts: { public-key: ${node.vlessPulkey} } }''';
-      } else {
-        return '''- { name: ${node.name}, type: $type, server: ${node.host}, port: ${node.port}, uuid: ${node.uuid}, alterId: ${node.v2AlterId}, cipher: ${node.method}, udp: 1 }''';
-      }
-    default:
-      return '';
-  }
 }

+ 9 - 7
lib/app/modules/home/controllers/home_controller.dart

@@ -85,16 +85,15 @@ class HomeController extends GetxController {
         connectStatus.value == ConnectionStatus.stopped) {
       connectStatus.value = ConnectionStatus.disconnected;
       controllers.global.allowStatusUpdate = false;
-      // 停止服务
-      await controllers.service.stopClashCore();
+      // // 停止服务
+      // await controllers.service.stopClashCore();
       return;
     } else {
 
       controllers.global.allowStatusUpdate = true;
-      //生成配置
-      await controllers.global.makeProxy();
-      // 开始重启服务
-      await controllers.service.reloadClashCore();
+      updateStatus(ConnectionStatus.connecting);
+      await Future.delayed(const Duration(seconds: 5));
+      updateStatus(ConnectionStatus.stopped);
     }
   }
 
@@ -123,7 +122,10 @@ class HomeController extends GetxController {
       isLoading.value = true;
       userMode.value = await ApiService().userinfo("/api/client/v4/userinfo");
       await globalController.fetchNodes();
-
+    // //生成配置
+    //   await controllers.global.makeProxy();
+    //   // 开始重启服务
+    //   await controllers.service.reloadClashCore();
     } catch (e) {
       errorMsg.value = e.toString();
     } finally {

+ 5 - 5
test/node_mode_test.dart

@@ -62,11 +62,11 @@ void main() {
         ...
       ]'''; // 这里简化为省略号。请用你提供的完整JSON替换。
 
-      var nodes = JsonMapper.deserialize<List<NodeMode>>(jsonData)!;
-      var proxies = nodes.map(nodeToYaml).toList();
-
-      // 这里我们只检查转换后的YAML是否为空,你可以根据需要添加更多具体的测试条件。
-      expect(proxies, isNotEmpty);
+      // var nodes = JsonMapper.deserialize<List<NodeMode>>(jsonData)!;
+      // var proxies = nodes.map(nodeToYaml).toList();
+      //
+      // // 这里我们只检查转换后的YAML是否为空,你可以根据需要添加更多具体的测试条件。
+      // expect(proxies, isNotEmpty);
     });
   });
 }