improve:用户分级

This commit is contained in:
2025-09-06 20:02:50 +08:00
parent 545aecc6ae
commit 61fa618673
2 changed files with 93 additions and 3 deletions
+2 -2
View File
@@ -513,7 +513,7 @@ namespace Ink_Canvas.Helpers
// 尝试获取当前版本的发布时间
DateTime? currentVersionReleaseTime = await GetVersionReleaseTime(localVersion, channel);
bool shouldPush = DeviceIdentifier.ShouldPushUpdate(apiVersion, releaseTime, true, currentVersionReleaseTime); // 明确标记为自动更新
bool shouldPush = DeviceIdentifier.ShouldPushUpdate(apiVersion, releaseTime, true, currentVersionReleaseTime, localVersion); // 明确标记为自动更新
if (!shouldPush)
{
var priority = DeviceIdentifier.GetUpdatePriority();
@@ -569,7 +569,7 @@ namespace Ink_Canvas.Helpers
// 尝试获取当前版本的发布时间
DateTime? currentVersionReleaseTime = await GetVersionReleaseTime(localVersion, channel);
bool shouldPush = DeviceIdentifier.ShouldPushUpdate(remoteVersion, DateTime.Now, true, currentVersionReleaseTime); // 明确标记为自动更新
bool shouldPush = DeviceIdentifier.ShouldPushUpdate(remoteVersion, DateTime.Now, true, currentVersionReleaseTime, localVersion); // 明确标记为自动更新
if (!shouldPush)
{
var priority = DeviceIdentifier.GetUpdatePriority();
+91 -1
View File
@@ -1084,7 +1084,7 @@ namespace Ink_Canvas.Helpers
/// <param name="isAutoUpdate">是否为自动更新检查(默认true,false表示版本修复)</param>
/// <param name="currentVersionReleaseTime">当前版本发布时间</param>
/// <returns>是否应该推送更新</returns>
public static bool ShouldPushUpdate(string updateVersion, DateTime releaseTime, bool isAutoUpdate = true, DateTime? currentVersionReleaseTime = null)
public static bool ShouldPushUpdate(string updateVersion, DateTime releaseTime, bool isAutoUpdate = true, DateTime? currentVersionReleaseTime = null, string localVersion = null)
{
try
{
@@ -1116,6 +1116,25 @@ namespace Ink_Canvas.Helpers
daysBetweenVersions = (DateTime.Now - releaseTime).TotalDays;
}
// 当无法获取版本发布时间时,判断版本号差异
if (!currentVersionReleaseTime.HasValue && !string.IsNullOrEmpty(localVersion))
{
int versionDiff = CalculateVersionGenerationDifference(localVersion, updateVersion);
LogHelper.WriteLogToFile($"DeviceIdentifier | 无法获取版本发布时间,使用版本号差异判断 - 本地版本: {localVersion}, 远程版本: {updateVersion}, 代数差异: {versionDiff}");
// 当版本号代数差异大于3时自动更新
if (versionDiff > 3)
{
LogHelper.WriteLogToFile($"DeviceIdentifier | 版本号代数差异({versionDiff})大于3,自动更新");
return true;
}
else
{
LogHelper.WriteLogToFile($"DeviceIdentifier | 版本号代数差异({versionDiff})不大于3,暂不更新");
return false;
}
}
// 计算最近活跃度(最后一次使用距今的天数)
var daysSinceLastUse = (DateTime.Now - stats.LastLaunchTime).TotalDays;
@@ -1295,6 +1314,77 @@ namespace Ink_Canvas.Helpers
}
}
/// <summary>
/// 计算版本号代数差异
/// </summary>
/// <param name="localVersion">本地版本号</param>
/// <param name="remoteVersion">远程版本号</param>
/// <returns>版本号代数差异,如果无法计算则返回0</returns>
private static int CalculateVersionGenerationDifference(string localVersion, string remoteVersion)
{
try
{
if (string.IsNullOrEmpty(localVersion) || string.IsNullOrEmpty(remoteVersion))
return 0;
// 移除可能的前缀(如 "v"
var cleanLocal = localVersion.TrimStart('v', 'V');
var cleanRemote = remoteVersion.TrimStart('v', 'V');
// 解析版本号 (格式: X.X.X.X)
var localParts = cleanLocal.Split('.');
var remoteParts = cleanRemote.Split('.');
if (localParts.Length < 4 || remoteParts.Length < 4)
return 0;
// 解析四个版本号部分
if (int.TryParse(localParts[0], out int localMajor) &&
int.TryParse(localParts[1], out int localMinor) &&
int.TryParse(localParts[2], out int localBuild) &&
int.TryParse(localParts[3], out int localRevision) &&
int.TryParse(remoteParts[0], out int remoteMajor) &&
int.TryParse(remoteParts[1], out int remoteMinor) &&
int.TryParse(remoteParts[2], out int remoteBuild) &&
int.TryParse(remoteParts[3], out int remoteRevision))
{
// 计算代数差异:主版本号差异 * 1000 + 次版本号差异 * 100 + 构建号差异 * 10 + 修订号差异
int majorDiff = remoteMajor - localMajor;
int minorDiff = remoteMinor - localMinor;
int buildDiff = remoteBuild - localBuild;
int revisionDiff = remoteRevision - localRevision;
// 如果主版本号不同,则代数差异很大
if (majorDiff != 0)
{
return majorDiff * 1000 + minorDiff * 100 + buildDiff * 10 + revisionDiff;
}
// 如果次版本号不同,则代数差异中等
if (minorDiff != 0)
{
return minorDiff * 100 + buildDiff * 10 + revisionDiff;
}
// 如果构建号不同,则代数差异较小
if (buildDiff != 0)
{
return buildDiff * 10 + revisionDiff;
}
// 只有修订号不同,代数差异最小
return revisionDiff;
}
return 0;
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"DeviceIdentifier | 计算版本号代数差异失败: {ex.Message}", LogHelper.LogType.Warning);
return 0;
}
}
/// <summary>
/// 根据更新类型获取紧急程度倍数(仅用于自动更新分级)
/// </summary>