This commit is contained in:
DismissedLight
2023-10-13 22:36:51 +08:00
parent 06c5bcad3e
commit 5773902f4a
4 changed files with 78 additions and 66 deletions

View File

@@ -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;
/// <summary>
@@ -49,20 +51,35 @@ internal sealed class UIGF
/// <summary>
/// 列表物品是否正常
/// </summary>
/// <param name="itemId">首个出错的Id</param>
/// <param name="id">首个出错的Id</param>
/// <returns>是否正常</returns>
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;
}
}

View File

@@ -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);

View File

@@ -148,4 +148,4 @@ internal sealed partial class LoginHoyoverseUserPage : Microsoft.UI.Xaml.Control
[JsonPropertyName("weblogin_token")]
public string WebLoginToken { get; set; } = default!;
}
}
}

View File

@@ -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<bool> TryImportUIGFInternalAsync(UIGF uigf)
{
if (uigf.IsCurrentVersionSupported(out UIGFVersion version))
{
GachaLogImportDialog importDialog = await contentDialogFactory.CreateInstanceAsync<GachaLogImportDialog>(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<GachaLogImportDialog>(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;
}
}