cauto 1 year ago
parent
commit
e0bdc0094e

+ 3 - 0
Makefile

@@ -1,6 +1,9 @@
 BUILD_DMG=flutter_distributor package --platform macos --targets dmg
 BUILD_EXE=flutter_distributor package --platform windows --targets exe
 
+init-mapper:
+	flutter pub get
+
 init-arm64:
 	flutter pub get
 	dart run --define=OS_ARCH=arm64 ./scripts/init.dart

+ 1 - 180
assets/dep/example.yaml

@@ -1,35 +1,20 @@
-# HTTP 代理端口
-port: 7890
-
-# SOCKS5 代理端口
-socks-port: 7891
-
-# Linux 和 macOS 的 redir 代理端口
-redir-port: 7892
 mixed-port: 7893
-
 # 允许局域网的连接
 allow-lan: true
-
 # 规则模式:Rule(规则) / Global(全局代理)/ Direct(全局直连)
 # mode: rule
 mode: Rule
-
 # 设置日志输出级别 (默认级别:silent,即不输出任何内容,以避免因日志内容过大而导致程序内存溢出)。
 # 5 个级别:silent / info / warning / error / debug。级别越高日志输出量越大,越倾向于调试,若需要请自行开启。
 log-level: debug
 # Clash 的 RESTful API
 external-controller: "127.0.0.1:9090"
-
 # RESTful API 的口令
 secret: ""
-
 # 您可以将静态网页资源(如 clash-dashboard)放置在一个目录中,clash 将会服务于 `RESTful API/ui`
 # 参数应填写配置目录的相对路径或绝对路径。
 # external-ui: folder
-
 # DNS 设置
-
 dns:
   nameserver:
     - 114.114.114.114
@@ -78,19 +63,7 @@ tun:
 #       interval: 600
 #       url: http://www.gstatic.com/generate_204
 
-# proxies:
-#   - name: "proxie"
-#     type: vmess
-#     server: xxx
-#     port: 8080
-#     uuid: xxx
-#     alterId: 1
-#     cipher: auto
-#     udp: true
-#     tls: false
-#     network: ws
-#     ws-opts:
-#       path: /y831
+
 
 proxy-groups:
   - name: proxy
@@ -102,157 +75,5 @@ proxy-groups:
 
 
 rule-providers:
-# name: # Provider 名称
-#   type: http # http 或 file
-#   behavior: classical # 或 ipcidr、domain
-#   path: # 文件路径
-#   url: # 只有当类型为 HTTP 时才可用,您不需要在本地空间中创建新文件。
-#   interval: # 自动更新间隔,仅在类型为 HTTP 时可用
-
-# reject:
-#   type: http
-#   behavior: domain
-#   url: "https://ghproxy.com/https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/reject.txt"
-#   path: ./ruleset/reject.yaml
-#   interval: 86400
-
-# icloud:
-#   type: http
-#   behavior: domain
-#   url: "https://ghproxy.com/https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/icloud.txt"
-#   path: ./ruleset/icloud.yaml
-#   interval: 86400
-
-# apple:
-#   type: http
-#   behavior: domain
-#   url: "https://ghproxy.com/https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/apple.txt"
-#   path: ./ruleset/apple.yaml
-#   interval: 86400
-
-# google:
-#   type: http
-#   behavior: domain
-#   url: "https://ghproxy.com/https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/google.txt"
-#   path: ./ruleset/google.yaml
-#   interval: 86400
-
-# direct:
-#   type: http
-#   behavior: domain
-#   url: "https://ghproxy.com/https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/direct.txt"
-#   path: ./ruleset/direct.yaml
-#   interval: 86400
-
-# private:
-#   type: http
-#   behavior: domain
-#   url: "https://ghproxy.com/https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/private.txt"
-#   path: ./ruleset/private.yaml
-#   interval: 86400
-
-# gfw:
-#   type: http
-#   behavior: domain
-#   url: "https://ghproxy.com/https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/gfw.txt"
-#   path: ./ruleset/gfw.yaml
-#   interval: 86400
-
-# greatfire:
-#   type: http
-#   behavior: domain
-#   url: "https://ghproxy.com/https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/greatfire.txt"
-#   path: ./ruleset/greatfire.yaml
-#   interval: 86400
-
-# lancidr:
-#   type: http
-#   behavior: ipcidr
-#   url: "https://ghproxy.com/https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/lancidr.txt"
-#   path: ./ruleset/lancidr.yaml
-#   interval: 86400
-
-# china:
-#   type: http
-#   behavior: classical
-#   url: "https://ghproxy.com/https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/RuleSet/China.yaml"
-#   path: ./ruleset/china.yaml
-#   interval: 86400
-
-# streamingcn:
-#   type: http
-#   behavior: classical
-#   url: "https://ghproxy.com/https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/RuleSet/StreamingMedia/StreamingCN.yaml"
-#   path: ./ruleset/streamingcn.yaml
-#   interval: 86400
-
-# streaming:
-#   type: http
-#   behavior: classical
-#   url: "https://ghproxy.com/https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/RuleSet/StreamingMedia/Streaming.yaml"
-#   path: ./ruleset/streaming.yaml
-#   interval: 86400
-
-# telegram:
-#   type: http
-#   behavior: classical
-#   url: "https://ghproxy.com/https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/RuleSet/Extra/Telegram/Telegram.yaml"
-#   path: ./ruleset/telegram.yaml
-#   interval: 86400
-
-# privacy:
-#   type: http
-#   behavior: classical
-#   url: "https://ghproxy.com/https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/RuleSet/Guard/Privacy.yaml"
-#   path: ./ruleset/hijacking.yaml
-#   interval: 86400
-
-# hijacking:
-#   type: http
-#   behavior: classical
-#   url: "https://ghproxy.com/https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/RuleSet/Guard/Hijacking.yaml"
-#   path: ./ruleset/hijacking.yaml
-#   interval: 86400
-
-# 规则
-# rules:
-# Unbreak
-# - PROCESS-NAME,China,DIRECT
-# - PROCESS-NAME,google,DIRECT
-# - RULE-SET,"🎯 全球直连",DIRECT
-# - RULE-SET,China,DIRECT
-# - RULE-SET,google,DIRECT
-# - MATCH,MATCH
-# - GEOIP,CN,DIRECT
 rules:
-  # - DOMAIN,pub.dev,🌎 国外网站
-  # - DOMAIN,translate.googleapis.com,🌎 国外网站
-  # # https://github.com/Dreamacro/clash/issues/1663#issuecomment-1075815348
-  # - DOMAIN-SUFFIX,msftconnecttest.com,🌎 国外网站
-
-  # - RULE-SET,private,DIRECT
-  # - RULE-SET,lancidr,DIRECT,no-resolve
-  # - RULE-SET,applications,DIRECT
-
-  # - RULE-SET,reject,🛑 广告拦截
-  # - RULE-SET,privacy,🛑 隐私保护
-  # - RULE-SET,hijacking,🛑 网络劫持
-
-  # - RULE-SET,icloud,🍎 苹果服务
-  # - RULE-SET,apple,🍎 苹果服务
-
-  # - RULE-SET,china,🌏 国内网站
-  # - RULE-SET,streamingcn,🌏 国内网站
-  # - GEOIP,CN,🌏 国内网站
-
-  # - RULE-SET,google,🎯 全球直连
-  # - RULE-SET,direct,🎯 全球直连
-
-  # - RULE-SET,telegram,📲 电报信息
-
-  # - RULE-SET,gfw,🌎 国外网站
-  # - RULE-SET,proxy,🌎 国外网站
-  # - RULE-SET,greatfire,🌎 国外网站
-  # - RULE-SET,streaming,🌎 国外网站
-
   - MATCH,proxy

+ 6 - 6
lib/app/bean/clash_core.dart

@@ -7,13 +7,13 @@ class ClashCoreVersion {
   late String version;
 
   ClashCoreVersion.fromJson(Map<String, dynamic> json) {
-    premium = json['premium'];
+    premium = json['meta'];
     version = json['version'];
   }
 
   Map<String, dynamic> toJson() {
     final data = <String, dynamic>{};
-    data['premium'] = premium;
+    data['meta'] = premium;
     data['version'] = version;
     return data;
   }
@@ -31,7 +31,7 @@ class ClashCoreConfig {
     required this.redirPort,
     required this.tproxyPort,
     required this.mixedPort,
-    required this.authentication,
+   // required this.authentication,
     required this.allowLan,
     required this.bindAddress,
     required this.mode,
@@ -43,7 +43,7 @@ class ClashCoreConfig {
   late int redirPort;
   late int tproxyPort;
   late int mixedPort;
-  late List<String> authentication;
+  //late List<String> authentication;
   late bool allowLan;
   late String bindAddress;
   late String mode;
@@ -56,7 +56,7 @@ class ClashCoreConfig {
     redirPort = json['redir-port'];
     tproxyPort = json['tproxy-port'];
     mixedPort = json['mixed-port'];
-    authentication = List.castFrom<dynamic, String>(json['authentication']);
+    //authentication = List.castFrom<dynamic, String>(json['authentication']);
     allowLan = json['allow-lan'];
     bindAddress = json['bind-address'];
     mode = json['mode'];
@@ -71,7 +71,7 @@ class ClashCoreConfig {
     data['redir-port'] = redirPort;
     data['tproxy-port'] = tproxyPort;
     data['mixed-port'] = mixedPort;
-    data['authentication'] = authentication;
+    //data['authentication'] = authentication;
     data['allow-lan'] = allowLan;
     data['bind-address'] = bindAddress;
     data['mode'] = mode;

+ 2 - 0
lib/app/controller/GlobalController.dart

@@ -48,8 +48,10 @@ class GlobalController extends GetxController {
     // init config
     await controllers.config.initConfig();
     final language = controllers.config.config.value.language.split('_');
+
     //await controllers.pageSetting.applyLanguage(Locale(language[0], language[1]));
 
+    await controllers.service.initConfig();
     // init service
     await controllers.service.startService();
     if (controllers.service.serviceStatus.value != RunningState.running) return;

+ 4 - 3
lib/app/controller/config.dart

@@ -31,7 +31,7 @@ class ConfigController extends GetxController {
   var servicePort = 0.obs;
   Future<void> initConfig() async {
 
-    var port = await getFreePort();
+   // var port = await getFreePort();
     //dio.addSentry();
     dio = Dio(BaseOptions(baseUrl: clashCoreApiAddress.value));
     if (!await Paths.config.exists()) await Paths.config.create(recursive: true);
@@ -46,10 +46,11 @@ class ConfigController extends GetxController {
     } else {
       config.value = Config.fromJson(_defaultConfig);
     }
-    config.value.port = port;
+    //config.value.port = port;
 
     if (config.value.subs.isEmpty) {
-      if (!await Files.configExample.exists()) await Files.assetsExample.copy(Files.configExample.path);
+      if (!await Files.configExample.exists())
+        await Files.assetsExample.copy(Files.configExample.path);
       config.value.subs.add(ConfigSub(name: 'example.yaml', url: '', updateTime: 0));
       config.value.selected = 'example.yaml';
     }

+ 2 - 2
lib/app/controller/core.dart

@@ -9,7 +9,7 @@ import 'package:web_socket_channel/io.dart';
 
 
 class CoreController extends GetxController {
-  final dio = Dio(BaseOptions(baseUrl: 'http://127.0.0.1:9090'));
+  late final dio ;
   var version = ClashCoreVersion(premium: true, version: '').obs;
   var address = ''.obs;
   var secret = ''.obs;
@@ -19,7 +19,6 @@ class CoreController extends GetxController {
     redirPort: 0,
     tproxyPort: 0,
     mixedPort: 0,
-    authentication: [],
     allowLan: false,
     bindAddress: '',
     mode: '',
@@ -32,6 +31,7 @@ class CoreController extends GetxController {
 
   CoreController() {
     //dio.addSentry();
+    dio = Dio(BaseOptions(baseUrl: 'http://127.0.0.1:9090'));
   }
 
   SystemProxyConfig get proxyConfig {

+ 22 - 13
lib/app/controller/service.dart

@@ -24,8 +24,7 @@ import 'package:web_socket_channel/io.dart';
 final headers = {"User-Agent": "ccore-for-flutter/0.0.1"};
 
 class ServiceController extends GetxController {
-  late final dio ;
-
+  late final _dio ;
   var serviceMode = false.obs;
   var servicePort = 0.obs;
   var coreStatus = RunningState.stoped.obs;
@@ -40,14 +39,19 @@ class ServiceController extends GetxController {
   bool get isCanOperationCore =>
       serviceStatus.value == RunningState.running && ![RunningState.starting, RunningState.stopping].contains(coreStatus.value);
 
-  ServiceController();
+  ServiceController(
 
-  Future<void> startService() async {
+  ) {
+
+  }
+
+  Future<void> initConfig() async{
     servicePort.value = controllers.config.config.value.port;
     print('http://127.0.0.1:${servicePort.value}');
-    dio = Dio(BaseOptions(baseUrl: 'http://127.0.0.1:${servicePort.value}', headers: headers));
-
+    _dio = Dio(BaseOptions(baseUrl: 'http://127.0.0.1:${servicePort.value}', headers: headers));
+  }
 
+  Future<void> startService() async {
     serviceStatus.value = RunningState.starting;
     if (Platform.isLinux) {
       await fixBinaryExecutePermissions(Files.assetsClashService);
@@ -91,7 +95,7 @@ class ServiceController extends GetxController {
           break;
         }
         try {
-          await dio.post('/info');
+          await _dio.post('/info');
           break;
         } catch (_) {}
       }
@@ -120,7 +124,7 @@ class ServiceController extends GetxController {
       while (true) {
         await Future.delayed(const Duration(milliseconds: 100));
         try {
-          await dio.post('/info');
+          await _dio.post('/info');
           break;
         } catch (_) {}
       }
@@ -131,7 +135,7 @@ class ServiceController extends GetxController {
       while (true) {
         await Future.delayed(const Duration(milliseconds: 100));
         try {
-          await dio.post('/info');
+          await _dio.post('/info');
         } catch (e) {
           break;
         }
@@ -139,7 +143,7 @@ class ServiceController extends GetxController {
     }
 
     Future<ClashServiceInfo> fetchInfo() async {
-      final res = await dio.post('/info');
+      final res = await _dio.post('/info');
       return ClashServiceInfo.fromJson(res.data);
     }
 
@@ -149,14 +153,18 @@ class ServiceController extends GetxController {
 
     Future<void> fetchStart(String name) async {
       await fetchStop();
-      final res = await dio.post<String>('/start', data: {
+      final res = await _dio.post<String>('/start', data: {
         "args": ['-d', Paths.config.path, '-f', path.join(Paths.config.path, name)]
       });
       if (json.decode(res.data!)["code"] != 0) throw json.decode(res.data!)["msg"];
     }
 
     Future<void> fetchStop() async {
-      await dio.post('/stop');
+      try {
+        await _dio.post('/stop');
+      } catch (e) {
+        return;
+      }
     }
 
     Future<void> install() async {
@@ -193,6 +201,7 @@ class ServiceController extends GetxController {
         while (true) {
           await Future.delayed(const Duration(milliseconds: 200));
           final info = await fetchInfo();
+          print("core --- info $info");
           if (info.status == 'running') {
             try {
               await controllers.core.fetchHello();
@@ -212,7 +221,7 @@ class ServiceController extends GetxController {
         if (controllers.config.config.value.setSystemProxy) await SystemProxy.instance.set(controllers.core.proxyConfig);
         coreStatus.value = RunningState.running;
       } catch (e) {
-        log.error(e);
+        log.error("core -- $e");
         BotToast.showText(text: e.toString());
         coreStatus.value = RunningState.error;
       }

+ 1 - 1
lib/app/controller/tray.dart

@@ -24,7 +24,7 @@ class TrayController extends GetxController with TrayListener {
     final disabled = !controllers.service.isRunning;
 
     trayMenu = Menu(items: [
-      MenuItem.checkbox(label: 'tray_show'.tr, checked: visible, onClick: handleClickShow),
+      //MenuItem.checkbox(label: 'tray_show'.tr, checked: !visible, onClick: handleClickShow),
       MenuItem.separator(),
       // MenuItem.submenu(
       //   label: 'proxie_group_title'.tr,

+ 0 - 25
lib/app/main_screen.dart

@@ -1,25 +0,0 @@
-import 'package:flutter/cupertino.dart';
-import 'package:tray_manager/tray_manager.dart';
-import 'package:window_manager/window_manager.dart';
-
-class MainScreen extends StatefulWidget {
-  const MainScreen({Key? key}) : super(key: key);
-
-  @override
-  State<MainScreen> createState() => _MainScreenState();
-}
-
-class _MainScreenState extends State<MainScreen>
-    with
-        WindowListener,
-        TrayListener{
-
-    @override
-  Widget build(BuildContext context) {
-    // TODO: implement build
-    return const Text("text");
-  }
-
-
-
-}

+ 10 - 10
lib/app/network/dio_client.dart

@@ -24,16 +24,16 @@ class DioClient {
     ));
 
     // 仅在调试模式下添加日志拦截器
-    assert(() {
-      _dio.interceptors.add(LogInterceptor(
-        request: true,
-        requestBody: true,
-        responseBody: true,
-        error: true,
-        logPrint: _logger.d, // 使用 Logger 插件打印日志
-      ));
-      return true;
-    }());
+    // assert(() {
+    //   _dio.interceptors.add(LogInterceptor(
+    //     request: true,
+    //     requestBody: true,
+    //     responseBody: true,
+    //     error: true,
+    //     logPrint: _logger.d, // 使用 Logger 插件打印日志
+    //   ));
+    //   return true;
+    // }());
 
     //token
     _dio.interceptors.add(TokenInterceptor());

+ 0 - 27
lib/main.dart

@@ -18,8 +18,6 @@ import 'package:naiyouwl/app/controller/core.dart';
 import 'package:naiyouwl/app/controller/service.dart';
 import 'package:naiyouwl/app/controller/tray.dart';
 import 'package:naiyouwl/app/controller/window.dart';
-import 'package:naiyouwl/app/main_screen.dart';
-import 'package:naiyouwl/app/modules/welcome/views/welcome_view.dart';
 import 'package:proxy_manager/proxy_manager.dart';
 import 'package:tray_manager/tray_manager.dart';
 import 'package:window_manager/window_manager.dart';
@@ -109,31 +107,6 @@ Future<void> initAppService() async {
   //
   // }
 }
-
-Future<void> initAppTray(
-    {List<MenuItem>? details, bool isUpdate = false}) async {
-  await trayManager.setIcon(Platform.isWindows
-      ? 'assets/images/logo/logo.ico'
-      : 'assets/images/logo/logo.png');
-
-  List<MenuItem> items = [
-    MenuItem(
-      key: 'show',
-      label: 'Show Fclash'.tr,
-    ),
-    MenuItem.separator(),
-    MenuItem(
-      key: 'exit',
-      label: 'Exit Fclash'.tr,
-    ),
-  ];
-  if (details != null) {
-    items.insertAll(0, details);
-  }
-  await trayManager.setContextMenu(Menu(items: items));
-}
-
-
 class MyApp extends StatefulWidget {
   const MyApp({Key? key}) : super(key: key);
 

+ 1 - 1
macos/Podfile.lock

@@ -94,4 +94,4 @@ SPEC CHECKSUMS:
 
 PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367
 
-COCOAPODS: 1.12.1
+COCOAPODS: 1.13.0