diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Threading/SpinWaitPolyfill.cs b/src/Snap.Hutao/Snap.Hutao/Core/Threading/SpinWaitPolyfill.cs index ef91c554..989ce35d 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/Threading/SpinWaitPolyfill.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/Threading/SpinWaitPolyfill.cs @@ -1,6 +1,8 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. +using System.Diagnostics; + namespace Snap.Hutao.Core.Threading; internal delegate bool SpinWaitPredicate(ref readonly T state); @@ -15,4 +17,23 @@ internal static class SpinWaitPolyfill spinner.SpinOnce(); } } + + [SuppressMessage("", "SH002")] + public static unsafe bool SpinUntil(ref T state, delegate* condition, TimeSpan timeout) + { + long startTime = Stopwatch.GetTimestamp(); + + SpinWait spinner = default; + while (!condition(ref state)) + { + spinner.SpinOnce(); + + if (timeout < Stopwatch.GetElapsedTime(startTime)) + { + return false; + } + } + + return true; + } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Properties/launchSettings.json b/src/Snap.Hutao/Snap.Hutao/Properties/launchSettings.json index a5fb2a14..36a6b395 100644 --- a/src/Snap.Hutao/Snap.Hutao/Properties/launchSettings.json +++ b/src/Snap.Hutao/Snap.Hutao/Properties/launchSettings.json @@ -2,7 +2,7 @@ "profiles": { "Snap.Hutao": { "commandName": "MsixPackage", - "nativeDebugging": false, + "nativeDebugging": true, "doNotLaunchApp": false, "allowLocalNetworkLoopbackProperty": true }, diff --git a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/IDailyNoteService.cs b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/IDailyNoteService.cs index 7ecd8120..7a32f72c 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/IDailyNoteService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/IDailyNoteService.cs @@ -7,32 +7,15 @@ using System.Collections.ObjectModel; namespace Snap.Hutao.Service.DailyNote; -/// -/// 实时便笺服务 -/// [HighQuality] internal interface IDailyNoteService { - /// - /// 添加实时便笺 - /// - /// 角色 - /// 任务 ValueTask AddDailyNoteAsync(UserAndUid userAndUid, CancellationToken token = default); ValueTask> GetDailyNoteEntryCollectionAsync(bool forceRefresh = false, CancellationToken token = default); - /// - /// 异步刷新实时便笺 - /// - /// 任务 ValueTask RefreshDailyNotesAsync(CancellationToken token = default); - /// - /// 移除指定的实时便笺 - /// - /// 指定的实时便笺 - /// 任务 ValueTask RemoveDailyNoteAsync(DailyNoteEntry entry, CancellationToken token = default); ValueTask UpdateDailyNoteAsync(DailyNoteEntry entry, CancellationToken token = default); diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordController.cs b/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordController.cs index 39c8336a..376b7eb4 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordController.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordController.cs @@ -21,7 +21,7 @@ internal static class DiscordController private static long currentClientId; private static unsafe IDiscordCore* discordCorePtr; - private static bool isInitialized; + private static bool isCallbackInitialized; public static async ValueTask SetDefaultActivityAsync(DateTimeOffset startTime) { @@ -108,7 +108,7 @@ internal static class DiscordController public static unsafe void Stop() { - if (!isInitialized) + if (!isCallbackInitialized) { return; } @@ -147,13 +147,13 @@ internal static class DiscordController discordCorePtr->set_log_hook(discordCorePtr, DiscordLogLevel.Debug, default, &DebugWriteDiscordMessage); } - if (isInitialized) + if (isCallbackInitialized) { return; } DiscordRunCallbacksAsync(StopTokenSource.Token).SafeForget(); - isInitialized = true; + isCallbackInitialized = true; [UnmanagedCallersOnly(CallConvs = [typeof(CallConvCdecl)])] static unsafe void DebugWriteDiscordMessage(void* state, DiscordLogLevel logLevel, sbyte* ptr) @@ -183,7 +183,7 @@ internal static class DiscordController { try { - DiscordResult result = DiscordCoreRunRunCallbacks(); + DiscordResult result = RunDiscordCoreRunCallbacks(); if (result is not DiscordResult.Ok) { if (result is DiscordResult.NotRunning) @@ -200,11 +200,11 @@ internal static class DiscordController } } } - catch (SEHException ex) + catch (Exception ex) { // Known error codes: // 0x80004005 E_FAIL - System.Diagnostics.Debug.WriteLine($"[Discord.GameSDK ERROR]:0x{ex.ErrorCode:X}"); + System.Diagnostics.Debug.WriteLine($"[Discord.GameSDK ERROR]:0x{ex.HResult:X}"); } } } @@ -214,7 +214,7 @@ internal static class DiscordController } } - unsafe DiscordResult DiscordCoreRunRunCallbacks() + unsafe DiscordResult RunDiscordCoreRunCallbacks() { if (discordCorePtr is not null) { @@ -253,6 +253,7 @@ internal static class DiscordController public DiscordUpdateActivityAsyncAction(IDiscordActivityManager* activityManagerPtr) { this.activityManagerPtr = activityManagerPtr; + discordAsyncAction.Result = (DiscordResult)(-1); } public DiscordResult WaitUpdateActivity(DiscordActivity activity) @@ -262,7 +263,7 @@ internal static class DiscordController activityManagerPtr->update_activity(activityManagerPtr, &activity, actionPtr, &HandleResult); } - SpinWaitPolyfill.SpinUntil(ref discordAsyncAction, &CheckActionCompleted); + SpinWaitPolyfill.SpinUntil(ref discordAsyncAction, &CheckActionCompleted, TimeSpan.FromSeconds(5)); return discordAsyncAction.Result; } diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordService.cs index 66ff3517..db1404c6 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordService.cs @@ -50,10 +50,15 @@ internal sealed partial class DiscordService : IDiscordService, IDisposable return false; } - foreach (Process process in discordProcesses) + foreach (ref readonly Process process in discordProcesses.AsSpan()) { try { + if (string.Equals(process.MainWindowTitle, "Discord Updater", StringComparison.OrdinalIgnoreCase)) + { + return false; + } + _ = process.Handle; } catch (Exception)