init.dart 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. // ignore_for_file: avoid_print
  2. import 'dart:io';
  3. import 'package:dio/dio.dart';
  4. import 'package:archive/archive.dart';
  5. import 'package:naiyouwl/app/const/const.dart';
  6. import 'package:path/path.dart' as path;
  7. final dio = Dio();
  8. // https://github.com/dart-lang/sdk/issues/31610
  9. final assetsPath = path.normalize(path.join(Platform.script.toFilePath(), '../../assets'));
  10. final binDir = Directory(path.join(assetsPath, 'bin'));
  11. final depDir = Directory(path.join(assetsPath, 'dep'));
  12. Future downloadLatestClashCore() async {
  13. final version = "v1.16.0";
  14. final String clashCoreName = 'clash.meta-${ClashName.platform}-${ClashName.arch}-cgo-$version';
  15. print(clashCoreName);
  16. // final info = await dio.get('https://api.github.com/repos/MetaCubeX/Clash.Meta/releases');
  17. // final Map<String, dynamic> latest = (info.data['assets'] as List<dynamic>).firstWhere((it) => (it['name'] as String).contains(clashCoreName));
  18. //
  19. final String newName = 'clash-${ClashName.platform}-${ClashName.arch}';
  20. final String name = "$clashCoreName.gz";
  21. final tempFile = File(path.join(binDir.path, '$name.temp'));
  22. //https://github.com/MetaCubeX/Clash.Meta/releases/download/v1.16.0/clash.meta-linux-amd64-cgo-v1.16.0.gz
  23. print('Downloading $name');
  24. await dio.download("https://github.com/MetaCubeX/Clash.Meta/releases/download/v1.16.0/$name", tempFile.path);
  25. print('Download Success');
  26. print('Unarchiving $name');
  27. final tempBetys = await tempFile.readAsBytes();
  28. if (name.contains('.gz')) {
  29. final bytes = GZipDecoder().decodeBytes(tempBetys);
  30. final String filePath = path.join(binDir.path, newName);
  31. await File(filePath).writeAsBytes(bytes);
  32. await Process.run('chmod', ['+x', filePath]);
  33. } else {
  34. final file = ZipDecoder().decodeBytes(tempBetys).first;
  35. await File(path.join(binDir.path, file.name)).writeAsBytes(file.content);
  36. }
  37. await tempFile.delete();
  38. print('Unarchiv Success');
  39. }
  40. Future<void> downloadAndUnarchiveService() async {
  41. // const String token = "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"; // 请确保不在公共代码中硬编码这个token
  42. final serviceName = 'ccore-service-${ClashName.platform}-${ClashName.arch}';
  43. // "name" -> "ccore-service-darwin-amd64-v1.0.0.gz"
  44. //final newSericeName = "$serviceName-v1.0.0.gz";
  45. // 获取GitHub release信息
  46. // dio.options.headers["Authorization"] = "token $token";
  47. final response = await dio.get('https://api.github.com/repos/alroyso/core-service/releases/latest');
  48. final Map<String, dynamic> latest = (response.data['assets'] as List<dynamic>)
  49. .firstWhere((it) => (it['name'] as String).contains(serviceName));
  50. final downloadUrl = latest['browser_download_url'];
  51. print('Downloading $downloadUrl');
  52. final tempFile = File(path.join(binDir.path, '${latest['name']}.temp'));
  53. try
  54. {
  55. print(dio.options.headers);
  56. await dio.download(downloadUrl, tempFile.path);
  57. } catch (e){
  58. print(e);
  59. return;
  60. }
  61. print('Download Success');
  62. print('Unarchiving ${latest['name']}');
  63. final tempBytes = await tempFile.readAsBytes();
  64. if (latest['name'].contains('.gz')) {
  65. final bytes = GZipDecoder().decodeBytes(tempBytes);
  66. await File(path.join(binDir.path, serviceName)).writeAsBytes(bytes);
  67. } else {
  68. final file = ZipDecoder().decodeBytes(tempBytes).first;
  69. await File(path.join(binDir.path, file.name)).writeAsBytes(file.content);
  70. }
  71. final filePath = path.join(binDir.path, serviceName);
  72. await Process.run('chmod', ['+x', filePath]);
  73. await tempFile.delete();
  74. print('Unarchive Success');
  75. }
  76. Future downloadLatestClashService() async {
  77. final String serviceName = 'ccore-service-${ClashName.platform}-${ClashName.arch}';
  78. // // final info = await dio.get('https://api.github.com/repos/alroyso/clash-for-flutter-service/releases/latest');
  79. // // final Map<String, dynamic> latest = (info.data['assets'] as List<dynamic>).firstWhere((it) => (it['name'] as String).contains(serviceName));
  80. // //https://github.com/alroyso/clash-for-flutter-service/releases/download/untagged-8273cca760b55d0725ab/naiyou-service-darwin-arm64-v1.0.1.gz
  81. // var verion = 'v1.0.1';
  82. // final String name = 'naiyou-service-${ClashName.platform}-${ClashName.arch}-$verion.gz';
  83. // final tempFile = File(path.join(binDir.path, '$name.temp'));
  84. // var url = "https://github.com/alroyso/clash-for-flutter-service/releases/tag/untagged-8273cca760b55d0725ab";
  85. // print('Downloading $url/$name');
  86. // dio.options.headers["Authorization"] = "token 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";
  87. // await dio.download('$url/$name', tempFile.path);
  88. // print('Download Success');
  89. //
  90. // print('Unarchiving $name');
  91. // final tempBetys = await tempFile.readAsBytes();
  92. // if (name.contains('.gz')) {
  93. // final bytes = GZipDecoder().decodeBytes(tempBetys);
  94. // final String filePath = path.join(binDir.path, serviceName);
  95. // await File(filePath).writeAsBytes(bytes);
  96. // await Process.run('chmod', ['+x', filePath]);
  97. // } else {
  98. // final file = ZipDecoder().decodeBytes(tempBetys).first;
  99. // await File(path.join(binDir.path, file.name)).writeAsBytes(file.content);
  100. // }
  101. final String filePath = path.join(binDir.path, serviceName);
  102. await Process.run('chmod', ['+x', filePath]);
  103. //await tempFile.delete();
  104. print('Unarchiv Success');
  105. }
  106. Future downloadCountryMmdb() async {
  107. print('Downloading Country.mmdb');
  108. final String geoipFilePath = path.join(depDir.path, 'Country.mmdb');
  109. await dio.download('https://github.com/Dreamacro/maxmind-geoip/releases/latest/download/Country.mmdb', geoipFilePath);
  110. print('Download Success');
  111. }
  112. Future downloadWintun() async {
  113. print('Downloading Wintun');
  114. final File wintunFile = File(path.join(depDir.path, 'wintun.zip.temp'));
  115. await dio.download('https://www.wintun.net/builds/wintun-0.14.1.zip', wintunFile.path);
  116. print('Download Success');
  117. print('Unarchiving wintun.zip');
  118. final files = ZipDecoder().decodeBytes(await wintunFile.readAsBytes());
  119. final file = files.firstWhere((it) => it.name == 'wintun/bin/${ClashName.arch}/wintun.dll');
  120. await File(path.join(depDir.path, 'wintun.dll')).writeAsBytes(file.content);
  121. await wintunFile.delete();
  122. print('Unarchiv Success');
  123. }
  124. void main() async {
  125. if (!(await binDir.exists())) await binDir.create();
  126. if (!(await depDir.exists())) await depDir.create();
  127. await downloadLatestClashCore();
  128. await downloadAndUnarchiveService();
  129. await downloadCountryMmdb();
  130. if (Platform.isWindows) await downloadWintun();
  131. }