From 28f65b37902786b359d4230cdc1ef2999076c47f Mon Sep 17 00:00:00 2001
From: CJKmkp <2564608840@qq.com>
Date: Fri, 6 Feb 2026 23:12:54 +0800
Subject: [PATCH] =?UTF-8?q?add:Dlass=E9=81=A5=E6=B5=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Ink Canvas/Helpers/TelemetryUploader.cs | 149 ++++++++++++++++++++++++
Ink Canvas/MainWindow.xaml.cs | 3 +
2 files changed, 152 insertions(+)
create mode 100644 Ink Canvas/Helpers/TelemetryUploader.cs
diff --git a/Ink Canvas/Helpers/TelemetryUploader.cs b/Ink Canvas/Helpers/TelemetryUploader.cs
new file mode 100644
index 00000000..2a728e7a
--- /dev/null
+++ b/Ink Canvas/Helpers/TelemetryUploader.cs
@@ -0,0 +1,149 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using System.Threading.Tasks;
+using Sentry;
+
+namespace Ink_Canvas.Helpers
+{
+ ///
+ /// 遥测上传辅助类:根据用户设置,通过 Sentry 上传 usage_stats.enc 和 Crashes 目录的摘要信息。
+ ///
+ internal static class TelemetryUploader
+ {
+ ///
+ /// 根据当前设置决定是否上传遥测数据。
+ /// 在主窗口加载完成后调用一次即可。
+ ///
+ public static Task UploadTelemetryIfNeededAsync()
+ {
+ return Task.Run(() =>
+ {
+ try
+ {
+ var settings = MainWindow.Settings;
+ if (settings == null || settings.Startup == null)
+ {
+ return;
+ }
+
+ var level = settings.Startup.TelemetryUploadLevel;
+ if (level == TelemetryUploadLevel.None)
+ {
+ return; // 用户未开启
+ }
+
+ // 获取并校验设备ID
+ string deviceId = DeviceIdentifier.GetDeviceId();
+ if (string.IsNullOrWhiteSpace(deviceId) || deviceId.Length < 5)
+ {
+ LogHelper.WriteLogToFile("TelemetryUploader | 设备ID无效,取消遥测上传", LogHelper.LogType.Warning);
+ return;
+ }
+
+ // 读取 usage_stats.enc 作为基础数据
+ string usageStatsPath = Path.Combine(App.RootPath, "usage_stats.enc");
+ string usageStatsContent = null;
+ if (File.Exists(usageStatsPath))
+ {
+ try
+ {
+ usageStatsContent = File.ReadAllText(usageStatsPath);
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile(
+ $"TelemetryUploader | 读取 usage_stats.enc 失败: {ex.Message}",
+ LogHelper.LogType.Warning);
+ }
+ }
+
+ // 可选:读取 Crashes 目录下的崩溃日志(仅在扩展模式时上传)
+ List