From 5773902f4aa6aee6fc11f449327b095db4443534 Mon Sep 17 00:00:00 2001 From: DismissedLight <1686188646@qq.com> Date: Fri, 13 Oct 2023 22:36:51 +0800 Subject: [PATCH] fix #1001 --- .../Model/InterChange/GachaLog/UIGF.cs | 27 +++++- .../Service/GachaLog/UIGFImportService.cs | 24 ++++- .../View/Page/LoginHoyoverseUserPage.xaml.cs | 2 +- .../ViewModel/GachaLog/GachaLogViewModel.cs | 91 +++++++------------ 4 files changed, 78 insertions(+), 66 deletions(-) diff --git a/src/Snap.Hutao/Snap.Hutao/Model/InterChange/GachaLog/UIGF.cs b/src/Snap.Hutao/Snap.Hutao/Model/InterChange/GachaLog/UIGF.cs index 4b3f8cdb..4ded9b4b 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/InterChange/GachaLog/UIGF.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/InterChange/GachaLog/UIGF.cs @@ -1,6 +1,8 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. +using System.Runtime.InteropServices; + namespace Snap.Hutao.Model.InterChange.GachaLog; /// @@ -49,20 +51,35 @@ internal sealed class UIGF /// /// 列表物品是否正常 /// - /// 首个出错的Id + /// 首个出错的Id /// 是否正常 - public bool IsMajor2Minor2OrLowerListValid([NotNullWhen(false)] out long itemId) + public bool IsMajor2Minor2OrLowerListValid([NotNullWhen(false)] out long id) { - foreach (UIGFItem item in List) + foreach (ref readonly UIGFItem item in CollectionsMarshal.AsSpan(List)) { if (item.ItemType != SH.ModelInterchangeUIGFItemTypeAvatar && item.ItemType != SH.ModelInterchangeUIGFItemTypeWeapon) { - itemId = item.Id; + id = item.Id; return false; } } - itemId = 0; + id = 0; + return true; + } + + public bool IsMajor2Minor3OrHigherListValid([NotNullWhen(false)] out long id) + { + foreach (ref readonly UIGFItem item in CollectionsMarshal.AsSpan(List)) + { + if (string.IsNullOrEmpty(item.ItemId)) + { + id = item.Id; + return false; + } + } + + id = 0; return true; } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/UIGFImportService.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/UIGFImportService.cs index 806ed3e4..45186002 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/UIGFImportService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/UIGFImportService.cs @@ -35,10 +35,28 @@ internal sealed partial class UIGFImportService : IUIGFImportService // v2.3+ support any locale // v2.2 only support matched locale // v2.1 only support CHS - if (version is UIGFVersion.Major2Minor2OrLower && !metadataOptions.IsCurrentLocale(uigf.Info.Language)) + if (version is UIGFVersion.Major2Minor2OrLower) { - string message = SH.ServiceGachaUIGFImportLanguageNotMatch.Format(uigf.Info.Language, metadataOptions.LanguageCode); - ThrowHelper.InvalidOperation(message, null); + if (!metadataOptions.IsCurrentLocale(uigf.Info.Language)) + { + string message = SH.ServiceGachaUIGFImportLanguageNotMatch.Format(uigf.Info.Language, metadataOptions.LanguageCode); + ThrowHelper.InvalidOperation(message); + } + + if (!uigf.IsMajor2Minor2OrLowerListValid(out long id)) + { + string message = SH.ServiceGachaLogUIGFImportItemInvalidFormat.Format(id); + ThrowHelper.InvalidOperation(message); + } + } + + if (version is UIGFVersion.Major2Minor3OrHigher) + { + if (!uigf.IsMajor2Minor3OrHigherListValid(out long id)) + { + string message = SH.ServiceGachaLogUIGFImportItemInvalidFormat.Format(id); + ThrowHelper.InvalidOperation(message); + } } GachaArchiveOperation.GetOrAdd(gachaLogDbService, taskContext, uigf.Info.Uid, archives, out GachaArchive? archive); diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/LoginHoyoverseUserPage.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Page/LoginHoyoverseUserPage.xaml.cs index fd2e3452..0ec71bf1 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/LoginHoyoverseUserPage.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/LoginHoyoverseUserPage.xaml.cs @@ -148,4 +148,4 @@ internal sealed partial class LoginHoyoverseUserPage : Microsoft.UI.Xaml.Control [JsonPropertyName("weblogin_token")] public string WebLoginToken { get; set; } = default!; } -} +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaLogViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaLogViewModel.cs index 166bc902..03a39b7c 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaLogViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaLogViewModel.cs @@ -115,21 +115,6 @@ internal sealed partial class GachaLogViewModel : Abstraction.ViewModel return false; } - private static bool CanImport(UIGFVersion version, UIGF uigf, out long id) - { - id = 0; - if (version == UIGFVersion.Major2Minor3OrHigher) - { - return true; - } - else if (version == UIGFVersion.Major2Minor2OrLower && uigf.IsMajor2Minor2OrLowerListValid(out id)) - { - return true; - } - - return false; - } - [Command("RefreshByWebCacheCommand")] private Task RefreshByWebCacheAsync() { @@ -221,7 +206,7 @@ internal sealed partial class GachaLogViewModel : Abstraction.ViewModel } else { - await contentDialogFactory.CreateForConfirmAsync(SH.ViewModelImportWarningTitle, SH.ViewModelImportWarningMessage).ConfigureAwait(false); + infoBarService.Error(SH.ViewModelImportWarningTitle, SH.ViewModelImportWarningMessage); } } } @@ -349,50 +334,42 @@ internal sealed partial class GachaLogViewModel : Abstraction.ViewModel private async ValueTask TryImportUIGFInternalAsync(UIGF uigf) { - if (uigf.IsCurrentVersionSupported(out UIGFVersion version)) - { - GachaLogImportDialog importDialog = await contentDialogFactory.CreateInstanceAsync(uigf).ConfigureAwait(false); - if (await importDialog.GetShouldImportAsync().ConfigureAwait(false)) - { - if (CanImport(version, uigf, out long itemId)) - { - await taskContext.SwitchToMainThreadAsync(); - ContentDialog dialog = await contentDialogFactory.CreateForIndeterminateProgressAsync(SH.ViewModelGachaLogImportProgress).ConfigureAwait(true); - try - { - using (await dialog.BlockAsync(taskContext).ConfigureAwait(false)) - { - await gachaLogService.ImportFromUIGFAsync(uigf).ConfigureAwait(false); - } - } - catch (InvalidOperationException ex) - { - // 导入物品中存在无效的项 - infoBarService.Error(ex); - return false; - } - catch (FormatException ex) - { - infoBarService.Error(ex); - return false; - } - - infoBarService.Success(SH.ViewModelGachaLogImportComplete); - await taskContext.SwitchToMainThreadAsync(); - await SetSelectedArchiveAndUpdateStatisticsAsync(gachaLogService.CurrentArchive, true).ConfigureAwait(false); - return true; - } - else - { - infoBarService.Warning(SH.ViewModelGachaLogImportWarningTitle, SH.ServiceGachaLogUIGFImportItemInvalidFormat.Format(itemId)); - } - } - } - else + if (!uigf.IsCurrentVersionSupported(out UIGFVersion version)) { infoBarService.Warning(SH.ViewModelGachaLogImportWarningTitle, SH.ViewModelGachaLogImportWarningMessage); + return false; } - return false; + GachaLogImportDialog importDialog = await contentDialogFactory.CreateInstanceAsync(uigf).ConfigureAwait(false); + if (!await importDialog.GetShouldImportAsync().ConfigureAwait(false)) + { + return false; + } + + await taskContext.SwitchToMainThreadAsync(); + ContentDialog dialog = await contentDialogFactory.CreateForIndeterminateProgressAsync(SH.ViewModelGachaLogImportProgress).ConfigureAwait(true); + try + { + using (await dialog.BlockAsync(taskContext).ConfigureAwait(false)) + { + await gachaLogService.ImportFromUIGFAsync(uigf).ConfigureAwait(false); + } + } + catch (InvalidOperationException ex) + { + // 语言不匹配/导入物品中存在无效的项 + infoBarService.Error(ex); + return false; + } + catch (FormatException ex) + { + infoBarService.Error(ex); + return false; + } + + infoBarService.Success(SH.ViewModelGachaLogImportComplete); + await taskContext.SwitchToMainThreadAsync(); + await SetSelectedArchiveAndUpdateStatisticsAsync(gachaLogService.CurrentArchive, true).ConfigureAwait(false); + return true; } } \ No newline at end of file