mirror of
https://jihulab.com/DGP-Studio/Snap.Hutao.git
synced 2025-11-19 21:02:53 +08:00
fix #1001
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -148,4 +148,4 @@ internal sealed partial class LoginHoyoverseUserPage : Microsoft.UI.Xaml.Control
|
||||
[JsonPropertyName("weblogin_token")]
|
||||
public string WebLoginToken { get; set; } = default!;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user