diff --git a/lib/api/analytics.dart b/lib/api/analytics.dart new file mode 100644 index 0000000..a97fded --- /dev/null +++ b/lib/api/analytics.dart @@ -0,0 +1,17 @@ +import 'package:dio/dio.dart'; +import 'package:starcitizen_doctor/common/conf.dart'; +import 'package:starcitizen_doctor/common/utils/base_utils.dart'; + +class AnalyticsApi { + static final Dio _dio = Dio(); + + static touch(String key) async { + dPrint("AnalyticsApi.touch === $key start"); + try { + await _dio.post("${AppConf.xkeycApiUrl}/analytics/$key"); + dPrint("AnalyticsApi.touch === $key over"); + } catch (e) { + dPrint("AnalyticsApi.touch === $key Error:$e"); + } + } +} diff --git a/lib/common/conf.dart b/lib/common/conf.dart index 1ac31be..fbdb0c6 100644 --- a/lib/common/conf.dart +++ b/lib/common/conf.dart @@ -4,8 +4,10 @@ import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter_acrylic/flutter_acrylic.dart'; import 'package:hive/hive.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:starcitizen_doctor/api/analytics.dart'; import 'package:starcitizen_doctor/api/api.dart'; import 'package:starcitizen_doctor/data/app_version_data.dart'; +import 'package:uuid/uuid.dart'; import 'package:window_manager/window_manager.dart'; import '../base/ui.dart'; @@ -26,6 +28,8 @@ class AppConf { static const String webTranslateHomeUrl = "https://jihulab.com/StarCitizenCN_Community/scweb_chinese_translate/-/raw/main/json/locales"; + static const String xkeycApiUrl = "https://sctoolbox.xkeyc.com"; + static late final String applicationSupportDir; static AppVersionData? networkVersionData; @@ -49,7 +53,11 @@ class AppConf { dPrint("applicationSupportDir == $applicationSupportDir"); try { Hive.init("$applicationSupportDir/db"); - await Hive.openBox("app_conf"); + final box = await Hive.openBox("app_conf"); + if (box.get("install_id", defaultValue: "") == "") { + await box.put("install_id", const Uuid().v4()); + AnalyticsApi.touch("firstLaunch"); + } } catch (e) { exit(1); } @@ -75,6 +83,7 @@ class AppConf { await Window.hideWindowControls(); }); await _checkUpdate(); + AnalyticsApi.touch("launch"); } static String getUpgradePath() { diff --git a/lib/ui/home/home_ui.dart b/lib/ui/home/home_ui.dart index 6092e15..4211832 100644 --- a/lib/ui/home/home_ui.dart +++ b/lib/ui/home/home_ui.dart @@ -2,6 +2,7 @@ import 'package:extended_image/extended_image.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:starcitizen_doctor/api/analytics.dart'; import 'package:starcitizen_doctor/base/ui.dart'; import 'package:url_launcher/url_launcher_string.dart'; @@ -106,7 +107,8 @@ class HomeUI extends BaseUI { webURL: "https://robertsspaceindustries.com", info: "罗伯茨航天工业公司,万物的起源", useLocalization: true, - width: width), + width: width, + touchKey: "webLocalization_rsi"), const SizedBox(height: 12), makeWebViewButton(model, icon: Row( @@ -123,7 +125,8 @@ class HomeUI extends BaseUI { webURL: "https://uexcorp.space", info: "采矿、精炼、贸易计算器、价格、船信息", useLocalization: true, - width: width), + width: width, + touchKey: "webLocalization_uex"), const SizedBox(height: 12), makeWebViewButton(model, icon: Row( @@ -140,7 +143,8 @@ class HomeUI extends BaseUI { webURL: "https://www.erkul.games/live/calculator", info: "在线改船,查询伤害数值和配件购买地点", useLocalization: true, - width: width), + width: width, + touchKey: "webLocalization_dps"), const SizedBox(height: 12), const Text("外部浏览器拓展:"), const SizedBox(height: 8), @@ -589,7 +593,8 @@ class HomeUI extends BaseUI { required String webURL, required bool useLocalization, required double width, - String? info}) { + String? info, + String? touchKey}) { return Container( width: width, decoration: BoxDecoration( @@ -622,8 +627,12 @@ class HomeUI extends BaseUI { ) ], ), - onPressed: () => - model.goWebView(webTitle, webURL, useLocalization: true)), + onPressed: () { + if (touchKey != null) { + AnalyticsApi.touch(touchKey); + } + model.goWebView(webTitle, webURL, useLocalization: true); + }), ), ); } diff --git a/lib/ui/home/home_ui_model.dart b/lib/ui/home/home_ui_model.dart index 4bdc1e4..d3c64da 100644 --- a/lib/ui/home/home_ui_model.dart +++ b/lib/ui/home/home_ui_model.dart @@ -5,6 +5,7 @@ import 'dart:io'; import 'package:desktop_webview_window/desktop_webview_window.dart'; import 'package:dio/dio.dart'; import 'package:hive/hive.dart'; +import 'package:starcitizen_doctor/api/analytics.dart'; import 'package:starcitizen_doctor/api/api.dart'; import 'package:starcitizen_doctor/base/ui_model.dart'; import 'package:starcitizen_doctor/common/conf.dart'; @@ -131,6 +132,7 @@ class HomeUIModel extends BaseUIModel { lastScreenInfo = "扫描完毕,共找到 ${scInstallPaths.length} 个有效安装目录"; } catch (e) { lastScreenInfo = "解析 log 文件失败!"; + AnalyticsApi.touch("error_launchLogs"); showToast(context!, "解析 log 文件失败! \n请关闭游戏,退出RSI启动器后重试,若仍有问题,请使用工具箱中的 RSI Launcher log 修复。"); } @@ -369,6 +371,7 @@ class HomeUIModel extends BaseUIModel { showToast(context!, "该功能需要一个有效的安装位置"); return; } + AnalyticsApi.touch("performance_launch"); BaseUIContainer( uiCreate: () => PerformanceUI(), modelCreate: () => PerformanceUIModel(scInstalledPath)) @@ -414,7 +417,7 @@ class HomeUIModel extends BaseUIModel { if (skip != tipVersion) { final ok = await showConfirmDialogs( context!, - "星际公民官网汉化", + "星际公民网站汉化", const Text( "本插功能件仅供大致浏览使用,不对任何有关本功能产生的问题负责!在涉及账号操作前请注意确认网站的原本内容!" "\n\n\n使用此功能登录账号时请确保您的 星际公民盒子 是从可信任的来源下载。", @@ -482,6 +485,7 @@ class HomeUIModel extends BaseUIModel { await Process.run("powershell.exe", ["ps \"StarCitizen\" | kill"]); return; } + AnalyticsApi.touch("gameLaunch"); showDialog( context: context!, dismissWithEsc: false, diff --git a/lib/ui/home/localization/localization_ui_model.dart b/lib/ui/home/localization/localization_ui_model.dart index 7eec3b1..b3694c8 100644 --- a/lib/ui/home/localization/localization_ui_model.dart +++ b/lib/ui/home/localization/localization_ui_model.dart @@ -4,6 +4,7 @@ import 'dart:io'; import 'package:archive/archive_io.dart'; import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; +import 'package:starcitizen_doctor/api/analytics.dart'; import 'package:starcitizen_doctor/api/api.dart'; import 'package:starcitizen_doctor/base/ui_model.dart'; import 'package:starcitizen_doctor/common/conf.dart'; @@ -128,6 +129,7 @@ class LocalizationUIModel extends BaseUIModel { VoidCallback? doRemoteInstall(ScLocalizationData value) { return () async { + AnalyticsApi.touch("install_localization"); final downloadUrl = "${AppConf.gitlabLocalizationUrl}/-/archive/${value.versionName}/LocalizationData-${value.versionName}.tar.bz2"; final savePath = diff --git a/lib/ui/home/performance/performance_ui_model.dart b/lib/ui/home/performance/performance_ui_model.dart index be6e24a..c3705e4 100644 --- a/lib/ui/home/performance/performance_ui_model.dart +++ b/lib/ui/home/performance/performance_ui_model.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:flutter/services.dart'; import 'package:hive/hive.dart'; +import 'package:starcitizen_doctor/api/analytics.dart'; import 'package:starcitizen_doctor/base/ui_model.dart'; import 'package:starcitizen_doctor/common/helper/log_helper.dart'; import 'package:starcitizen_doctor/data/game_performance_data.dart'; @@ -94,6 +95,7 @@ class PerformanceUIModel extends BaseUIModel { applyProfile(bool cleanShader) async { if (performanceMap == null) return; + AnalyticsApi.touch("performance_apply"); workingString = "生成配置文件"; notifyListeners(); String conf = ""; diff --git a/lib/ui/index_ui_model.dart b/lib/ui/index_ui_model.dart index 2104d41..87f1228 100644 --- a/lib/ui/index_ui_model.dart +++ b/lib/ui/index_ui_model.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:starcitizen_doctor/api/analytics.dart'; import 'package:starcitizen_doctor/base/ui_model.dart'; import 'package:starcitizen_doctor/global_ui_model.dart'; import 'package:starcitizen_doctor/ui/about/about_ui_model.dart'; @@ -58,6 +59,7 @@ class IndexUIModel extends BaseUIModel { await showToast(context!, "运行环境出错,请检查系统环境变量 (PATH)!"); await launchUrlString( "https://answers.microsoft.com/zh-hans/windows/forum/all/%E7%B3%BB%E7%BB%9F%E7%8E%AF%E5%A2%83%E5%8F%98/b88369e6-2620-4a77-b07a-d0af50894a07"); + await AnalyticsApi.touch("error_powershell"); exit(0); }