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());
+ }
+ }
+ }
+ }
+}