From 2ea53fd39d15b8c2428121db2c7e828efbf3ac0d Mon Sep 17 00:00:00 2001 From: qhy040404 Date: Mon, 4 Mar 2024 18:01:44 +0800 Subject: [PATCH] Frozen Dictionaries --- .../Control/Panel/PanelSelector.xaml.cs | 11 ++--- .../Snap.Hutao/Core/Caching/ImageCache.cs | 12 +++--- .../Snap.Hutao/Core/TypeNameHelper.cs | 39 ++++++++--------- .../Converter/AssociationTypeIconConverter.cs | 25 +++++------ .../Converter/ElementNameIconConverter.cs | 41 +++++++++--------- .../Converter/QualityColorConverter.cs | 19 +++++---- .../Converter/WeaponTypeIconConverter.cs | 17 ++++---- .../Factory/GachaConfigTypeComparer.cs | 16 +++---- .../Control/AnnouncementContentViewer.xaml.cs | 23 +++++----- .../AvatarProperty/AvatarProperty.cs | 42 +++++++++---------- .../Snap.Hutao/Web/Hoyolab/HoyolabOptions.cs | 25 +++++------ 11 files changed, 139 insertions(+), 131 deletions(-) diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Panel/PanelSelector.xaml.cs b/src/Snap.Hutao/Snap.Hutao/Control/Panel/PanelSelector.xaml.cs index 8ce1ca54..796ef86b 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Panel/PanelSelector.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/Control/Panel/PanelSelector.xaml.cs @@ -4,6 +4,7 @@ using CommunityToolkit.WinUI.Controls; using Microsoft.UI.Xaml; using Snap.Hutao.Core.Setting; +using System.Collections.Frozen; namespace Snap.Hutao.Control.Panel; @@ -19,11 +20,11 @@ internal sealed partial class PanelSelector : Segmented public const string List = nameof(List); public const string Grid = nameof(Grid); - private static readonly Dictionary IndexTypeMap = new() - { - [0] = List, - [1] = Grid, - }; + private static readonly FrozenDictionary IndexTypeMap = FrozenDictionary.ToFrozenDictionary( + [ + KeyValuePair.Create(0, List), + KeyValuePair.Create(1, Grid), + ]); private readonly RoutedEventHandler loadedEventHandler; private readonly RoutedEventHandler unloadedEventHandler; diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Caching/ImageCache.cs b/src/Snap.Hutao/Snap.Hutao/Core/Caching/ImageCache.cs index 84a95a90..5fcf38ef 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/Caching/ImageCache.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/Caching/ImageCache.cs @@ -26,12 +26,12 @@ internal sealed partial class ImageCache : IImageCache, IImageCacheFilePathOpera { private const string CacheFolderName = nameof(ImageCache); - private readonly FrozenDictionary retryCountToDelay = new Dictionary() - { - [0] = TimeSpan.FromSeconds(4), - [1] = TimeSpan.FromSeconds(16), - [2] = TimeSpan.FromSeconds(64), - }.ToFrozenDictionary(); + private readonly FrozenDictionary retryCountToDelay = FrozenDictionary.ToFrozenDictionary( + [ + KeyValuePair.Create(0, TimeSpan.FromSeconds(4)), + KeyValuePair.Create(1, TimeSpan.FromSeconds(16)), + KeyValuePair.Create(2, TimeSpan.FromSeconds(64)), + ]); private readonly ConcurrentDictionary concurrentTasks = new(); diff --git a/src/Snap.Hutao/Snap.Hutao/Core/TypeNameHelper.cs b/src/Snap.Hutao/Snap.Hutao/Core/TypeNameHelper.cs index 66b635b9..b01f5ebe 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/TypeNameHelper.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/TypeNameHelper.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Collections.Frozen; using System.Text; namespace Snap.Hutao.Core; @@ -14,25 +15,25 @@ internal static class TypeNameHelper { private const char DefaultNestedTypeDelimiter = '+'; - private static readonly Dictionary BuiltInTypeNames = new() - { - { typeof(void), "void" }, - { typeof(bool), "bool" }, - { typeof(byte), "byte" }, - { typeof(char), "char" }, - { typeof(decimal), "decimal" }, - { typeof(double), "double" }, - { typeof(float), "float" }, - { typeof(int), "int" }, - { typeof(long), "long" }, - { typeof(object), "object" }, - { typeof(sbyte), "sbyte" }, - { typeof(short), "short" }, - { typeof(string), "string" }, - { typeof(uint), "uint" }, - { typeof(ulong), "ulong" }, - { typeof(ushort), "ushort" }, - }; + private static readonly FrozenDictionary BuiltInTypeNames = FrozenDictionary.ToFrozenDictionary( + [ + KeyValuePair.Create(typeof(void), "void"), + KeyValuePair.Create(typeof(bool), "bool"), + KeyValuePair.Create(typeof(byte), "byte"), + KeyValuePair.Create(typeof(char), "char"), + KeyValuePair.Create(typeof(decimal), "decimal"), + KeyValuePair.Create(typeof(double), "double"), + KeyValuePair.Create(typeof(float), "float"), + KeyValuePair.Create(typeof(int), "int"), + KeyValuePair.Create(typeof(long), "long"), + KeyValuePair.Create(typeof(object), "object"), + KeyValuePair.Create(typeof(sbyte), "sbyte"), + KeyValuePair.Create(typeof(short), "short"), + KeyValuePair.Create(typeof(string), "string"), + KeyValuePair.Create(typeof(uint), "uint"), + KeyValuePair.Create(typeof(ulong), "ulong"), + KeyValuePair.Create(typeof(ushort), "ushort"), + ]); /// /// 获取对象类型的显示名称 diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/AssociationTypeIconConverter.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/AssociationTypeIconConverter.cs index 93321a30..d70a868a 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/AssociationTypeIconConverter.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/AssociationTypeIconConverter.cs @@ -3,23 +3,24 @@ using Snap.Hutao.Control; using Snap.Hutao.Model.Intrinsic; +using System.Collections.Frozen; namespace Snap.Hutao.Model.Metadata.Converter; internal sealed class AssociationTypeIconConverter : ValueConverter { - private static readonly Dictionary LocalizedNameToAssociationType = new() - { - [SH.ModelIntrinsicAssociationTypeMondstadt] = AssociationType.ASSOC_TYPE_MONDSTADT, - [SH.ModelIntrinsicAssociationTypeLiyue] = AssociationType.ASSOC_TYPE_LIYUE, - [SH.ModelIntrinsicAssociationTypeFatui] = AssociationType.ASSOC_TYPE_FATUI, - [SH.ModelIntrinsicAssociationTypeInazuma] = AssociationType.ASSOC_TYPE_INAZUMA, - [SH.ModelIntrinsicAssociationTypeRanger] = AssociationType.ASSOC_TYPE_RANGER, - [SH.ModelIntrinsicAssociationTypeSumeru] = AssociationType.ASSOC_TYPE_SUMERU, - [SH.ModelIntrinsicAssociationTypeFontaine] = AssociationType.ASSOC_TYPE_FONTAINE, - [SH.ModelIntrinsicAssociationTypeNatlan] = AssociationType.ASSOC_TYPE_NATLAN, - [SH.ModelIntrinsicAssociationTypeSnezhnaya] = AssociationType.ASSOC_TYPE_SNEZHNAYA, - }; + private static readonly FrozenDictionary LocalizedNameToAssociationType = FrozenDictionary.ToFrozenDictionary( + [ + KeyValuePair.Create(SH.ModelIntrinsicAssociationTypeMondstadt, AssociationType.ASSOC_TYPE_MONDSTADT), + KeyValuePair.Create(SH.ModelIntrinsicAssociationTypeLiyue, AssociationType.ASSOC_TYPE_LIYUE), + KeyValuePair.Create(SH.ModelIntrinsicAssociationTypeFatui, AssociationType.ASSOC_TYPE_FATUI), + KeyValuePair.Create(SH.ModelIntrinsicAssociationTypeInazuma, AssociationType.ASSOC_TYPE_INAZUMA), + KeyValuePair.Create(SH.ModelIntrinsicAssociationTypeRanger, AssociationType.ASSOC_TYPE_RANGER), + KeyValuePair.Create(SH.ModelIntrinsicAssociationTypeSumeru, AssociationType.ASSOC_TYPE_SUMERU), + KeyValuePair.Create(SH.ModelIntrinsicAssociationTypeFontaine, AssociationType.ASSOC_TYPE_FONTAINE), + KeyValuePair.Create(SH.ModelIntrinsicAssociationTypeNatlan, AssociationType.ASSOC_TYPE_NATLAN), + KeyValuePair.Create(SH.ModelIntrinsicAssociationTypeSnezhnaya, AssociationType.ASSOC_TYPE_SNEZHNAYA), + ]); public static Uri? AssociationTypeNameToIconUri(string associationTypeName) { diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/ElementNameIconConverter.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/ElementNameIconConverter.cs index 34e2230b..a2579baa 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/ElementNameIconConverter.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/ElementNameIconConverter.cs @@ -3,6 +3,7 @@ using Snap.Hutao.Control; using Snap.Hutao.Model.Intrinsic; +using System.Collections.Frozen; namespace Snap.Hutao.Model.Metadata.Converter; @@ -12,27 +13,27 @@ namespace Snap.Hutao.Model.Metadata.Converter; [HighQuality] internal sealed class ElementNameIconConverter : ValueConverter { - private static readonly Dictionary LocalizedNameToElementIconName = new() - { - [SH.ModelIntrinsicElementNameElec] = "Electric", - [SH.ModelIntrinsicElementNameFire] = "Fire", - [SH.ModelIntrinsicElementNameGrass] = "Grass", - [SH.ModelIntrinsicElementNameIce] = "Ice", - [SH.ModelIntrinsicElementNameRock] = "Rock", - [SH.ModelIntrinsicElementNameWater] = "Water", - [SH.ModelIntrinsicElementNameWind] = "Wind", - }; + private static readonly FrozenDictionary LocalizedNameToElementIconName = FrozenDictionary.ToFrozenDictionary( + [ + KeyValuePair.Create(SH.ModelIntrinsicElementNameElec, "Electric"), + KeyValuePair.Create(SH.ModelIntrinsicElementNameFire, "Fire"), + KeyValuePair.Create(SH.ModelIntrinsicElementNameGrass, "Grass"), + KeyValuePair.Create(SH.ModelIntrinsicElementNameIce, "Ice"), + KeyValuePair.Create(SH.ModelIntrinsicElementNameRock, "Rock"), + KeyValuePair.Create(SH.ModelIntrinsicElementNameWater, "Water"), + KeyValuePair.Create(SH.ModelIntrinsicElementNameWind, "Wind"), + ]); - private static readonly Dictionary LocalizedNameToElementType = new() - { - [SH.ModelIntrinsicElementNameElec] = ElementType.Electric, - [SH.ModelIntrinsicElementNameFire] = ElementType.Fire, - [SH.ModelIntrinsicElementNameGrass] = ElementType.Grass, - [SH.ModelIntrinsicElementNameIce] = ElementType.Ice, - [SH.ModelIntrinsicElementNameRock] = ElementType.Rock, - [SH.ModelIntrinsicElementNameWater] = ElementType.Water, - [SH.ModelIntrinsicElementNameWind] = ElementType.Wind, - }; + private static readonly FrozenDictionary LocalizedNameToElementType = FrozenDictionary.ToFrozenDictionary( + [ + KeyValuePair.Create(SH.ModelIntrinsicElementNameElec, ElementType.Electric), + KeyValuePair.Create(SH.ModelIntrinsicElementNameFire, ElementType.Fire), + KeyValuePair.Create(SH.ModelIntrinsicElementNameGrass, ElementType.Grass), + KeyValuePair.Create(SH.ModelIntrinsicElementNameIce, ElementType.Ice), + KeyValuePair.Create(SH.ModelIntrinsicElementNameRock, ElementType.Rock), + KeyValuePair.Create(SH.ModelIntrinsicElementNameWater, ElementType.Water), + KeyValuePair.Create(SH.ModelIntrinsicElementNameWind, ElementType.Wind), + ]); /// /// 将中文元素名称转换为图标链接 diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/QualityColorConverter.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/QualityColorConverter.cs index c3da4da8..b85cec8d 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/QualityColorConverter.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/QualityColorConverter.cs @@ -5,6 +5,7 @@ using Microsoft.UI; using Snap.Hutao.Control; using Snap.Hutao.Model.Intrinsic; using Snap.Hutao.Win32; +using System.Collections.Frozen; using Windows.UI; namespace Snap.Hutao.Model.Metadata.Converter; @@ -15,15 +16,15 @@ namespace Snap.Hutao.Model.Metadata.Converter; [HighQuality] internal sealed class QualityColorConverter : ValueConverter { - private static readonly Dictionary LocalizedNameToQualityType = new() - { - [SH.ModelIntrinsicItemQualityWhite] = QualityType.QUALITY_WHITE, - [SH.ModelIntrinsicItemQualityGreen] = QualityType.QUALITY_GREEN, - [SH.ModelIntrinsicItemQualityBlue] = QualityType.QUALITY_BLUE, - [SH.ModelIntrinsicItemQualityPurple] = QualityType.QUALITY_PURPLE, - [SH.ModelIntrinsicItemQualityOrange] = QualityType.QUALITY_ORANGE, - [SH.ModelIntrinsicItemQualityRed] = QualityType.QUALITY_ORANGE_SP, - }; + private static readonly FrozenDictionary LocalizedNameToQualityType = FrozenDictionary.ToFrozenDictionary( + [ + KeyValuePair.Create(SH.ModelIntrinsicItemQualityWhite, QualityType.QUALITY_WHITE), + KeyValuePair.Create(SH.ModelIntrinsicItemQualityGreen, QualityType.QUALITY_GREEN), + KeyValuePair.Create(SH.ModelIntrinsicItemQualityBlue, QualityType.QUALITY_BLUE), + KeyValuePair.Create(SH.ModelIntrinsicItemQualityPurple, QualityType.QUALITY_PURPLE), + KeyValuePair.Create(SH.ModelIntrinsicItemQualityOrange, QualityType.QUALITY_ORANGE), + KeyValuePair.Create(SH.ModelIntrinsicItemQualityRed, QualityType.QUALITY_ORANGE_SP), + ]); public static Color QualityNameToColor(string qualityName) { diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/WeaponTypeIconConverter.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/WeaponTypeIconConverter.cs index 41712715..9768a170 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/WeaponTypeIconConverter.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/WeaponTypeIconConverter.cs @@ -3,6 +3,7 @@ using Snap.Hutao.Control; using Snap.Hutao.Model.Intrinsic; +using System.Collections.Frozen; namespace Snap.Hutao.Model.Metadata.Converter; @@ -12,14 +13,14 @@ namespace Snap.Hutao.Model.Metadata.Converter; [HighQuality] internal sealed class WeaponTypeIconConverter : ValueConverter { - private static readonly Dictionary LocalizedNameToWeaponType = new() - { - [SH.ModelIntrinsicWeaponTypeSwordOneHand] = WeaponType.WEAPON_SWORD_ONE_HAND, - [SH.ModelIntrinsicWeaponTypeBow] = WeaponType.WEAPON_BOW, - [SH.ModelIntrinsicWeaponTypePole] = WeaponType.WEAPON_POLE, - [SH.ModelIntrinsicWeaponTypeClaymore] = WeaponType.WEAPON_CLAYMORE, - [SH.ModelIntrinsicWeaponTypeCatalyst] = WeaponType.WEAPON_CATALYST, - }; + private static readonly FrozenDictionary LocalizedNameToWeaponType = FrozenDictionary.ToFrozenDictionary( + [ + KeyValuePair.Create(SH.ModelIntrinsicWeaponTypeSwordOneHand, WeaponType.WEAPON_SWORD_ONE_HAND), + KeyValuePair.Create(SH.ModelIntrinsicWeaponTypeBow, WeaponType.WEAPON_BOW), + KeyValuePair.Create(SH.ModelIntrinsicWeaponTypePole, WeaponType.WEAPON_POLE), + KeyValuePair.Create(SH.ModelIntrinsicWeaponTypeClaymore, WeaponType.WEAPON_CLAYMORE), + KeyValuePair.Create(SH.ModelIntrinsicWeaponTypeCatalyst, WeaponType.WEAPON_CATALYST), + ]); public static Uri WeaponTypeNameToIconUri(string weaponTypeName) { diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaConfigTypeComparer.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaConfigTypeComparer.cs index c396f2ba..533ff220 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaConfigTypeComparer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaConfigTypeComparer.cs @@ -13,14 +13,14 @@ namespace Snap.Hutao.Service.GachaLog.Factory; internal sealed class GachaConfigTypeComparer : IComparer { private static readonly Lazy LazyShared = new(() => new()); - private static readonly FrozenDictionary OrderMap = new Dictionary() - { - [GachaConfigType.AvatarEventWish] = 0, - [GachaConfigType.AvatarEventWish2] = 1, - [GachaConfigType.WeaponEventWish] = 2, - [GachaConfigType.StandardWish] = 3, - [GachaConfigType.NoviceWish] = 4, - }.ToFrozenDictionary(); + private static readonly FrozenDictionary OrderMap = FrozenDictionary.ToFrozenDictionary( + [ + KeyValuePair.Create(GachaConfigType.AvatarEventWish, 0), + KeyValuePair.Create(GachaConfigType.AvatarEventWish2, 1), + KeyValuePair.Create(GachaConfigType.WeaponEventWish, 2), + KeyValuePair.Create(GachaConfigType.StandardWish, 3), + KeyValuePair.Create(GachaConfigType.NoviceWish, 4), + ]); /// /// 共享的比较器 diff --git a/src/Snap.Hutao/Snap.Hutao/View/Control/AnnouncementContentViewer.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Control/AnnouncementContentViewer.xaml.cs index 6d98101b..4fbc1f56 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Control/AnnouncementContentViewer.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Control/AnnouncementContentViewer.xaml.cs @@ -7,6 +7,7 @@ using Microsoft.Web.WebView2.Core; using Snap.Hutao.Control.Extension; using Snap.Hutao.Control.Theme; using Snap.Hutao.Web.Hoyolab.Hk4e.Common.Announcement; +using System.Collections.Frozen; using System.Text; using System.Text.RegularExpressions; using Windows.Foundation; @@ -29,17 +30,17 @@ internal sealed partial class AnnouncementContentViewer : UserControl } """; - private static readonly Dictionary DarkLightReverts = new() - { - { "color:rgba(0,0,0,1)", "color:rgba(255,255,255,1)" }, - { "color:rgba(17,17,17,1)", "color:rgba(238,238,238,1)" }, - { "color:rgba(51,51,51,1)", "color:rgba(204,204,204,1)" }, - { "color:rgba(57,59,64,1)", "color:rgba(198,196,191,1)" }, - { "color:rgba(85,85,85,1)", "color:rgba(170,170,170,1)" }, - { "background-color: rgb(255, 215, 185)", "background-color: rgb(0,40,70)" }, - { "background-color: rgb(254, 245, 231)", "background-color: rgb(1,40,70)" }, - { "background-color:rgb(244, 244, 245)", "background-color:rgba(11, 11, 10)" }, - }; + private static readonly FrozenDictionary DarkLightReverts = FrozenDictionary.ToFrozenDictionary( + [ + KeyValuePair.Create("color:rgba(0,0,0,1)", "color:rgba(255,255,255,1)"), + KeyValuePair.Create("color:rgba(17,17,17,1)", "color:rgba(238,238,238,1)"), + KeyValuePair.Create("color:rgba(51,51,51,1)", "color:rgba(204,204,204,1)"), + KeyValuePair.Create("color:rgba(57,59,64,1)", "color:rgba(198,196,191,1)"), + KeyValuePair.Create("color:rgba(85,85,85,1)", "color:rgba(170,170,170,1)"), + KeyValuePair.Create("background-color: rgb(255, 215, 185)", "background-color: rgb(0,40,70)"), + KeyValuePair.Create("background-color: rgb(254, 245, 231)", "background-color: rgb(1,40,70)"), + KeyValuePair.Create("background-color:rgb(244, 244, 245)", "background-color:rgba(11, 11, 10)"), + ]); private readonly RoutedEventHandler loadEventHandler; private readonly RoutedEventHandler unloadEventHandler; diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/AvatarProperty/AvatarProperty.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/AvatarProperty/AvatarProperty.cs index 9154a949..3162d788 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/AvatarProperty/AvatarProperty.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/AvatarProperty/AvatarProperty.cs @@ -16,27 +16,27 @@ namespace Snap.Hutao.ViewModel.AvatarProperty; [HighQuality] internal sealed class AvatarProperty : ObservableObject, INameIcon, IAlternatingItem { - private static readonly FrozenDictionary PropertyIcons = new Dictionary() - { - [FightProperty.FIGHT_PROP_SKILL_CD_MINUS_RATIO] = Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_CDReduce.png").ToUri(), - [FightProperty.FIGHT_PROP_CHARGE_EFFICIENCY] = Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_ChargeEfficiency.png").ToUri(), - [FightProperty.FIGHT_PROP_CRITICAL] = Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_Critical.png").ToUri(), - [FightProperty.FIGHT_PROP_CRITICAL_HURT] = Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_Critical_Hurt.png").ToUri(), - [FightProperty.FIGHT_PROP_CUR_ATTACK] = Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_CurAttack.png").ToUri(), - [FightProperty.FIGHT_PROP_CUR_DEFENSE] = Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_CurDefense.png").ToUri(), - [FightProperty.FIGHT_PROP_ELEMENT_MASTERY] = Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_Element.png").ToUri(), - [FightProperty.FIGHT_PROP_ELEC_ADD_HURT] = Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_Element_Electric.png").ToUri(), - [FightProperty.FIGHT_PROP_FIRE_ADD_HURT] = Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_Element_Fire.png").ToUri(), - [FightProperty.FIGHT_PROP_GRASS_ADD_HURT] = Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_Element_Grass.png").ToUri(), - [FightProperty.FIGHT_PROP_ICE_ADD_HURT] = Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_Element_Ice.png").ToUri(), - [FightProperty.FIGHT_PROP_ROCK_ADD_HURT] = Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_Element_Rock.png").ToUri(), - [FightProperty.FIGHT_PROP_WATER_ADD_HURT] = Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_Element_Water.png").ToUri(), - [FightProperty.FIGHT_PROP_WIND_ADD_HURT] = Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_Element_Wind.png").ToUri(), - [FightProperty.FIGHT_PROP_HEAL_ADD] = Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_Heal.png").ToUri(), - [FightProperty.FIGHT_PROP_MAX_HP] = Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_MaxHp.png").ToUri(), - [FightProperty.FIGHT_PROP_PHYSICAL_ADD_HURT] = Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_PhysicalAttackUp.png").ToUri(), - [FightProperty.FIGHT_PROP_SHIELD_COST_MINUS_RATIO] = Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_ShieldCostMinus.png").ToUri(), - }.ToFrozenDictionary(); + private static readonly FrozenDictionary PropertyIcons = FrozenDictionary.ToFrozenDictionary( + [ + KeyValuePair.Create(FightProperty.FIGHT_PROP_SKILL_CD_MINUS_RATIO, Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_CDReduce.png").ToUri()), + KeyValuePair.Create(FightProperty.FIGHT_PROP_CHARGE_EFFICIENCY, Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_ChargeEfficiency.png").ToUri()), + KeyValuePair.Create(FightProperty.FIGHT_PROP_CRITICAL, Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_Critical.png").ToUri()), + KeyValuePair.Create(FightProperty.FIGHT_PROP_CRITICAL_HURT, Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_Critical_Hurt.png").ToUri()), + KeyValuePair.Create(FightProperty.FIGHT_PROP_CUR_ATTACK, Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_CurAttack.png").ToUri()), + KeyValuePair.Create(FightProperty.FIGHT_PROP_CUR_DEFENSE, Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_CurDefense.png").ToUri()), + KeyValuePair.Create(FightProperty.FIGHT_PROP_ELEMENT_MASTERY, Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_Element.png").ToUri()), + KeyValuePair.Create(FightProperty.FIGHT_PROP_ELEC_ADD_HURT, Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_Element_Electric.png").ToUri()), + KeyValuePair.Create(FightProperty.FIGHT_PROP_FIRE_ADD_HURT, Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_Element_Fire.png").ToUri()), + KeyValuePair.Create(FightProperty.FIGHT_PROP_GRASS_ADD_HURT, Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_Element_Grass.png").ToUri()), + KeyValuePair.Create(FightProperty.FIGHT_PROP_ICE_ADD_HURT, Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_Element_Ice.png").ToUri()), + KeyValuePair.Create(FightProperty.FIGHT_PROP_ROCK_ADD_HURT, Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_Element_Rock.png").ToUri()), + KeyValuePair.Create(FightProperty.FIGHT_PROP_WATER_ADD_HURT, Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_Element_Water.png").ToUri()), + KeyValuePair.Create(FightProperty.FIGHT_PROP_WIND_ADD_HURT, Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_Element_Wind.png").ToUri()), + KeyValuePair.Create(FightProperty.FIGHT_PROP_HEAL_ADD, Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_Heal.png").ToUri()), + KeyValuePair.Create(FightProperty.FIGHT_PROP_MAX_HP, Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_MaxHp.png").ToUri()), + KeyValuePair.Create(FightProperty.FIGHT_PROP_PHYSICAL_ADD_HURT, Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_PhysicalAttackUp.png").ToUri()), + KeyValuePair.Create(FightProperty.FIGHT_PROP_SHIELD_COST_MINUS_RATIO, Web.HutaoEndpoints.StaticRaw("Property", "UI_Icon_ShieldCostMinus.png").ToUri()), + ]); private Brush? background; diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/HoyolabOptions.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/HoyolabOptions.cs index ed0b1d08..d521d199 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/HoyolabOptions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/HoyolabOptions.cs @@ -47,21 +47,22 @@ internal static class HoyolabOptions /// /// 盐 /// - public static FrozenDictionary Salts { get; } = new Dictionary() - { + public static FrozenDictionary Salts { get; } = FrozenDictionary.ToFrozenDictionary( + [ + // Chinese - [SaltType.K2] = SaltConstants.CNK2, - [SaltType.LK2] = SaltConstants.CNLK2, - [SaltType.X4] = "xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs", - [SaltType.X6] = "t0qEgfub6cvueAPgR5m9aQWWVciEer7v", - [SaltType.PROD] = "JwYDpKvLj6MrMqqYU6jTKF17KNO2PXoS", + KeyValuePair.Create(SaltType.K2, SaltConstants.CNK2), + KeyValuePair.Create(SaltType.LK2, SaltConstants.CNLK2), + KeyValuePair.Create(SaltType.X4, "xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs"), + KeyValuePair.Create(SaltType.X6, "t0qEgfub6cvueAPgR5m9aQWWVciEer7v"), + KeyValuePair.Create(SaltType.PROD, "JwYDpKvLj6MrMqqYU6jTKF17KNO2PXoS"), // Oversea - [SaltType.OSK2] = SaltConstants.OSK2, - [SaltType.OSLK2] = SaltConstants.OSLK2, - [SaltType.OSX4] = "h4c1d6ywfq5bsbnbhm1bzq7bxzzv6srt", - [SaltType.OSX6] = "okr4obncj8bw5a65hbnn5oo6ixjc3l9w", - }.ToFrozenDictionary(); + KeyValuePair.Create(SaltType.OSK2, SaltConstants.OSK2), + KeyValuePair.Create(SaltType.OSLK2, SaltConstants.OSLK2), + KeyValuePair.Create(SaltType.OSX4, "h4c1d6ywfq5bsbnbhm1bzq7bxzzv6srt"), + KeyValuePair.Create(SaltType.OSX6, "okr4obncj8bw5a65hbnn5oo6ixjc3l9w"), + ]); [SuppressMessage("", "CA1308")] private static string GenerateDeviceId40()