app/lib/ui/home/login/login_dialog_ui_model.dart

169 lines
5.5 KiB
Dart
Raw Normal View History

2023-10-28 18:19:18 +08:00
import 'dart:convert';
import 'dart:io';
import 'package:desktop_webview_window/desktop_webview_window.dart';
import 'package:hive/hive.dart';
import 'package:jwt_decode/jwt_decode.dart';
import 'package:starcitizen_doctor/base/ui_model.dart';
import 'package:starcitizen_doctor/ui/home/home_ui_model.dart';
import 'package:starcitizen_doctor/ui/home/webview/webview.dart';
import 'package:url_launcher/url_launcher_string.dart';
import 'package:uuid/uuid.dart';
class LoginDialogModel extends BaseUIModel {
int loginStatus = 0;
String nickname = "";
String? avatarUrl;
String? authToken;
String? webToken;
Map? releaseInfo;
final String installPath;
final HomeUIModel homeUIModel;
2023-10-28 19:15:13 +08:00
// TextEditingController emailCtrl = TextEditingController();
2023-10-28 18:19:18 +08:00
LoginDialogModel(this.installPath, this.homeUIModel);
@override
void initModel() {
_launchWebLogin();
super.initModel();
}
void _launchWebLogin() {
goWebView("登录 RSI 账户", "https://robertsspaceindustries.com/connect",
loginMode: true, rsiLoginCallback: (message, ok) async {
dPrint(
"======rsiLoginCallback=== $ok ===== data==\n${json.encode(message)}");
if (message == null || !ok) {
Navigator.pop(context!);
return;
}
2023-10-28 19:15:13 +08:00
// final emailBox = await Hive.openBox("quick_login_email");
2023-10-28 18:19:18 +08:00
final data = message["data"];
authToken = data["authToken"];
webToken = data["webToken"];
releaseInfo = data["releaseInfo"];
avatarUrl = data["avatar"]
?.toString()
.replaceAll("url(\"", "")
.replaceAll("\")", "");
Map<String, dynamic> payload = Jwt.parseJwt(authToken!);
nickname = payload["nickname"] ?? "";
2023-10-28 19:15:13 +08:00
_readyForLaunch();
2023-10-28 18:19:18 +08:00
}, useLocalization: true);
}
goWebView(String title, String url,
{bool useLocalization = false,
bool loginMode = false,
RsiLoginCallback? rsiLoginCallback}) async {
if (useLocalization) {
const tipVersion = 2;
final box = await Hive.openBox("app_conf");
final skip = await box.get("skip_web_login_version", defaultValue: 0);
if (skip != tipVersion) {
final ok = await showConfirmDialogs(
context!,
"星际公民盒子一键启动",
const Text(
"本功能可以帮您更加便利的启动游戏。\n\n为确保账户安全 ,本功能使用汉化浏览器保留登录状态,且不会保存您的密码信息,与 RSI 启动器行为一致。"
"\n\n使用此功能登录账号时请确保您的 星际公民盒子 是从可信任的来源下载。",
style: TextStyle(fontSize: 16),
),
constraints: BoxConstraints(
maxWidth: MediaQuery.of(context!).size.width * .6));
if (!ok) {
if (loginMode) {
rsiLoginCallback?.call(null, false);
}
return;
}
await box.put("skip_web_login_version", tipVersion);
}
}
if (!await WebviewWindow.isWebviewAvailable()) {
await showToast(context!, "需要安装 WebView2 Runtime");
await launchUrlString(
"https://developer.microsoft.com/en-us/microsoft-edge/webview2/");
Navigator.pop(context!);
return;
}
final webViewModel = WebViewModel(context!,
loginMode: loginMode,
loginCallback: rsiLoginCallback,
loginChannel: getChannelID());
if (useLocalization) {
try {
await webViewModel.initLocalization();
} catch (_) {}
}
await webViewModel.initWebView(
title: title,
);
await webViewModel.launch(url);
notifyListeners();
}
2023-10-28 19:15:13 +08:00
// onSaveEmail() async {
// final RegExp emailRegex = RegExp(r'^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$');
// if (!emailRegex.hasMatch(emailCtrl.text.trim())) {
// showToast(context!, "邮箱输入有误!");
// return;
// }
// final emailBox = await Hive.openBox("quick_login_email");
// await emailBox.put(nickname, emailCtrl.text.trim());
// _readyForLaunch();
// notifyListeners();
// }
2023-10-28 18:19:18 +08:00
Future<void> _readyForLaunch() async {
loginStatus = 2;
notifyListeners();
final launchData = {
2023-10-28 19:15:13 +08:00
"username": "",
2023-10-28 18:19:18 +08:00
"token": webToken,
"auth_token": authToken,
"star_network": {
"services_endpoint": releaseInfo?["servicesEndpoint"],
"hostname": releaseInfo?["universeHost"],
"port": releaseInfo?["universePort"],
},
"TMid": const Uuid().v4(),
};
final executable = releaseInfo?["executable"];
final launchOptions = releaseInfo?["launchOptions"];
dPrint("----------launch data ====== -----------\n$launchData");
dPrint(
"----------executable data ====== -----------\n$installPath\\$executable $launchOptions");
final launchFile = File("$installPath\\loginData.json");
if (await launchFile.exists()) {
await launchFile.delete();
}
await launchFile.create();
await launchFile.writeAsString(json.encode(launchData));
notifyListeners();
await Future.delayed(const Duration(seconds: 1));
homeUIModel.doLaunchGame(
'$installPath\\$executable',
["-no_login_dialog", ...launchOptions.toString().split(" ")],
installPath);
await Future.delayed(const Duration(seconds: 3));
Navigator.pop(context!);
}
String getChannelID() {
if (installPath.endsWith("\\LIVE")) {
return "LIVE";
} else if (installPath.endsWith("\\PTU")) {
return "PTU";
} else if (installPath.endsWith("\\EVO")) {
return "EVO";
}
return "LIVE";
}
}