diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordController.cs b/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordController.cs index e1c5a54a..6166c562 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordController.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordController.cs @@ -132,27 +132,6 @@ internal static class DiscordController return; } - // Actually requires a discord client to be running on Windows platform. - // If not, the following creation code will throw. - System.Diagnostics.Process[] discordProcesses = System.Diagnostics.Process.GetProcessesByName("Discord"); - - if (discordProcesses.Length <= 0) - { - return; - } - - foreach (System.Diagnostics.Process process in discordProcesses) - { - try - { - _ = process.Handle; - } - catch (Win32Exception) - { - return; - } - } - lock (SyncRoot) { DiscordCreateParams @params = default; diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordService.cs index 91b62bc5..7d4181ca 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordService.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. using Snap.Hutao.Core; +using Snap.Hutao.Service.Notification; namespace Snap.Hutao.Service.Discord; @@ -9,22 +10,77 @@ namespace Snap.Hutao.Service.Discord; [Injection(InjectAs.Singleton, typeof(IDiscordService))] internal sealed partial class DiscordService : IDiscordService, IDisposable { + private readonly IInfoBarService infoBarService; private readonly RuntimeOptions runtimeOptions; + private bool isInitialized; + public async ValueTask SetPlayingActivityAsync(bool isOversea) { - _ = isOversea - ? await DiscordController.SetPlayingGenshinImpactAsync().ConfigureAwait(false) - : await DiscordController.SetPlayingYuanShenAsync().ConfigureAwait(false); + if (CheckDiscordStatus()) + { + _ = isOversea + ? await DiscordController.SetPlayingGenshinImpactAsync().ConfigureAwait(false) + : await DiscordController.SetPlayingYuanShenAsync().ConfigureAwait(false); + } } public async ValueTask SetNormalActivityAsync() { - _ = await DiscordController.SetDefaultActivityAsync(runtimeOptions.AppLaunchTime).ConfigureAwait(false); + if (CheckDiscordStatus()) + { + _ = await DiscordController.SetDefaultActivityAsync(runtimeOptions.AppLaunchTime).ConfigureAwait(false); + } } public void Dispose() { DiscordController.Stop(); } + + private bool CheckDiscordStatus() + { + try + { + // Actually requires a discord client to be running on Windows platform. + // If not, discord core creation code will throw. + System.Diagnostics.Process[] discordProcesses = System.Diagnostics.Process.GetProcessesByName("Discord"); + + if (discordProcesses.Length <= 0) + { + if (!isInitialized) + { + infoBarService.Warning("Discord 未运行,将无法设置 Discord Activity 状态。"); + } + + return false; + } + + foreach (System.Diagnostics.Process process in discordProcesses) + { + try + { + _ = process.Handle; + } + catch (Win32Exception) + { + if (!isInitialized) + { + infoBarService.Warning("权限不足,将无法设置 Discord Activity 状态。"); + } + + return false; + } + } + + return true; + } + finally + { + if (!isInitialized) + { + isInitialized = true; + } + } + } } \ No newline at end of file