From 93ee1a338614c01644f031ff1a0a812c90f46aa2 Mon Sep 17 00:00:00 2001
From: Lightczx <1686188646@qq.com>
Date: Sun, 30 Jul 2023 12:47:22 +0800
Subject: [PATCH] fix CI
---
.../Automation/DependencyPropertyGenerator.cs | 8 ++++-
.../UniversalAnalyzer.cs | 31 ++++++++++++++-----
.../Snap.Hutao/Control/Media/Rgba32.cs | 2 +-
.../Snap.Hutao/Control/ScopedPage.cs | 2 +-
.../Snap.Hutao/Core/Caching/IImageCache.cs | 2 +-
.../Snap.Hutao/Core/Caching/ImageCache.cs | 3 +-
.../Core/Database/QueryableExtension.cs | 4 +--
.../Core/IO/DataTransfer/ClipboardInterop.cs | 2 +-
.../Core/IO/DataTransfer/IClipboardInterop.cs | 2 +-
.../Snap.Hutao/Core/IO/Hashing/MD5.cs | 4 +--
.../Snap.Hutao/Core/IO/Hashing/XXH64.cs | 4 +--
.../Snap.Hutao/Core/IO/PickerExtension.cs | 6 ++--
.../Snap.Hutao/Core/IO/StreamCopyWorker.cs | 4 +--
.../Snap.Hutao/Core/IO/ValueFile.cs | 4 +--
.../Snap.Hutao/Core/LifeCycle/Activation.cs | 16 +++++-----
.../Snap.Hutao/Core/Logging/DebugLogger.cs | 1 +
.../Snap.Hutao/Core/Setting/SettingKeys.cs | 1 -
.../Snap.Hutao/Core/Shell/IJumpListInterop.cs | 2 +-
.../Snap.Hutao/Core/Shell/JumpListInterop.cs | 2 +-
.../Snap.Hutao/Core/Threading/AsyncBarrier.cs | 6 ++--
.../Snap.Hutao/Core/Threading/Delay.cs | 4 +--
.../Core/Threading/TaskExtension.cs | 15 +++++++++
.../Extension/EnumerableExtension.cs | 2 ++
.../Snap.Hutao/Extension/ObjectExtension.cs | 4 ++-
.../Model/InterChange/Inventory/UIIF.cs | 9 ++++++
.../Service/Game/Package/PackageConverter.cs | 18 +++++------
.../Snap.Hutao/Web/ApiOsEndpoints.cs | 2 --
.../Web/Hoyolab/Bbs/User/UserClient.cs | 6 ++--
.../Web/Request/QueryString/QueryString.cs | 3 ++
29 files changed, 112 insertions(+), 57 deletions(-)
diff --git a/src/Snap.Hutao/Snap.Hutao.SourceGeneration/Automation/DependencyPropertyGenerator.cs b/src/Snap.Hutao/Snap.Hutao.SourceGeneration/Automation/DependencyPropertyGenerator.cs
index e1622a73..de81e620 100644
--- a/src/Snap.Hutao/Snap.Hutao.SourceGeneration/Automation/DependencyPropertyGenerator.cs
+++ b/src/Snap.Hutao/Snap.Hutao.SourceGeneration/Automation/DependencyPropertyGenerator.cs
@@ -138,6 +138,12 @@ internal sealed class DependencyPropertyGenerator : IIncrementalGenerator
return boolValue ? "true" : "false";
}
- return typedConstant.Value!.ToString();
+ string result = typedConstant.Value!.ToString();
+ if (string.IsNullOrEmpty(result))
+ {
+ return default;
+ }
+
+ return result;
}
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao.SourceGeneration/UniversalAnalyzer.cs b/src/Snap.Hutao/Snap.Hutao.SourceGeneration/UniversalAnalyzer.cs
index d46f3fdf..6989c39b 100644
--- a/src/Snap.Hutao/Snap.Hutao.SourceGeneration/UniversalAnalyzer.cs
+++ b/src/Snap.Hutao/Snap.Hutao.SourceGeneration/UniversalAnalyzer.cs
@@ -40,7 +40,7 @@ internal sealed class UniversalAnalyzer : DiagnosticAnalyzer
context.RegisterCompilationStartAction(CompilationStart);
}
- private void CompilationStart(CompilationStartAnalysisContext context)
+ private static void CompilationStart(CompilationStartAnalysisContext context)
{
SyntaxKind[] types = new SyntaxKind[]
{
@@ -50,13 +50,14 @@ internal sealed class UniversalAnalyzer : DiagnosticAnalyzer
SyntaxKind.EnumDeclaration
};
- context.RegisterSyntaxNodeAction(HandleTypeDeclaration, types);
+ context.RegisterSyntaxNodeAction(HandleTypeShouldBeInternal, types);
- context.RegisterSyntaxNodeAction(HandleMethodDeclaration, SyntaxKind.MethodDeclaration);
- context.RegisterSyntaxNodeAction(HandleConstructorDeclaration, SyntaxKind.ConstructorDeclaration);
+ context.RegisterSyntaxNodeAction(HandleMethodParameterShouldUseRefLikeKeyword, SyntaxKind.MethodDeclaration);
+ context.RegisterSyntaxNodeAction(HandleMethodReturnTypeShouldUseValueTaskInsteadOfTask, SyntaxKind.MethodDeclaration);
+ context.RegisterSyntaxNodeAction(HandleConstructorParameterShouldUseRefLikeKeyword, SyntaxKind.ConstructorDeclaration);
}
- private void HandleTypeDeclaration(SyntaxNodeAnalysisContext context)
+ private static void HandleTypeShouldBeInternal(SyntaxNodeAnalysisContext context)
{
BaseTypeDeclarationSyntax syntax = (BaseTypeDeclarationSyntax)context.Node;
@@ -90,15 +91,31 @@ internal sealed class UniversalAnalyzer : DiagnosticAnalyzer
}
}
- private void HandleMethodDeclaration(SyntaxNodeAnalysisContext context)
+ private static void HandleMethodReturnTypeShouldUseValueTaskInsteadOfTask(SyntaxNodeAnalysisContext context)
{
MethodDeclarationSyntax methodSyntax = (MethodDeclarationSyntax)context.Node;
IMethodSymbol methodSymbol = context.SemanticModel.GetDeclaredSymbol(methodSyntax)!;
+
+ // 跳过重载方法
+ if (methodSyntax.Modifiers.Any(token => token.IsKind(SyntaxKind.OverrideKeyword)))
+ {
+ return;
+ }
+
if (methodSymbol.ReturnType.IsOrInheritsFrom("System.Threading.Tasks.Task"))
{
Location location = methodSyntax.ReturnType.GetLocation();
Diagnostic diagnostic = Diagnostic.Create(useValueTaskIfPossibleDescriptor, location);
context.ReportDiagnostic(diagnostic);
+ }
+ }
+
+ private static void HandleMethodParameterShouldUseRefLikeKeyword(SyntaxNodeAnalysisContext context)
+ {
+ MethodDeclarationSyntax methodSyntax = (MethodDeclarationSyntax)context.Node;
+ IMethodSymbol methodSymbol = context.SemanticModel.GetDeclaredSymbol(methodSyntax)!;
+ if (methodSymbol.ReturnType.IsOrInheritsFrom("System.Threading.Tasks.Task"))
+ {
return;
}
@@ -150,7 +167,7 @@ internal sealed class UniversalAnalyzer : DiagnosticAnalyzer
}
}
- private void HandleConstructorDeclaration(SyntaxNodeAnalysisContext context)
+ private static void HandleConstructorParameterShouldUseRefLikeKeyword(SyntaxNodeAnalysisContext context)
{
ConstructorDeclarationSyntax constructorSyntax = (ConstructorDeclarationSyntax)context.Node;
diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Media/Rgba32.cs b/src/Snap.Hutao/Snap.Hutao/Control/Media/Rgba32.cs
index 06ed364f..fcfec9d4 100644
--- a/src/Snap.Hutao/Snap.Hutao/Control/Media/Rgba32.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Control/Media/Rgba32.cs
@@ -143,7 +143,7 @@ internal struct Rgba32
/// 转换到 HSL 颜色
///
/// HSL 颜色
- public HslColor ToHsl()
+ public readonly HslColor ToHsl()
{
const double toDouble = 1.0 / 255;
double r = toDouble * R;
diff --git a/src/Snap.Hutao/Snap.Hutao/Control/ScopedPage.cs b/src/Snap.Hutao/Snap.Hutao/Control/ScopedPage.cs
index 20f94689..f84c7a7e 100644
--- a/src/Snap.Hutao/Snap.Hutao/Control/ScopedPage.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Control/ScopedPage.cs
@@ -54,7 +54,7 @@ internal class ScopedPage : Page
///
/// 额外内容
/// 任务
- public async Task NotifyRecipientAsync(INavigationData extra)
+ public async ValueTask NotifyRecipientAsync(INavigationData extra)
{
if (extra.Data != null && DataContext is INavigationRecipient recipient)
{
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Caching/IImageCache.cs b/src/Snap.Hutao/Snap.Hutao/Core/Caching/IImageCache.cs
index a6c12c93..bda29579 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/Caching/IImageCache.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/Caching/IImageCache.cs
@@ -17,7 +17,7 @@ internal interface IImageCache : ICastService
///
/// Uri of the item.
/// a string path
- Task GetFileFromCacheAsync(Uri uri);
+ ValueTask GetFileFromCacheAsync(Uri uri);
///
/// Removed items based on uri list passed
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Caching/ImageCache.cs b/src/Snap.Hutao/Snap.Hutao/Core/Caching/ImageCache.cs
index e1c592bc..47c45c0e 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/Caching/ImageCache.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/Caching/ImageCache.cs
@@ -93,7 +93,7 @@ internal sealed class ImageCache : IImageCache, IImageCacheFilePathOperation
}
///
- public async Task GetFileFromCacheAsync(Uri uri)
+ public async ValueTask GetFileFromCacheAsync(Uri uri)
{
string fileName = GetCacheFileName(uri);
string filePath = Path.Combine(GetCacheFolder(), fileName);
@@ -166,6 +166,7 @@ internal sealed class ImageCache : IImageCache, IImageCacheFilePathOperation
}
}
+ [SuppressMessage("", "SH003")]
private async Task DownloadFileAsync(Uri uri, string baseFile)
{
logger.LogInformation("Begin downloading for {Uri}", uri);
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Database/QueryableExtension.cs b/src/Snap.Hutao/Snap.Hutao/Core/Database/QueryableExtension.cs
index 49174089..b04feb64 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/Database/QueryableExtension.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/Database/QueryableExtension.cs
@@ -35,8 +35,8 @@ internal static class QueryableExtension
/// 取消令牌
/// SQL返回个数
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static Task ExecuteDeleteWhereAsync(this IQueryable source, Expression> predicate, CancellationToken token = default)
+ public static ValueTask ExecuteDeleteWhereAsync(this IQueryable source, Expression> predicate, CancellationToken token = default)
{
- return source.Where(predicate).ExecuteDeleteAsync(token);
+ return source.Where(predicate).ExecuteDeleteAsync(token).AsValueTask();
}
}
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/IO/DataTransfer/ClipboardInterop.cs b/src/Snap.Hutao/Snap.Hutao/Core/IO/DataTransfer/ClipboardInterop.cs
index 002e3bf4..44b3d3ec 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/IO/DataTransfer/ClipboardInterop.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/IO/DataTransfer/ClipboardInterop.cs
@@ -17,7 +17,7 @@ internal sealed partial class ClipboardInterop : IClipboardInterop
private readonly ITaskContext taskContext;
///
- public async Task DeserializeFromJsonAsync()
+ public async ValueTask DeserializeFromJsonAsync()
where T : class
{
await taskContext.SwitchToMainThreadAsync();
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/IO/DataTransfer/IClipboardInterop.cs b/src/Snap.Hutao/Snap.Hutao/Core/IO/DataTransfer/IClipboardInterop.cs
index c6d61118..38b77041 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/IO/DataTransfer/IClipboardInterop.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/IO/DataTransfer/IClipboardInterop.cs
@@ -15,7 +15,7 @@ internal interface IClipboardInterop
///
/// 目标类型
/// 实例
- Task DeserializeFromJsonAsync()
+ ValueTask DeserializeFromJsonAsync()
where T : class;
///
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/IO/Hashing/MD5.cs b/src/Snap.Hutao/Snap.Hutao/Core/IO/Hashing/MD5.cs
index 688308e3..52c50631 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/IO/Hashing/MD5.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/IO/Hashing/MD5.cs
@@ -17,7 +17,7 @@ internal static class MD5
/// 文件路径
/// 取消令牌
/// 文件 Md5 摘要
- public static async Task HashFileAsync(string filePath, CancellationToken token = default)
+ public static async ValueTask HashFileAsync(string filePath, CancellationToken token = default)
{
await using (FileStream stream = File.OpenRead(filePath))
{
@@ -31,7 +31,7 @@ internal static class MD5
/// 流
/// 取消令牌
/// 流 Md5 摘要
- public static async Task HashAsync(Stream stream, CancellationToken token = default)
+ public static async ValueTask HashAsync(Stream stream, CancellationToken token = default)
{
using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create())
{
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/IO/Hashing/XXH64.cs b/src/Snap.Hutao/Snap.Hutao/Core/IO/Hashing/XXH64.cs
index 292599d0..e68d285a 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/IO/Hashing/XXH64.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/IO/Hashing/XXH64.cs
@@ -17,7 +17,7 @@ internal static class XXH64
/// 流
/// 取消令牌
/// 摘要
- public static async Task HashAsync(Stream stream, CancellationToken token = default)
+ public static async ValueTask HashAsync(Stream stream, CancellationToken token = default)
{
XxHash64 xxHash64 = new();
await xxHash64.AppendAsync(stream, token).ConfigureAwait(false);
@@ -31,7 +31,7 @@ internal static class XXH64
/// 路径
/// 取消令牌
/// 摘要
- public static async Task HashFileAsync(string path, CancellationToken token = default)
+ public static async ValueTask HashFileAsync(string path, CancellationToken token = default)
{
await using (FileStream stream = File.OpenRead(path))
{
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/IO/PickerExtension.cs b/src/Snap.Hutao/Snap.Hutao/Core/IO/PickerExtension.cs
index 288b8864..da877636 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/IO/PickerExtension.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/IO/PickerExtension.cs
@@ -13,7 +13,7 @@ namespace Snap.Hutao.Core.IO;
internal static class PickerExtension
{
///
- public static async Task> TryPickSingleFileAsync(this FileOpenPicker picker)
+ public static async ValueTask> TryPickSingleFileAsync(this FileOpenPicker picker)
{
StorageFile? file;
Exception? exception = null;
@@ -39,7 +39,7 @@ internal static class PickerExtension
}
///
- public static async Task> TryPickSaveFileAsync(this FileSavePicker picker)
+ public static async ValueTask> TryPickSaveFileAsync(this FileSavePicker picker)
{
StorageFile? file;
Exception? exception = null;
@@ -65,7 +65,7 @@ internal static class PickerExtension
}
///
- public static async Task> TryPickSingleFolderAsync(this FolderPicker picker)
+ public static async ValueTask> TryPickSingleFolderAsync(this FolderPicker picker)
{
StorageFolder? folder;
Exception? exception = null;
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/IO/StreamCopyWorker.cs b/src/Snap.Hutao/Snap.Hutao/Core/IO/StreamCopyWorker.cs
index e5bb2c04..022ac66d 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/IO/StreamCopyWorker.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/IO/StreamCopyWorker.cs
@@ -38,7 +38,7 @@ internal sealed class StreamCopyWorker
///
/// 进度
/// 任务
- public async Task CopyAsync(IProgress progress)
+ public async ValueTask CopyAsync(IProgress progress)
{
long totalBytesRead = 0;
int bytesRead;
@@ -91,7 +91,7 @@ internal sealed class StreamCopyWorker
///
/// 进度
/// 任务
- public async Task CopyAsync(IProgress progress)
+ public async ValueTask CopyAsync(IProgress progress)
{
long totalBytesRead = 0;
int bytesRead;
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/IO/ValueFile.cs b/src/Snap.Hutao/Snap.Hutao/Core/IO/ValueFile.cs
index f4646315..8e48cc36 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/IO/ValueFile.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/IO/ValueFile.cs
@@ -37,7 +37,7 @@ internal readonly struct ValueFile
/// 内容的类型
/// 序列化选项
/// 操作是否成功,反序列化后的内容
- public async Task> DeserializeFromJsonAsync(JsonSerializerOptions options)
+ public async ValueTask> DeserializeFromJsonAsync(JsonSerializerOptions options)
where T : class
{
try
@@ -62,7 +62,7 @@ internal readonly struct ValueFile
/// 对象
/// 序列化选项
/// 操作是否成功
- public async Task SerializeToJsonAsync(T obj, JsonSerializerOptions options)
+ public async ValueTask SerializeToJsonAsync(T obj, JsonSerializerOptions options)
{
try
{
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs
index a39af1a4..6db3c109 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs
@@ -103,7 +103,7 @@ internal sealed class Activation : IActivation
}
}
- private async Task HandleActivationAsync(AppActivationArguments args, bool isRedirected)
+ private async ValueTask HandleActivationAsync(AppActivationArguments args, bool isRedirected)
{
if (activateSemaphore.CurrentCount > 0)
{
@@ -114,7 +114,7 @@ internal sealed class Activation : IActivation
}
}
- private async Task HandleActivationCoreAsync(AppActivationArguments args, bool isRedirected)
+ private async ValueTask HandleActivationCoreAsync(AppActivationArguments args, bool isRedirected)
{
if (args.Kind == ExtendedActivationKind.Protocol)
{
@@ -145,7 +145,7 @@ internal sealed class Activation : IActivation
}
}
- private async Task HandleNormalLaunchActionAsync()
+ private async ValueTask HandleNormalLaunchActionAsync()
{
// Increase launch times
LocalSetting.Set(SettingKeys.LaunchTimes, LocalSetting.Get(SettingKeys.LaunchTimes, 0) + 1);
@@ -161,7 +161,7 @@ internal sealed class Activation : IActivation
}
}
- private async Task WaitMainWindowAsync()
+ private async ValueTask WaitMainWindowAsync()
{
if (!mainWindowReference.TryGetTarget(out _))
{
@@ -183,7 +183,7 @@ internal sealed class Activation : IActivation
}
}
- private async Task HandleUrlActivationAsync(Uri uri, bool isRedirected)
+ private async ValueTask HandleUrlActivationAsync(Uri uri, bool isRedirected)
{
UriBuilder builder = new(uri);
@@ -214,7 +214,7 @@ internal sealed class Activation : IActivation
}
}
- private async Task HandleAchievementActionAsync(string action, string parameter, bool isRedirected)
+ private async ValueTask HandleAchievementActionAsync(string action, string parameter, bool isRedirected)
{
_ = parameter;
_ = isRedirected;
@@ -234,7 +234,7 @@ internal sealed class Activation : IActivation
}
}
- private async Task HandleDailyNoteActionAsync(string action, string parameter, bool isRedirected)
+ private async ValueTask HandleDailyNoteActionAsync(string action, string parameter, bool isRedirected)
{
_ = parameter;
switch (action)
@@ -258,7 +258,7 @@ internal sealed class Activation : IActivation
}
}
- private async Task HandleLaunchGameActionAsync(string? uid = null)
+ private async ValueTask HandleLaunchGameActionAsync(string? uid = null)
{
serviceProvider
.GetRequiredService()
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Logging/DebugLogger.cs b/src/Snap.Hutao/Snap.Hutao/Core/Logging/DebugLogger.cs
index bef2323b..4ce526d0 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/Logging/DebugLogger.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/Logging/DebugLogger.cs
@@ -36,6 +36,7 @@ internal sealed class DebugLogger : ILogger
}
///
+ [SuppressMessage("", "SH002")]
public void Log(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func formatter)
{
if (!IsEnabled(logLevel))
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Setting/SettingKeys.cs b/src/Snap.Hutao/Snap.Hutao/Core/Setting/SettingKeys.cs
index ba4f6c04..e705146f 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/Setting/SettingKeys.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/Setting/SettingKeys.cs
@@ -7,7 +7,6 @@ namespace Snap.Hutao.Core.Setting;
/// 设置键
///
[HighQuality]
-[SuppressMessage("", "SA1124")]
internal static class SettingKeys
{
///
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Shell/IJumpListInterop.cs b/src/Snap.Hutao/Snap.Hutao/Core/Shell/IJumpListInterop.cs
index 73d8bc9d..1da9460b 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/Shell/IJumpListInterop.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/Shell/IJumpListInterop.cs
@@ -12,5 +12,5 @@ internal interface IJumpListInterop
/// 异步配置跳转列表
///
/// 任务
- Task ConfigureAsync();
+ ValueTask ConfigureAsync();
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Shell/JumpListInterop.cs b/src/Snap.Hutao/Snap.Hutao/Core/Shell/JumpListInterop.cs
index 615b0e10..e618eb3b 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/Shell/JumpListInterop.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/Shell/JumpListInterop.cs
@@ -17,7 +17,7 @@ internal sealed class JumpListInterop : IJumpListInterop
/// 异步配置跳转列表
///
/// 任务
- public async Task ConfigureAsync()
+ public async ValueTask ConfigureAsync()
{
if (JumpList.IsSupported())
{
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Threading/AsyncBarrier.cs b/src/Snap.Hutao/Snap.Hutao/Core/Threading/AsyncBarrier.cs
index 8cbb61c2..3a1bdb92 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/Threading/AsyncBarrier.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/Threading/AsyncBarrier.cs
@@ -38,7 +38,7 @@ internal class AsyncBarrier
/// that completes when all other participants have also signaled ready.
///
/// A Task, which will complete (or may already be completed) when the last participant calls this method.
- public Task SignalAndWaitAsync()
+ public ValueTask SignalAndWaitAsync()
{
lock (waiters)
{
@@ -52,14 +52,14 @@ internal class AsyncBarrier
}
// And allow this one to continue immediately.
- return Task.CompletedTask;
+ return ValueTask.CompletedTask;
}
else
{
// We need more folks. So suspend this caller.
TaskCompletionSource tcs = new();
waiters.Enqueue(tcs);
- return tcs.Task;
+ return tcs.Task.AsValueTask();
}
}
}
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Threading/Delay.cs b/src/Snap.Hutao/Snap.Hutao/Core/Threading/Delay.cs
index f035d96c..599690a2 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/Threading/Delay.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/Threading/Delay.cs
@@ -11,8 +11,8 @@ internal readonly struct Delay
/// 最小,闭
/// 最小,开
/// 任务
- public static Task RandomAsync(int minMilliSeconds, int maxMilliSeconds)
+ public static ValueTask RandomAsync(int minMilliSeconds, int maxMilliSeconds)
{
- return Task.Delay((int)(System.Random.Shared.NextDouble() * (maxMilliSeconds - minMilliSeconds)) + minMilliSeconds);
+ return Task.Delay((int)(Random.Shared.NextDouble() * (maxMilliSeconds - minMilliSeconds)) + minMilliSeconds).AsValueTask();
}
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Threading/TaskExtension.cs b/src/Snap.Hutao/Snap.Hutao/Core/Threading/TaskExtension.cs
index 03aaf348..0c49be52 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/Threading/TaskExtension.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/Threading/TaskExtension.cs
@@ -2,6 +2,7 @@
// Licensed under the MIT license.
using Snap.Hutao.Core.ExceptionService;
+using System.Runtime.CompilerServices;
namespace Snap.Hutao.Core.Threading;
@@ -13,6 +14,20 @@ namespace Snap.Hutao.Core.Threading;
[SuppressMessage("", "VSTHRD100")]
internal static class TaskExtension
{
+ [SuppressMessage("", "VSTHRD200")]
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static ValueTask AsValueTask(this Task task)
+ {
+ return new(task);
+ }
+
+ [SuppressMessage("", "VSTHRD200")]
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static ValueTask AsValueTask(this Task task)
+ {
+ return new(task);
+ }
+
///
/// 安全的触发任务
///
diff --git a/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.cs b/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.cs
index f4b10ce2..46bfb50d 100644
--- a/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Extension/EnumerableExtension.cs
@@ -31,7 +31,9 @@ internal static partial class EnumerableExtension
/// 源的类型
/// 源
/// 集合
+#if NET8_0
[Obsolete("Use C# 12 Collection Literal instead")]
+#endif
public static IEnumerable Enumerate(this TSource source)
{
yield return source;
diff --git a/src/Snap.Hutao/Snap.Hutao/Extension/ObjectExtension.cs b/src/Snap.Hutao/Snap.Hutao/Extension/ObjectExtension.cs
index 977bb949..7c631bd3 100644
--- a/src/Snap.Hutao/Snap.Hutao/Extension/ObjectExtension.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Extension/ObjectExtension.cs
@@ -16,7 +16,9 @@ internal static class ObjectExtension
/// 数据类型
/// 源
/// 数组
- [Obsolete("Use C# 12 Collection Literals when we migrate")]
+#if NET8_0
+ [Obsolete("Use C# 12 Collection Literals")]
+#endif
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static T[] ToArray(this T source)
{
diff --git a/src/Snap.Hutao/Snap.Hutao/Model/InterChange/Inventory/UIIF.cs b/src/Snap.Hutao/Snap.Hutao/Model/InterChange/Inventory/UIIF.cs
index 294c30c7..8a56acb3 100644
--- a/src/Snap.Hutao/Snap.Hutao/Model/InterChange/Inventory/UIIF.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Model/InterChange/Inventory/UIIF.cs
@@ -32,4 +32,13 @@ internal sealed class UIIF
///
[JsonPropertyName("list")]
public List List { get; set; } = default!;
+
+ ///
+ /// 确认当前UIIF对象的版本是否受支持
+ ///
+ /// 当前UIIF对象是否受支持
+ public bool IsCurrentVersionSupported()
+ {
+ return SupportedVersion.Contains(Info?.UIIFVersion ?? string.Empty);
+ }
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs
index 05abdb5f..c30ed47f 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs
@@ -35,7 +35,7 @@ internal sealed partial class PackageConverter
/// 游戏目录
/// 进度
/// 替换结果与资源
- public async Task EnsureGameResourceAsync(LaunchScheme targetScheme, GameResource gameResource, string gameFolder, IProgress progress)
+ public async ValueTask EnsureGameResourceAsync(LaunchScheme targetScheme, GameResource gameResource, string gameFolder, IProgress progress)
{
string scatteredFilesUrl = gameResource.Game.Latest.DecompressedPath;
Uri pkgVersionUri = $"{scatteredFilesUrl}/pkg_version".ToUri();
@@ -56,7 +56,7 @@ internal sealed partial class PackageConverter
/// 游戏资源
/// 游戏文件夹
/// 任务
- public async Task EnsureDeprecatedFilesAndSdkAsync(GameResource resource, string gameFolder)
+ public async ValueTask EnsureDeprecatedFilesAndSdkAsync(GameResource resource, string gameFolder)
{
string sdkDllBackup = Path.Combine(gameFolder, YuanShenData, "Plugins\\PCGameSDK.dll.backup");
string sdkDll = Path.Combine(gameFolder, YuanShenData, "Plugins\\PCGameSDK.dll");
@@ -164,7 +164,7 @@ internal sealed partial class PackageConverter
File.Move(targetFullPath, cacheFilePath, true);
}
- private async Task> TryGetLocalItemsAsync(string gameFolder, ConvertDirection direction)
+ private async ValueTask> TryGetLocalItemsAsync(string gameFolder, ConvertDirection direction)
{
using (FileStream localSteam = File.OpenRead(Path.Combine(gameFolder, "pkg_version")))
{
@@ -172,7 +172,7 @@ internal sealed partial class PackageConverter
}
}
- private async Task> TryGetRemoteItemsAsync(Uri pkgVersionUri)
+ private async ValueTask> TryGetRemoteItemsAsync(Uri pkgVersionUri)
{
try
{
@@ -187,7 +187,7 @@ internal sealed partial class PackageConverter
}
}
- private async Task ReplaceGameResourceAsync(IEnumerable operations, string gameFolder, string scatteredFilesUrl, ConvertDirection direction, IProgress progress)
+ private async ValueTask ReplaceGameResourceAsync(IEnumerable operations, string gameFolder, string scatteredFilesUrl, ConvertDirection direction, IProgress progress)
{
// 重命名 _Data 目录
try
@@ -236,7 +236,7 @@ internal sealed partial class PackageConverter
return true;
}
- private async Task ReplaceFromCacheOrWebAsync(string cacheFilePath, string targetFilePath, string scatteredFilesUrl, ItemOperationInfo info, IProgress progress)
+ private async ValueTask ReplaceFromCacheOrWebAsync(string cacheFilePath, string targetFilePath, string scatteredFilesUrl, ItemOperationInfo info, IProgress progress)
{
if (File.Exists(cacheFilePath))
{
@@ -291,7 +291,7 @@ internal sealed partial class PackageConverter
}
}
- private async Task ReplacePackageVersionsAsync(string scatteredFilesUrl, string gameFolder)
+ private async ValueTask ReplacePackageVersionsAsync(string scatteredFilesUrl, string gameFolder)
{
foreach (string versionFilePath in Directory.EnumerateFiles(gameFolder, "*pkg_version"))
{
@@ -314,7 +314,7 @@ internal sealed partial class PackageConverter
}
}
- private async Task> GetRemoteVersionItemsAsync(Stream stream)
+ private async ValueTask> GetRemoteVersionItemsAsync(Stream stream)
{
Dictionary results = new();
using (StreamReader reader = new(stream))
@@ -334,7 +334,7 @@ internal sealed partial class PackageConverter
return results;
}
- private async Task> GetLocalVersionItemsAsync(Stream stream, ConvertDirection direction)
+ private async ValueTask> GetLocalVersionItemsAsync(Stream stream, ConvertDirection direction)
{
Dictionary results = new();
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/ApiOsEndpoints.cs b/src/Snap.Hutao/Snap.Hutao/Web/ApiOsEndpoints.cs
index 2bf522e0..84c8da26 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/ApiOsEndpoints.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/ApiOsEndpoints.cs
@@ -109,8 +109,6 @@ internal static class ApiOsEndpoints
/// Game Authkey
///
public const string BindingGenAuthKey = $"{ApiAccountOsBindingApi}/genAuthKey";
-
-
#endregion
#region BbsApiOsApi
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Bbs/User/UserClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Bbs/User/UserClient.cs
index 968616c9..caa32415 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Bbs/User/UserClient.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Bbs/User/UserClient.cs
@@ -32,9 +32,11 @@ internal sealed partial class UserClient : IUserClient
public async Task> GetUserFullInfoAsync(Model.Entity.User user, CancellationToken token = default)
{
Response? resp = await httpClient
- //.SetUser(user, CookieType.SToken)
+
+ // .SetUser(user, CookieType.SToken)
.SetReferer(ApiEndpoints.BbsReferer)
- //.UseDynamicSecret(DynamicSecretVersion.Gen1, SaltType.K2, true)
+
+ // .UseDynamicSecret(DynamicSecretVersion.Gen1, SaltType.K2, true)
.TryCatchGetFromJsonAsync>(ApiEndpoints.UserFullInfoQuery(user.Aid!), options, logger, token)
.ConfigureAwait(false);
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Request/QueryString/QueryString.cs b/src/Snap.Hutao/Snap.Hutao/Web/Request/QueryString/QueryString.cs
index 06e4e18f..a0703023 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Request/QueryString/QueryString.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Request/QueryString/QueryString.cs
@@ -38,11 +38,14 @@ internal readonly struct QueryString
}
}
+#if NET8_0
+
private static QueryString Parse(ReadOnlySpan value)
{
// TODO: .NET 8 ReadOnlySpan Split
return default;
}
+#endif
///
/// Parses a query string into a object. Keys/values are automatically URL decoded.