Skip to content

Commit cd0d49d

Browse files
authored
Merge pull request #217 from Muska-Ami/dev
NyaLCF v1.0.0 with LoCyanFrpAPI v2.3
2 parents ed8f81f + e46da16 commit cd0d49d

File tree

129 files changed

+2581
-2626
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

129 files changed

+2581
-2626
lines changed

Diff for: README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@ The next generation of LoCyanFrp launcher.
2626
- [nyalcf_core_extend](./nyalcf_gui/nyalcf_core_extend) - 核心扩展模块
2727
- [nyalcf_inject_extend](./nyalcf_gui/nyalcf_inject_extend) - 通讯扩展模块
2828
- [nyalcf_cli](nyalcf_cli) - 命令行版本
29+
- [nyalcf_core_extend](./nyalcf_cli/nyalcf_core_extend) - 核心扩展模块
2930

3031
## 开发计划
3132

3233
- 开发进度
3334
- [x] GUI 版本
3435
- [GUI Features Design](./nyalcf_gui/README.md#设计功能)
3536
- [x] CLI 版本
36-
- [ ] 进程管理
3737
- [CLI Features Design](./nyalcf_cli/README.md#设计功能)
3838
- CI/CD
3939
- GUI 版本

Diff for: RELEASE_CHANGELOG.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818

1919
## 版本信息
2020

21-
- nyalcf_gui: 0.2.4
22-
- nyalcf_cli: 0.0.3
23-
- nyalcf_env: 1.0.2
24-
- nyalcf_core,nyalcf_inject: 1.2.6
21+
- nyalcf_gui: 1.0.0
22+
- nyalcf_cli: 1.0.0
23+
- nyalcf_env: 2.0.0
24+
- nyalcf_core,nyalcf_inject: 2.0.0
2525

2626
<!-- Some change log here -->

Diff for: install-dependency.sh

+4-1
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,7 @@ cd ../..
3030
cd nyalcf_cli
3131
dart pub get
3232

33-
cd ..
33+
cd nyalcf_core_extend
34+
flutter pub get
35+
36+
cd ../..

Diff for: nyalcf_cli/README.md

+5-6
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,15 @@
66

77
- [x] 登录
88
- [x] 隧道启动
9-
- [ ] 进程管理
109
- [x] Frpc 下载
1110
- [x] 隧道启动
1211
- [x] 用户信息展示
1312

1413
## 运行测试
1514

16-
| 打包类型 | 系统类型 | 编译架构 | 状态 | 已测试通过环境 |
17-
|------------|---------|-------|----|------------------|
18-
| EXE | Windows | x64 || Windows 11 (Pro) |
15+
| 打包类型 | 系统类型 | 编译架构 | 状态 | 已测试通过环境 |
16+
|------------|---------|-------|----|--------------------------------|
17+
| EXE | Windows | x64 || Windows 11 (Pro) |
1918
| EXECUTABLE | Linux | x64 || Kali Linux(With WSL, Linux5.9) |
20-
| EXECUTABLE | MacOS | arm64 || - |
21-
| EXECUTABLE | MacOS | x64 || MacOS 14 |
19+
| EXECUTABLE | MacOS | arm64 || - |
20+
| EXECUTABLE | MacOS | x64 || MacOS 14 |

Diff for: nyalcf_cli/bin/nyalcf_cli.dart

+5-5
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@ import 'package:args/args.dart';
66
import 'package:nyalcf_core/storages/configurations/launcher_configuration_storage.dart';
77
import 'package:nyalcf_core/storages/injector.dart';
88
import 'package:nyalcf_core/utils/logger.dart';
9+
import 'package:nyalcf_core_extend/utils/path_provider.dart';
910
import 'package:nyalcf_inject/nyalcf_inject.dart';
1011

1112
// Project imports:
1213
import 'package:nyalcf/arguments.dart';
14+
import 'package:nyalcf/commands/authorize.dart';
1315
import 'package:nyalcf/commands/config.dart';
1416
import 'package:nyalcf/commands/download.dart';
15-
import 'package:nyalcf/commands/login.dart';
1617
import 'package:nyalcf/commands/logout.dart';
1718
import 'package:nyalcf/commands/start.dart';
18-
import 'package:nyalcf/utils/path_provider.dart';
19-
import 'package:nyalcf/utils/state.dart';
19+
import 'package:nyalcf/state.dart';
2020

2121
final version = '0.0.3';
2222

@@ -57,8 +57,8 @@ void main(List<String> arguments) async {
5757
}
5858

5959
// 登录登出
60-
if (results.wasParsed('login')) {
61-
await Login().main(results.rest);
60+
if (results.wasParsed('authorize')) {
61+
await Authorize().main(results.rest);
6262
}
6363
if (results.wasParsed('logout')) {
6464
await Logout().main(results.rest);

Diff for: nyalcf_cli/lib/arguments.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ class Arguments {
1010
help: 'Print this usage information.',
1111
)
1212
..addFlag(
13-
'login',
14-
abbr: 'l',
13+
'authorize',
14+
abbr: 'a',
1515
negatable: false,
16-
help: 'Login to LoCyanFrp. usage: <username> <password>',
16+
help: 'Authorize. usage: <username> <password>',
1717
)
1818
..addFlag(
1919
'logout',

Diff for: nyalcf_cli/lib/commands/authorize.dart

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// Dart imports:
2+
import 'dart:convert';
3+
import 'dart:io';
4+
5+
// Package imports:
6+
import 'package:crypto/crypto.dart';
7+
import 'package:nyalcf_core/models/user_info_model.dart';
8+
import 'package:nyalcf_core/network/client/api/auth/oauth/access_token.dart';
9+
import 'package:nyalcf_core/network/client/api/user/info.dart' as user_info;
10+
import 'package:nyalcf_core/network/client/api_client.dart';
11+
import 'package:nyalcf_core/network/server/oauth.dart';
12+
import 'package:nyalcf_core/storages/stores/user_info_storage.dart';
13+
import 'package:nyalcf_core/utils/logger.dart';
14+
import 'package:nyalcf_core_extend/storages/token_storage.dart';
15+
16+
// Project imports:
17+
import 'package:nyalcf/templates/command.dart';
18+
19+
import 'package:nyalcf_core/network/client/api/user/frp/token.dart'
20+
as user_frp_token;
21+
22+
class Authorize implements Command {
23+
static final _tokenStorage = TokenStorage();
24+
25+
static bool _callback = false;
26+
static String? _refreshToken;
27+
28+
@override
29+
Future<void> main(List<String> args) async {
30+
final ApiClient api = ApiClient();
31+
32+
await startHttpServer();
33+
Logger.write('Waiting callback...');
34+
while (!_callback) {}
35+
if (_refreshToken == null) exit(1);
36+
final rs = await api.post(PostAccessToken(
37+
appId: 1,
38+
refreshToken: _refreshToken!,
39+
));
40+
if (rs == null) exit(1);
41+
final int userId = rs.data['data']['user_id'];
42+
final String accessToken = rs.data['data']['access_token'];
43+
_tokenStorage.setRefreshToken(_refreshToken!);
44+
_tokenStorage.setAccessToken(accessToken);
45+
46+
final apix = ApiClient(accessToken: accessToken);
47+
final rsInfo = await apix.get(user_info.GetInfo(
48+
userId: userId,
49+
));
50+
final rsFrpToken = await apix.get(user_frp_token.GetToken(
51+
userId: userId,
52+
));
53+
if (rsInfo == null || rsFrpToken == null) exit(1);
54+
final userInfo = UserInfoModel(
55+
username: rsInfo.data['data']['username'],
56+
id: rsInfo.data['data']['id'],
57+
email: rsInfo.data['data']['email'],
58+
avatar: "https://cravatar.cn/avatar/"
59+
"${md5.convert(utf8.encode(rsInfo.data['data']['email']))}",
60+
inbound: rsInfo.data['data']['inbound'],
61+
outbound: rsInfo.data['data']['outbound'],
62+
traffic: rsInfo.data['data']['traffic'],
63+
);
64+
UserInfoStorage.save(userInfo);
65+
final frpToken = rsFrpToken.data['data']['frp_token'];
66+
_tokenStorage.setFrpToken(frpToken);
67+
}
68+
69+
Future<void> startHttpServer() async {
70+
OAuth.initRoute(
71+
response: OAuthResponseBody(success: '授权成功', error: '授权失败'),
72+
callback: callback,
73+
);
74+
await OAuth.start();
75+
}
76+
77+
void callback({String? refreshToken, String? error}) {
78+
if (error != null) {
79+
Logger.error('Error: $error');
80+
} else {
81+
_refreshToken = refreshToken;
82+
}
83+
_callback = true;
84+
}
85+
}

Diff for: nyalcf_cli/lib/commands/config.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ import 'package:nyalcf_core/storages/configurations/launcher_configuration_stora
33
import 'package:nyalcf_core/utils/logger.dart';
44

55
// Project imports:
6-
import 'package:nyalcf/templates/command_implement.dart';
7-
import 'package:nyalcf/utils/state.dart';
6+
import 'package:nyalcf/state.dart';
7+
import 'package:nyalcf/templates/command.dart';
88

9-
class Config implements CommandImplement {
9+
class Config implements Command {
1010
final _lcs = LauncherConfigurationStorage();
1111

1212
@override

Diff for: nyalcf_cli/lib/commands/download.dart

+20-16
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@ import 'dart:io';
33

44
// Package imports:
55
import 'package:dio/dio.dart';
6-
import 'package:nyalcf_core/network/dio/frpc/download_frpc.dart';
6+
import 'package:nyalcf_core/network/client/common/github/frp_client.dart';
77
import 'package:nyalcf_core/utils/cpu_arch.dart';
88
import 'package:nyalcf_core/utils/frpc/arch.dart';
99
import 'package:nyalcf_core/utils/frpc/archive.dart';
1010
import 'package:nyalcf_core/utils/logger.dart';
1111

1212
// Project imports:
13-
import 'package:nyalcf/templates/command_implement.dart';
14-
import 'package:nyalcf/utils/state.dart';
13+
import 'package:nyalcf/state.dart';
14+
import 'package:nyalcf/templates/command.dart';
1515

16-
class Download implements CommandImplement {
16+
class Download implements Command {
1717
List<Map<String, String>> arch = [];
1818
late String platform;
1919

@@ -35,7 +35,7 @@ class Download implements CommandImplement {
3535
_provide = true;
3636
}
3737
if (verbose) {
38-
Logger.verbose('Provide info: $_provideArch, $_providePlatform');
38+
Logger.verbose('Provide info: $_provideArch, $_providePlatform');
3939
}
4040
final systemArch = await CPUArch.getCPUArchitecture();
4141
if (verbose) {
@@ -64,24 +64,25 @@ class Download implements CommandImplement {
6464
_cancelToken = CancelToken();
6565
Logger.info('Starting frpc download...');
6666

67-
await DownloadFrpc.download(
68-
arch: _selectedArch,
67+
await FrpClient().download(
68+
architecture: _selectedArch,
6969
platform: platform,
7070
version: '0.51.3-6',
71-
releaseName: 'LoCyanFrp-0.51.3-6 #2024100301',
72-
progressCallback: callback,
71+
name: 'LoCyanFrp-0.51.3-6 #2024100301',
7372
cancelToken: _cancelToken,
73+
onReceiveProgress: callback,
74+
onFailed: onFailed,
7475
useMirror: false,
7576
);
76-
stdout.write('\r${' ' * 30}');
77-
stdout.write('\rPlease wait, extracting frpc...\n');
77+
Logger.write('Please wait, extracting frpc...');
7878
await FrpcArchive.extract(
7979
platform: platform, arch: _selectedArch, version: '0.51.3-6');
80-
stdout.write('\r${' ' * 30}');
81-
stdout.write('\rSuccess!\n');
80+
Logger.info('Success!');
8281
} else {
8382
Logger.error(
84-
'Unsupported system! If you believe this is wrong, please provide arch manually in command.');
83+
'Unsupported system! If you believe this is wrong,'
84+
' please provide arch manually in command.',
85+
);
8586
}
8687
default:
8788
Logger.error('No valid arguments provided.');
@@ -104,7 +105,10 @@ class Download implements CommandImplement {
104105
}
105106

106107
void callback(downloaded, all) {
107-
stdout.write('\r${' ' * 30}');
108-
stdout.write('\rProgress: ${(downloaded / all * 100).toStringAsFixed(2)}%');
108+
Logger.write('Progress: ${(downloaded / all * 100).toStringAsFixed(2)}%');
109+
}
110+
111+
void onFailed(Object e) {
112+
Logger.error('Download failed: $e, check your internet connection.');
109113
}
110114
}

Diff for: nyalcf_cli/lib/commands/login.dart

-36
This file was deleted.

Diff for: nyalcf_cli/lib/commands/logout.dart

+4-11
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,12 @@ import 'package:nyalcf_core/storages/stores/user_info_storage.dart';
55
import 'package:nyalcf_core/utils/logger.dart';
66

77
// Project imports:
8-
import 'package:nyalcf/templates/command_implement.dart';
8+
import 'package:nyalcf/templates/command.dart';
99

10-
class Logout implements CommandImplement {
10+
class Logout implements Command {
1111
@override
1212
Future<void> main(List<String> args) async {
13-
final userInfo = await UserInfoStorage.read();
14-
final res = await UserInfoStorage.sigo(userInfo?.user, userInfo?.token);
15-
16-
if (res) {
17-
Logger.info('Session data removed.');
18-
} else {
19-
Logger.error(
20-
'Logout failed, please check your network connection and retry.');
21-
}
13+
await UserInfoStorage.logout();
14+
Logger.info('Session data removed.');
2215
}
2316
}

0 commit comments

Comments
 (0)