diff --git a/build.cake b/build.cake index 87c2ec4d..49ae906c 100644 --- a/build.cake +++ b/build.cake @@ -69,6 +69,15 @@ else if (AppVeyor.IsRunningOnAppVeyor) })[..^2]; Information($"Version: {version}"); } +else // Local +{ + repoDir = System.Environment.CurrentDirectory; + outputPath = System.IO.Path.Combine(repoDir, "src", "output"); + + version = System.DateTime.Now.ToString("yyyy.M.d.") + ((int)((System.DateTime.Now - System.DateTime.Today).TotalSeconds / 86400 * 65535)).ToString(); + + Information($"Version: {version}"); +} Task("Build") .IsDependentOn("Build binary package") @@ -112,6 +121,17 @@ Task("Generate AppxManifest") Information("Using Release configuration"); content = System.Text.RegularExpressions.Regex.Replace(content, " Publisher=\"([^\"]*)\"", " Publisher=\"CN=SignPath Foundation, O=SignPath Foundation, L=Lewes, S=Delaware, C=US\""); } + else + { + Information("Using Local configuration."); + content = content + .Replace("Snap Hutao", "Snap Hutao Local") + .Replace("胡桃", "胡桃 Local") + .Replace("DGP Studio", "DGP Studio CI"); + content = System.Text.RegularExpressions.Regex.Replace(content, " Name=\"([^\"]*)\"", " Name=\"E8B6E2B3-D2A0-4435-A81D-2A16AAF405C7\""); + content = System.Text.RegularExpressions.Regex.Replace(content, " Publisher=\"([^\"]*)\"", " Publisher=\"E=admin@dgp-studio.cn, CN=DGP Studio CI, OU=CI, O=DGP-Studio, L=San Jose, S=CA, C=US\""); + content = System.Text.RegularExpressions.Regex.Replace(content, " Version=\"([0-9\\.]+)\"", $" Version=\"{version}\""); + } System.IO.File.WriteAllText(manifest, content); @@ -173,6 +193,10 @@ Task("Build MSIX") { arguments = "pack /d " + binPath + " /p " + System.IO.Path.Combine(outputPath, $"Snap.Hutao-{version}.msix"); } + else + { + arguments = "pack /d " + binPath + " /p " + System.IO.Path.Combine(outputPath, $"Snap.Hutao.Local-{version}.msix"); + } var p = StartProcess( "makeappx.exe", new ProcessSettings diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaLogViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaLogViewModel.cs index 6d32962b..8880e0e6 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaLogViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaLogViewModel.cs @@ -104,10 +104,14 @@ internal sealed partial class GachaLogViewModel : Abstraction.ViewModel ArgumentNullException.ThrowIfNull(gachaLogService.ArchiveCollection); ObservableCollection archives = gachaLogService.ArchiveCollection; - await taskContext.SwitchToMainThreadAsync(); - Archives = archives; - HutaoCloudViewModel.RetrieveCommand = RetrieveFromCloudCommand; - await SetSelectedArchiveAndUpdateStatisticsAsync(Archives.SelectedOrDefault(), true).ConfigureAwait(false); + using (await EnterCriticalExecutionAsync().ConfigureAwait(false)) + { + await taskContext.SwitchToMainThreadAsync(); + Archives = archives; + HutaoCloudViewModel.RetrieveCommand = RetrieveFromCloudCommand; + await SetSelectedArchiveAndUpdateStatisticsAsync(Archives.SelectedOrDefault(), true).ConfigureAwait(false); + } + return true; } } diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiAvatarViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiAvatarViewModel.cs index 5b526fca..ba95f763 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiAvatarViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiAvatarViewModel.cs @@ -92,39 +92,49 @@ internal sealed partial class WikiAvatarViewModel : Abstraction.ViewModel protected override async ValueTask InitializeUIAsync() { - if (!await metadataService.InitializeAsync().ConfigureAwait(false)) + if (await metadataService.InitializeAsync().ConfigureAwait(false)) { - return false; + try + { + levelAvatarCurveMap = await metadataService.GetLevelToAvatarCurveMapAsync().ConfigureAwait(false); + promotes = await metadataService.GetAvatarPromoteListAsync().ConfigureAwait(false); + + Dictionary idMaterialMap = await metadataService.GetIdToMaterialMapAsync().ConfigureAwait(false); + List avatars = await metadataService.GetAvatarListAsync().ConfigureAwait(false); + IOrderedEnumerable sorted = avatars + .OrderByDescending(avatar => avatar.BeginTime) + .ThenByDescending(avatar => avatar.Sort); + List list = [.. sorted]; + + await CombineComplexDataAsync(list, idMaterialMap).ConfigureAwait(false); + + using (await EnterCriticalExecutionAsync().ConfigureAwait(false)) + { + await taskContext.SwitchToMainThreadAsync(); + Avatars = new(list, true); + Selected = Avatars.View.ElementAtOrDefault(0); + } + + FilterTokens = []; + + availableTokens = FrozenDictionary.ToFrozenDictionary( + [ + .. avatars.Select(avatar => KeyValuePair.Create(avatar.Name, new SearchToken(SearchTokenKind.Avatar, avatar.Name, sideIconUri: AvatarSideIconConverter.IconNameToUri(avatar.SideIcon)))), + .. IntrinsicFrozen.AssociationTypes.Select(assoc => KeyValuePair.Create(assoc, new SearchToken(SearchTokenKind.AssociationType, assoc, iconUri: AssociationTypeIconConverter.AssociationTypeNameToIconUri(assoc)))), + .. IntrinsicFrozen.BodyTypes.Select(b => KeyValuePair.Create(b, new SearchToken(SearchTokenKind.BodyType, b))), + .. IntrinsicFrozen.ElementNames.Select(e => KeyValuePair.Create(e, new SearchToken(SearchTokenKind.ElementName, e, iconUri: ElementNameIconConverter.ElementNameToIconUri(e)))), + .. IntrinsicFrozen.ItemQualities.Select(i => KeyValuePair.Create(i, new SearchToken(SearchTokenKind.ItemQuality, i, quality: QualityColorConverter.QualityNameToColor(i)))), + .. IntrinsicFrozen.WeaponTypes.Select(w => KeyValuePair.Create(w, new SearchToken(SearchTokenKind.WeaponType, w, iconUri: WeaponTypeIconConverter.WeaponTypeNameToIconUri(w)))), + ]); + + return true; + } + catch (OperationCanceledException) + { + } } - levelAvatarCurveMap = await metadataService.GetLevelToAvatarCurveMapAsync().ConfigureAwait(false); - promotes = await metadataService.GetAvatarPromoteListAsync().ConfigureAwait(false); - - Dictionary idMaterialMap = await metadataService.GetIdToMaterialMapAsync().ConfigureAwait(false); - List avatars = await metadataService.GetAvatarListAsync().ConfigureAwait(false); - IOrderedEnumerable sorted = avatars - .OrderByDescending(avatar => avatar.BeginTime) - .ThenByDescending(avatar => avatar.Sort); - List list = [.. sorted]; - - await CombineComplexDataAsync(list, idMaterialMap).ConfigureAwait(false); - - await taskContext.SwitchToMainThreadAsync(); - Avatars = new(list, true); - Selected = Avatars.View.ElementAtOrDefault(0); - FilterTokens = []; - - availableTokens = FrozenDictionary.ToFrozenDictionary( - [ - .. avatars.Select(avatar => KeyValuePair.Create(avatar.Name, new SearchToken(SearchTokenKind.Avatar, avatar.Name, sideIconUri: AvatarSideIconConverter.IconNameToUri(avatar.SideIcon)))), - .. IntrinsicFrozen.AssociationTypes.Select(assoc => KeyValuePair.Create(assoc, new SearchToken(SearchTokenKind.AssociationType, assoc, iconUri: AssociationTypeIconConverter.AssociationTypeNameToIconUri(assoc)))), - .. IntrinsicFrozen.BodyTypes.Select(b => KeyValuePair.Create(b, new SearchToken(SearchTokenKind.BodyType, b))), - .. IntrinsicFrozen.ElementNames.Select(e => KeyValuePair.Create(e, new SearchToken(SearchTokenKind.ElementName, e, iconUri: ElementNameIconConverter.ElementNameToIconUri(e)))), - .. IntrinsicFrozen.ItemQualities.Select(i => KeyValuePair.Create(i, new SearchToken(SearchTokenKind.ItemQuality, i, quality: QualityColorConverter.QualityNameToColor(i)))), - .. IntrinsicFrozen.WeaponTypes.Select(w => KeyValuePair.Create(w, new SearchToken(SearchTokenKind.WeaponType, w, iconUri: WeaponTypeIconConverter.WeaponTypeNameToIconUri(w)))), - ]); - - return true; + return false; } private async ValueTask CombineComplexDataAsync(List avatars, Dictionary idMaterialMap) diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiMonsterViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiMonsterViewModel.cs index 69ee0bbd..0ddd9446 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiMonsterViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiMonsterViewModel.cs @@ -53,21 +53,31 @@ internal sealed partial class WikiMonsterViewModel : Abstraction.ViewModel { if (await metadataService.InitializeAsync().ConfigureAwait(false)) { - levelMonsterCurveMap = await metadataService.GetLevelToMonsterCurveMapAsync().ConfigureAwait(false); - - List monsters = await metadataService.GetMonsterListAsync().ConfigureAwait(false); - Dictionary idDisplayMap = await metadataService.GetIdToDisplayItemAndMaterialMapAsync().ConfigureAwait(false); - foreach (Monster monster in monsters) + try + { + levelMonsterCurveMap = await metadataService.GetLevelToMonsterCurveMapAsync().ConfigureAwait(false); + + List monsters = await metadataService.GetMonsterListAsync().ConfigureAwait(false); + Dictionary idDisplayMap = await metadataService.GetIdToDisplayItemAndMaterialMapAsync().ConfigureAwait(false); + foreach (Monster monster in monsters) + { + monster.DropsView ??= monster.Drops?.SelectList(i => idDisplayMap.GetValueOrDefault(i, Material.Default)); + } + + List ordered = monsters.SortBy(m => m.RelationshipId.Value); + + using (await EnterCriticalExecutionAsync().ConfigureAwait(false)) + { + await taskContext.SwitchToMainThreadAsync(); + Monsters = new(ordered, true); + Selected = Monsters.View.ElementAtOrDefault(0); + } + + return true; + } + catch (OperationCanceledException) { - monster.DropsView ??= monster.Drops?.SelectList(i => idDisplayMap.GetValueOrDefault(i, Material.Default)); } - - List ordered = monsters.SortBy(m => m.RelationshipId.Value); - await taskContext.SwitchToMainThreadAsync(); - - Monsters = new(ordered, true); - Selected = Monsters.View.ElementAtOrDefault(0); - return true; } return false; diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiWeaponViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiWeaponViewModel.cs index 6816423d..374bbbdf 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiWeaponViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Wiki/WikiWeaponViewModel.cs @@ -92,32 +92,42 @@ internal sealed partial class WikiWeaponViewModel : Abstraction.ViewModel { if (await metadataService.InitializeAsync().ConfigureAwait(false)) { - levelWeaponCurveMap = await metadataService.GetLevelToWeaponCurveMapAsync().ConfigureAwait(false); - promotes = await metadataService.GetWeaponPromoteListAsync().ConfigureAwait(false); - Dictionary idMaterialMap = await metadataService.GetIdToMaterialMapAsync().ConfigureAwait(false); + try + { + levelWeaponCurveMap = await metadataService.GetLevelToWeaponCurveMapAsync().ConfigureAwait(false); + promotes = await metadataService.GetWeaponPromoteListAsync().ConfigureAwait(false); + Dictionary idMaterialMap = await metadataService.GetIdToMaterialMapAsync().ConfigureAwait(false); - List weapons = await metadataService.GetWeaponListAsync().ConfigureAwait(false); - IEnumerable sorted = weapons - .OrderByDescending(weapon => weapon.RankLevel) - .ThenBy(weapon => weapon.WeaponType) - .ThenByDescending(weapon => weapon.Id.Value); - List list = [.. sorted]; + List weapons = await metadataService.GetWeaponListAsync().ConfigureAwait(false); + IEnumerable sorted = weapons + .OrderByDescending(weapon => weapon.RankLevel) + .ThenBy(weapon => weapon.WeaponType) + .ThenByDescending(weapon => weapon.Id.Value); + List list = [.. sorted]; - await CombineComplexDataAsync(list, idMaterialMap).ConfigureAwait(false); + await CombineComplexDataAsync(list, idMaterialMap).ConfigureAwait(false); - await taskContext.SwitchToMainThreadAsync(); + using (await EnterCriticalExecutionAsync().ConfigureAwait(false)) + { + await taskContext.SwitchToMainThreadAsync(); - Weapons = new(list, true); - Selected = Weapons.View.ElementAtOrDefault(0); - FilterTokens = []; + Weapons = new(list, true); + Selected = Weapons.View.ElementAtOrDefault(0); + } - availableTokens = FrozenDictionary.ToFrozenDictionary( - [ - .. weapons.Select(w => KeyValuePair.Create(w.Name, new SearchToken(SearchTokenKind.Weapon, w.Name, sideIconUri: EquipIconConverter.IconNameToUri(w.Icon)))), - .. IntrinsicFrozen.FightProperties.Select(f => KeyValuePair.Create(f, new SearchToken(SearchTokenKind.FightProperty, f))), - .. IntrinsicFrozen.ItemQualities.Select(i => KeyValuePair.Create(i, new SearchToken(SearchTokenKind.ItemQuality, i, quality: QualityColorConverter.QualityNameToColor(i)))), - .. IntrinsicFrozen.WeaponTypes.Select(w => KeyValuePair.Create(w, new SearchToken(SearchTokenKind.WeaponType, w, iconUri: WeaponTypeIconConverter.WeaponTypeNameToIconUri(w)))), - ]); + FilterTokens = []; + + availableTokens = FrozenDictionary.ToFrozenDictionary( + [ + .. weapons.Select(w => KeyValuePair.Create(w.Name, new SearchToken(SearchTokenKind.Weapon, w.Name, sideIconUri: EquipIconConverter.IconNameToUri(w.Icon)))), + .. IntrinsicFrozen.FightProperties.Select(f => KeyValuePair.Create(f, new SearchToken(SearchTokenKind.FightProperty, f))), + .. IntrinsicFrozen.ItemQualities.Select(i => KeyValuePair.Create(i, new SearchToken(SearchTokenKind.ItemQuality, i, quality: QualityColorConverter.QualityNameToColor(i)))), + .. IntrinsicFrozen.WeaponTypes.Select(w => KeyValuePair.Create(w, new SearchToken(SearchTokenKind.WeaponType, w, iconUri: WeaponTypeIconConverter.WeaponTypeNameToIconUri(w)))), + ]); + } + catch (OperationCanceledException) + { + } } }