diff --git a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs index 64116454..172de3c2 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs @@ -10,9 +10,7 @@ using Snap.Hutao.Service.Abstraction; using Snap.Hutao.Service.DailyNote; using Snap.Hutao.Service.Metadata; using Snap.Hutao.Service.Navigation; -#if RELEASE using System.Security.Principal; -#endif namespace Snap.Hutao.Core.LifeCycle; @@ -39,15 +37,11 @@ internal static class Activation /// 是否提升了权限 public static bool GetElevated() { -#if RELEASE using (WindowsIdentity identity = WindowsIdentity.GetCurrent()) { WindowsPrincipal principal = new(identity); return principal.IsInRole(WindowsBuiltInRole.Administrator); } -#else - return true; -#endif } /// diff --git a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/AppActivationArgumentsExtensions.cs b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/AppActivationArgumentsExtensions.cs index 9ea64b70..0c42c783 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/AppActivationArgumentsExtensions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/AppActivationArgumentsExtensions.cs @@ -40,7 +40,7 @@ public static class AppActivationArgumentsExtensions arguments = null; if (activatedEventArgs.Data is ILaunchActivatedEventArgs launchArgs) { - arguments = launchArgs.Arguments; + arguments = launchArgs.Arguments.Trim(); return true; } diff --git a/src/Snap.Hutao/Snap.Hutao/Core/ScheduleTaskHelper.cs b/src/Snap.Hutao/Snap.Hutao/Core/ScheduleTaskHelper.cs index 3ea99141..44062767 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/ScheduleTaskHelper.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/ScheduleTaskHelper.cs @@ -2,7 +2,9 @@ // Licensed under the MIT license. using Microsoft.Win32.TaskScheduler; +using System.IO; using System.Runtime.InteropServices; +using Windows.Storage; using SchedulerTask = Microsoft.Win32.TaskScheduler.Task; namespace Snap.Hutao.Core; @@ -23,23 +25,16 @@ internal static class ScheduleTaskHelper { try { - // TODO: 似乎可以不删除任务,直接注册已经包含了更新功能 - SchedulerTask? targetTask = TaskService.Instance.GetTask(DailyNoteRefreshTaskName); - if (targetTask != null) - { - TaskService.Instance.RootFolder.DeleteTask(DailyNoteRefreshTaskName); - } - TaskDefinition task = TaskService.Instance.NewTask(); task.RegistrationInfo.Description = SH.CoreScheduleTaskHelperDailyNoteRefreshTaskDescription; task.Triggers.Add(new TimeTrigger() { Repetition = new(TimeSpan.FromSeconds(interval), TimeSpan.Zero), }); - task.Actions.Add("explorer", "hutao://DailyNote/Refresh"); + string scriptPath = EnsureWScriptCreated("DailyNoteRefresh", "hutao://DailyNote/Refresh"); + task.Actions.Add("wscript", $@"/b ""{scriptPath}"""); TaskService.Instance.RootFolder.RegisterTaskDefinition(DailyNoteRefreshTaskName, task); return true; } - catch (Exception ex) + catch (Exception) { - _ = ex; return false; } } @@ -69,4 +64,19 @@ internal static class ScheduleTaskHelper return false; } } + + private static string EnsureWScriptCreated(string name, string url, bool forceCreate = false) + { + string tempFolder = ApplicationData.Current.TemporaryFolder.Path; + string fullName = Path.Combine(tempFolder, "Script", $"{name}.vbs"); + + if (!File.Exists(fullName) || forceCreate) + { + Directory.CreateDirectory(Path.Combine(tempFolder, "Script")); + string script = $"""CreateObject("WScript.Shell").Run "cmd /c start {url}", 0, False"""; + File.WriteAllText(fullName, script); + } + + return fullName; + } } diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/User/UserAndUid.cs b/src/Snap.Hutao/Snap.Hutao/Model/Binding/User/UserAndUid.cs index c11d4072..dd4d41b0 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Binding/User/UserAndUid.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Binding/User/UserAndUid.cs @@ -34,16 +34,6 @@ public class UserAndUid /// public PlayerUid Uid { get; private set; } - /// - /// 从用户与选中的角色转换 - /// - /// 角色 - /// 用户与角色 - public static UserAndUid FromUser(User user) - { - return new UserAndUid(user.Entity, user.SelectedUserGameRole!); - } - /// /// 尝试转换到用户与角色 /// @@ -54,7 +44,7 @@ public class UserAndUid { if (user != null && user.SelectedUserGameRole != null) { - userAndUid = FromUser(user); + userAndUid = new UserAndUid(user.Entity, user.SelectedUserGameRole!); return true; } diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataService.cs index 027bee4d..990d7fd2 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/MetadataService.cs @@ -77,7 +77,7 @@ internal partial class MetadataService : IMetadataService, IMetadataServiceIniti logger.LogInformation(EventIds.MetadataInitialization, "Metadata initializaion begin"); isInitialized = await TryUpdateMetadataAsync(token).ConfigureAwait(false); - initializeCompletionSource.SetResult(); + initializeCompletionSource.TrySetResult(); logger.LogInformation(EventIds.MetadataInitialization, "Metadata initializaion completed in {time}ms", stopwatch.GetElapsedTime().TotalMilliseconds); } diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/CultivationViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/CultivationViewModel.cs index ddd24c47..b0e20eda 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/CultivationViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/CultivationViewModel.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. using CommunityToolkit.Mvvm.Input; +using Microsoft.Extensions.DependencyInjection; using Snap.Hutao.Model.Binding.Cultivation; using Snap.Hutao.Model.Entity; using Snap.Hutao.Service.Abstraction; @@ -19,8 +20,8 @@ namespace Snap.Hutao.ViewModel; [Injection(InjectAs.Scoped)] internal class CultivationViewModel : Abstraction.ViewModel { + private readonly IServiceProvider serviceProvider; private readonly ICultivationService cultivationService; - private readonly IInfoBarService infoBarService; private readonly IMetadataService metadataService; private readonly ILogger logger; @@ -35,20 +36,15 @@ internal class CultivationViewModel : Abstraction.ViewModel /// /// 构造一个新的养成视图模型 /// - /// 养成服务 - /// 信息服务 + /// 服务提供器 /// 元数据服务 /// 日志器 - public CultivationViewModel( - ICultivationService cultivationService, - IInfoBarService infoBarService, - IMetadataService metadataService, - ILogger logger) + public CultivationViewModel(IServiceProvider serviceProvider) { - this.cultivationService = cultivationService; - this.infoBarService = infoBarService; - this.metadataService = metadataService; - this.logger = logger; + cultivationService = serviceProvider.GetRequiredService(); + metadataService = serviceProvider.GetRequiredService(); + logger = serviceProvider.GetRequiredService>(); + this.serviceProvider = serviceProvider; OpenUICommand = new AsyncRelayCommand(OpenUIAsync); AddProjectCommand = new AsyncRelayCommand(AddProjectAsync); @@ -56,7 +52,7 @@ internal class CultivationViewModel : Abstraction.ViewModel RemoveEntryCommand = new AsyncRelayCommand(RemoveEntryAsync); SaveInventoryItemCommand = new RelayCommand(SaveInventoryItem); NavigateToPageCommand = new RelayCommand(NavigateToPage); - FinishStateCommand = new RelayCommand(FlipFinishedState); + FinishStateCommand = new RelayCommand(UpdateFinishedState); } /// @@ -153,6 +149,7 @@ internal class CultivationViewModel : Abstraction.ViewModel if (isOk) { ProjectAddResult result = await cultivationService.TryAddProjectAsync(project).ConfigureAwait(false); + IInfoBarService infoBarService = serviceProvider.GetRequiredService(); switch (result) { @@ -223,7 +220,7 @@ internal class CultivationViewModel : Abstraction.ViewModel } } - private void FlipFinishedState(Model.Binding.Cultivation.CultivateItem? item) + private void UpdateFinishedState(Model.Binding.Cultivation.CultivateItem? item) { if (item != null) { @@ -258,8 +255,9 @@ internal class CultivationViewModel : Abstraction.ViewModel { if (typeString != null) { - Type? pageType = Type.GetType(typeString); - Ioc.Default.GetRequiredService().Navigate(pageType!, INavigationAwaiter.Default, true); + serviceProvider + .GetRequiredService() + .Navigate(Type.GetType(typeString)!, INavigationAwaiter.Default, true); } } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNoteViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNoteViewModel.cs index aaadeb3a..7e38f42e 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNoteViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/DailyNoteViewModel.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. using CommunityToolkit.Mvvm.Input; +using Microsoft.Extensions.DependencyInjection; using Snap.Hutao.Core; using Snap.Hutao.Core.Database; using Snap.Hutao.Model; @@ -22,6 +23,7 @@ namespace Snap.Hutao.ViewModel; [Injection(InjectAs.Scoped)] internal class DailyNoteViewModel : Abstraction.ViewModel { + private readonly IServiceProvider serviceProvider; private readonly IUserService userService; private readonly IDailyNoteService dailyNoteService; private readonly AppDbContext appDbContext; @@ -48,10 +50,12 @@ internal class DailyNoteViewModel : Abstraction.ViewModel /// /// 构造一个新的实时便笺视图模型 /// + /// 服务提供器 /// 用户服务 /// 实时便笺服务 /// 数据库上下文 public DailyNoteViewModel( + IServiceProvider serviceProvider, IUserService userService, IDailyNoteService dailyNoteService, AppDbContext appDbContext) @@ -59,6 +63,7 @@ internal class DailyNoteViewModel : Abstraction.ViewModel this.userService = userService; this.dailyNoteService = dailyNoteService; this.appDbContext = appDbContext; + this.serviceProvider = serviceProvider; OpenUICommand = new AsyncRelayCommand(OpenUIAsync); TrackRoleCommand = new AsyncRelayCommand(TrackRoleAsync); @@ -179,7 +184,7 @@ internal class DailyNoteViewModel : Abstraction.ViewModel } catch (Core.ExceptionService.UserdataCorruptedException ex) { - Ioc.Default.GetRequiredService().Error(ex); + serviceProvider.GetRequiredService().Error(ex); return; } @@ -190,9 +195,10 @@ internal class DailyNoteViewModel : Abstraction.ViewModel await ThreadHelper.SwitchToMainThreadAsync(); refreshSecondsEntry = appDbContext.Settings.SingleOrAdd(SettingEntry.DailyNoteRefreshSeconds, "480"); - selectedRefreshTime = refreshTimes.Single(t => t.Value == refreshSecondsEntry.GetInt32()); + int refreshSeconds = refreshSecondsEntry.GetInt32(); + selectedRefreshTime = refreshTimes.Single(t => t.Value == refreshSeconds); OnPropertyChanged(nameof(SelectedRefreshTime)); - ScheduleTaskHelper.RegisterForDailyNoteRefresh(480); + ScheduleTaskHelper.RegisterForDailyNoteRefresh(refreshSeconds); reminderNotifyEntry = appDbContext.Settings.SingleOrAdd(SettingEntry.DailyNoteReminderNotify, SettingEntryHelper.FalseString); isReminderNotification = reminderNotifyEntry.GetBoolean(); @@ -204,9 +210,9 @@ internal class DailyNoteViewModel : Abstraction.ViewModel } await ThreadHelper.SwitchToBackgroundAsync(); - ObservableCollection temp = await dailyNoteService.GetDailyNoteEntriesAsync().ConfigureAwait(false); + ObservableCollection entries = await dailyNoteService.GetDailyNoteEntriesAsync().ConfigureAwait(false); await ThreadHelper.SwitchToMainThreadAsync(); - DailyNoteEntries = temp; + DailyNoteEntries = entries; } catch (OperationCanceledException) { @@ -255,7 +261,7 @@ internal class DailyNoteViewModel : Abstraction.ViewModel } else { - Ioc.Default.GetRequiredService().Warning(SH.MustSelectUserAndUid); + serviceProvider.GetRequiredService().Warning(SH.MustSelectUserAndUid); } } -} +} \ No newline at end of file