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.