From 37767261cd3a89ec4bdbef6254407d6b6e65ce68 Mon Sep 17 00:00:00 2001 From: qhy040404 Date: Fri, 26 Apr 2024 11:21:09 +0800 Subject: [PATCH] impl #1100 --- .../Model/Entity/SettingEntry.Constant.cs | 3 + .../Snap.Hutao/Resource/Localization/SH.resx | 18 ++++++ .../Snap.Hutao/Service/AppOptions.cs | 14 +++++ .../Snap.Hutao/View/Page/SettingPage.xaml | 16 +++++ .../ViewModel/GachaLog/GachaLogViewModel.cs | 7 +++ .../ViewModel/GachaLog/HutaoCloudViewModel.cs | 58 +++++++++---------- .../SpiralAbyss/SpiralAbyssRecordViewModel.cs | 54 ++++++++++------- 7 files changed, 120 insertions(+), 50 deletions(-) diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.Constant.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.Constant.cs index 18bbdbad..05e604ab 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.Constant.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.Constant.cs @@ -16,6 +16,9 @@ internal sealed partial class SettingEntry public const string ElementTheme = "ElementTheme"; public const string BackgroundImageType = "BackgroundImageType"; + public const string IsAutoUploadGachaLogEnabled = "IsAutoUploadGachaLogEnabled"; + public const string IsAutoUploadSpiralAbyssRecordEnabled = "IsAutoUploadSpiralAbyssRecordEnabled"; + public const string AnnouncementRegion = "AnnouncementRegion"; public const string IsEmptyHistoryWishVisible = "IsEmptyHistoryWishVisible"; diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx index e2c6a2eb..ccff2daf 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx @@ -2588,6 +2588,24 @@ 主页 + + 登录胡桃通行证后自动上传至胡桃云 + + + 自动上传 + + + 刷新祈愿记录后自动上传至胡桃云,需要有效的胡桃云服务 + + + 自动上传祈愿记录 + + + 刷新深境螺旋数据后自动上传至胡桃云 + + + 自动上传深境螺旋数据 + 三思而后行 diff --git a/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs b/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs index 9fb24aa6..81e8a529 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs @@ -15,6 +15,8 @@ namespace Snap.Hutao.Service; [Injection(InjectAs.Singleton)] internal sealed partial class AppOptions : DbStoreOptions { + private bool? isAutoUploadGachaLogEnabled; + private bool? isAutoUploadSpiralAbyssRecordEnabled; private bool? isEmptyHistoryWishVisible; private bool? isUnobtainedWishItemVisible; private BackdropType? backdropType; @@ -23,6 +25,18 @@ internal sealed partial class AppOptions : DbStoreOptions private Region? region; private string? geetestCustomCompositeUrl; + public bool IsAutoUploadGachaLogEnabled + { + get => GetOption(ref isAutoUploadGachaLogEnabled, SettingEntry.IsAutoUploadGachaLogEnabled, false); + set => SetOption(ref isAutoUploadGachaLogEnabled, SettingEntry.IsAutoUploadGachaLogEnabled, value); + } + + public bool IsAutoUploadSpiralAbyssRecordEnabled + { + get => GetOption(ref isAutoUploadSpiralAbyssRecordEnabled, SettingEntry.IsAutoUploadSpiralAbyssRecordEnabled, false); + set => SetOption(ref isAutoUploadSpiralAbyssRecordEnabled, SettingEntry.IsAutoUploadSpiralAbyssRecordEnabled, value); + } + public bool IsEmptyHistoryWishVisible { get => GetOption(ref isEmptyHistoryWishVisible, SettingEntry.IsEmptyHistoryWishVisible, false); diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml index 0c9cec0e..82c9158b 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml @@ -265,6 +265,22 @@ + + + + + + + + + + + + diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaLogViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaLogViewModel.cs index 8880e0e6..8bd35ec1 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaLogViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaLogViewModel.cs @@ -11,6 +11,7 @@ using Snap.Hutao.Factory.Picker; using Snap.Hutao.Factory.Progress; using Snap.Hutao.Model.Entity; using Snap.Hutao.Model.InterChange.GachaLog; +using Snap.Hutao.Service; using Snap.Hutao.Service.GachaLog; using Snap.Hutao.Service.GachaLog.QueryProvider; using Snap.Hutao.Service.Notification; @@ -38,6 +39,7 @@ internal sealed partial class GachaLogViewModel : Abstraction.ViewModel private readonly IInfoBarService infoBarService; private readonly JsonSerializerOptions options; private readonly ITaskContext taskContext; + private readonly AppOptions appOptions; private ObservableCollection? archives; private GachaArchive? selectedArchive; @@ -198,6 +200,11 @@ internal sealed partial class GachaLogViewModel : Abstraction.ViewModel { await SetSelectedArchiveAndUpdateStatisticsAsync(gachaLogService.CurrentArchive, true).ConfigureAwait(false); await hideToken.DisposeAsync().ConfigureAwait(false); + + if (HutaoCloudViewModel.Options.IsCloudServiceAllowed && appOptions.IsAutoUploadGachaLogEnabled) + { + await HutaoCloudViewModel.UploadAsync(gachaLogService.CurrentArchive).ConfigureAwait(false); + } } else { diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoCloudViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoCloudViewModel.cs index 6829162d..9a6aac0c 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoCloudViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoCloudViewModel.cs @@ -47,6 +47,35 @@ internal sealed partial class HutaoCloudViewModel : Abstraction.ViewModel /// internal ICommand RetrieveCommand { get; set; } + [Command("UploadCommand")] + internal async Task UploadAsync(GachaArchive? gachaArchive) + { + if (gachaArchive is not null) + { + ContentDialog dialog = await contentDialogFactory + .CreateForIndeterminateProgressAsync(SH.ViewModelGachaLogUploadToHutaoCloudProgress) + .ConfigureAwait(false); + + bool isOk; + string message; + + using (await dialog.BlockAsync(taskContext).ConfigureAwait(false)) + { + (isOk, message) = await hutaoCloudService.UploadGachaItemsAsync(gachaArchive).ConfigureAwait(false); + } + + if (isOk) + { + infoBarService.Success(message); + await RefreshUidCollectionAsync().ConfigureAwait(false); + } + else + { + infoBarService.Warning(message); + } + } + } + /// /// 异步获取祈愿记录 /// @@ -77,35 +106,6 @@ internal sealed partial class HutaoCloudViewModel : Abstraction.ViewModel await Windows.System.Launcher.LaunchUriAsync("https://afdian.net/item/80d3b9decf9011edb5f452540025c377".ToUri()); } - [Command("UploadCommand")] - private async Task UploadAsync(GachaArchive? gachaArchive) - { - if (gachaArchive is not null) - { - ContentDialog dialog = await contentDialogFactory - .CreateForIndeterminateProgressAsync(SH.ViewModelGachaLogUploadToHutaoCloudProgress) - .ConfigureAwait(false); - - bool isOk; - string message; - - using (await dialog.BlockAsync(taskContext).ConfigureAwait(false)) - { - (isOk, message) = await hutaoCloudService.UploadGachaItemsAsync(gachaArchive).ConfigureAwait(false); - } - - if (isOk) - { - infoBarService.Success(message); - await RefreshUidCollectionAsync().ConfigureAwait(false); - } - else - { - infoBarService.Warning(message); - } - } - } - [Command("DeleteCommand")] private async Task DeleteAsync(string? uid) { diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyss/SpiralAbyssRecordViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyss/SpiralAbyssRecordViewModel.cs index c1ea5089..a9a90410 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyss/SpiralAbyssRecordViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/SpiralAbyss/SpiralAbyssRecordViewModel.cs @@ -5,6 +5,7 @@ using CommunityToolkit.Mvvm.Messaging; using Microsoft.UI.Xaml.Controls; using Snap.Hutao.Factory.ContentDialog; using Snap.Hutao.Message; +using Snap.Hutao.Service; using Snap.Hutao.Service.Hutao; using Snap.Hutao.Service.Notification; using Snap.Hutao.Service.SpiralAbyss; @@ -34,6 +35,7 @@ internal sealed partial class SpiralAbyssRecordViewModel : Abstraction.ViewModel private readonly IUserService userService; private readonly HutaoDatabaseViewModel hutaoDatabaseViewModel; private readonly HutaoUserOptions hutaoUserOptions; + private readonly AppOptions appOptions; private ObservableCollection? spiralAbyssEntries; private SpiralAbyssView? selectedView; @@ -124,6 +126,11 @@ internal sealed partial class SpiralAbyssRecordViewModel : Abstraction.ViewModel await taskContext.SwitchToMainThreadAsync(); SelectedView = SpiralAbyssEntries.FirstOrDefault(s => s.Engaged); + + if (hutaoUserOptions.IsLoggedIn && appOptions.IsAutoUploadSpiralAbyssRecordEnabled) + { + await UploadSpiralAbyssRecordCoreAsync(userAndUid).ConfigureAwait(false); + } } } } @@ -145,30 +152,35 @@ internal sealed partial class SpiralAbyssRecordViewModel : Abstraction.ViewModel } } - SimpleRecord? record = await spiralAbyssClient.GetPlayerRecordAsync(userAndUid).ConfigureAwait(false); - if (record is not null) - { - Web.Response.Response response = await spiralAbyssClient.UploadRecordAsync(record).ConfigureAwait(false); - - if (response is { ReturnCode: 0 }) - { - if (response is ILocalizableResponse localizableResponse) - { - infoBarService.Success(localizableResponse.GetLocalizationMessage()); - } - } - else - { - if (response is ILocalizableResponse localizableResponse) - { - infoBarService.Warning(localizableResponse.GetLocalizationMessage()); - } - } - } + await UploadSpiralAbyssRecordCoreAsync(userAndUid).ConfigureAwait(false); } else { infoBarService.Warning(SH.MustSelectUserAndUid); } } -} \ No newline at end of file + + private async ValueTask UploadSpiralAbyssRecordCoreAsync(UserAndUid userAndUid) + { + SimpleRecord? record = await spiralAbyssClient.GetPlayerRecordAsync(userAndUid).ConfigureAwait(false); + if (record is not null) + { + Web.Response.Response response = await spiralAbyssClient.UploadRecordAsync(record).ConfigureAwait(false); + + if (response is { ReturnCode: 0 }) + { + if (response is ILocalizableResponse localizableResponse) + { + infoBarService.Success(localizableResponse.GetLocalizationMessage()); + } + } + else + { + if (response is ILocalizableResponse localizableResponse) + { + infoBarService.Warning(localizableResponse.GetLocalizationMessage()); + } + } + } + } +}