From f30dda24e32a1cb190322e19a17af00c3155c394 Mon Sep 17 00:00:00 2001 From: Cj <161484149+CJ-SPT@users.noreply.github.com> Date: Fri, 30 May 2025 09:10:52 -0400 Subject: [PATCH] Json util refactor --- Benchmarks/ClonerBenchmarks.cs | 3 +- .../Models/Eft/Common/Tables/BotBase.cs | 1 + .../Models/Eft/Common/Tables/Item.cs | 1 + .../Models/Eft/Ws/NotificationEventType.cs | 3 + .../Models/Enums/AirdropType.cs | 3 + .../Models/Enums/ArmorMaterial.cs | 3 + .../Models/Enums/BodyPartColliderType.cs | 5 +- .../Models/Enums/BonusSkillType.cs | 5 +- .../Models/Enums/BuffType.cs | 3 + .../Models/Enums/CurrencyType.cs | 3 + .../Models/Enums/DamageEffectType.cs | 3 + .../Models/Enums/DamageType.cs | 5 +- .../Models/Enums/EquipmentSlots.cs | 4 + .../Models/Enums/EventType.cs | 3 + .../Models/Enums/ExfiltrationType.cs | 3 + .../Models/Enums/ExitStatus.cs | 5 +- .../Models/Enums/GiftSenderType.cs | 3 + .../Models/Enums/MemberCategory.cs | 5 +- .../Models/Enums/PlayerSide.cs | 5 +- .../Models/Enums/PlayerSideMask.cs | 3 + .../Models/Enums/QuestStatusEnum.cs | 5 +- .../Models/Enums/QuestTypeEnum.cs | 5 +- .../Models/Enums/RepairStrategyType.cs | 3 + .../Models/Enums/RequirementState.cs | 3 + .../Models/Enums/RewardType.cs | 3 + .../Models/Enums/SeasonalEventType.cs | 3 + .../Models/Enums/SideType.cs | 3 + .../Models/Enums/ThrowWeapType.cs | 3 + .../Models/Enums/TraderServiceType.cs | 3 + .../Models/Logging/LogBackgroundColor.cs | 5 +- .../Models/Logging/LogTextColor.cs | 5 +- .../Models/RadioStationType.cs | 3 + .../Models/Spt/Dialog/SendMessageDetails.cs | 2 + .../Utils/Json/Converters/EftEnumConverter.cs | 7 + .../Json/Converters/EftListEnumConverter.cs | 7 + .../Converters/IJsonConverterRegistrator.cs | 8 ++ .../Converters/SptJsonConverterRegistrator.cs | 37 ++++++ .../SPTarkov.Server.Core/Utils/JsonUtil.cs | 120 ++++-------------- UnitTests/Tests/Test.cs | 5 +- UnitTests/Tests/Utils/HashUtilTests.cs | 3 +- UnitTests/Tests/Utils/JsonUtilTests.cs | 3 +- UnitTests/Tests/Utils/RandomUtilTests.cs | 3 +- 42 files changed, 195 insertions(+), 113 deletions(-) create mode 100644 Libraries/SPTarkov.Server.Core/Utils/Json/Converters/IJsonConverterRegistrator.cs create mode 100644 Libraries/SPTarkov.Server.Core/Utils/Json/Converters/SptJsonConverterRegistrator.cs diff --git a/Benchmarks/ClonerBenchmarks.cs b/Benchmarks/ClonerBenchmarks.cs index 6f5a3f15..e5eb646b 100644 --- a/Benchmarks/ClonerBenchmarks.cs +++ b/Benchmarks/ClonerBenchmarks.cs @@ -3,6 +3,7 @@ using Benchmarks.Mock; using SPTarkov.Server.Core.Models.Spt.Templates; using SPTarkov.Server.Core.Utils; using SPTarkov.Server.Core.Utils.Cloners; +using SPTarkov.Server.Core.Utils.Json.Converters; namespace Benchmarks; @@ -19,7 +20,7 @@ public class ClonerBenchmarks [GlobalSetup] public void Setup() { - var jsonUtil = new JsonUtil(); + var jsonUtil = new JsonUtil([ new SptJsonConverterRegistrator() ]); var importer = new ImporterUtil(new MockLogger(), new FileUtil(), jsonUtil); var loadTask = importer.LoadRecursiveAsync("./Assets/database/templates/"); diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotBase.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotBase.cs index 0b68d734..d54dc6c7 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotBase.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotBase.cs @@ -616,6 +616,7 @@ public record Ban } } +[EftEnumConverter] public enum BanType { Chat, diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/Item.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/Item.cs index e00a4b10..afdf5836 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/Item.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/Item.cs @@ -408,6 +408,7 @@ public record LockableComponent public LockableKeyComponent? KeyComponent { get; set; } } +[EftEnumConverter] public enum PinLockState { Free, diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Ws/NotificationEventType.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Ws/NotificationEventType.cs index 3b323637..d628921f 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Eft/Ws/NotificationEventType.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Ws/NotificationEventType.cs @@ -1,5 +1,8 @@ +using SPTarkov.Server.Core.Utils.Json.Converters; + namespace SPTarkov.Server.Core.Models.Eft.Ws; +[EftEnumConverter] public enum NotificationEventType { AssortmentUnlockRule, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/AirdropType.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/AirdropType.cs index eecf4942..3b5aae09 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/AirdropType.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/AirdropType.cs @@ -1,3 +1,5 @@ +using SPTarkov.Server.Core.Utils.Json.Converters; + namespace SPTarkov.Server.Core.Models.Enums; public enum AirdropTypeEnum @@ -8,6 +10,7 @@ public enum AirdropTypeEnum Weapon } +[EftEnumConverter] public enum SptAirdropTypeEnum { mixed, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/ArmorMaterial.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/ArmorMaterial.cs index c22ff34f..c9a7dabb 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/ArmorMaterial.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/ArmorMaterial.cs @@ -1,5 +1,8 @@ +using SPTarkov.Server.Core.Utils.Json.Converters; + namespace SPTarkov.Server.Core.Models.Enums; +[EftEnumConverter] public enum ArmorMaterial { UHMWPE, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/BodyPartColliderType.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/BodyPartColliderType.cs index 00b081a0..1bddcfe8 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/BodyPartColliderType.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/BodyPartColliderType.cs @@ -1,5 +1,8 @@ -namespace SPTarkov.Server.Core.Models.Enums; +using SPTarkov.Server.Core.Utils.Json.Converters; +namespace SPTarkov.Server.Core.Models.Enums; + +[EftEnumConverter] public enum BodyPartColliderType { None = -1, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/BonusSkillType.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/BonusSkillType.cs index bb12c118..2122a5e0 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/BonusSkillType.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/BonusSkillType.cs @@ -1,5 +1,8 @@ -namespace SPTarkov.Server.Core.Models.Enums; +using SPTarkov.Server.Core.Utils.Json.Converters; +namespace SPTarkov.Server.Core.Models.Enums; + +[EftEnumConverter] public enum BonusSkillType { Physical, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/BuffType.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/BuffType.cs index 63df367d..3519559d 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/BuffType.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/BuffType.cs @@ -1,5 +1,8 @@ +using SPTarkov.Server.Core.Utils.Json.Converters; + namespace SPTarkov.Server.Core.Models.Enums; +[EftEnumConverter] public enum BuffType { WeaponSpread, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/CurrencyType.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/CurrencyType.cs index 5d70b69d..d093381b 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/CurrencyType.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/CurrencyType.cs @@ -1,5 +1,8 @@ +using SPTarkov.Server.Core.Utils.Json.Converters; + namespace SPTarkov.Server.Core.Models.Enums; +[EftEnumConverter] public enum CurrencyType { RUB, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/DamageEffectType.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/DamageEffectType.cs index 4864b9d1..e8b18b1e 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/DamageEffectType.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/DamageEffectType.cs @@ -1,5 +1,8 @@ +using SPTarkov.Server.Core.Utils.Json.Converters; + namespace SPTarkov.Server.Core.Models.Enums; +[EftEnumConverter] public enum DamageEffectType { HeavyBleeding, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/DamageType.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/DamageType.cs index 4b48b160..efab4467 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/DamageType.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/DamageType.cs @@ -1,5 +1,8 @@ -namespace SPTarkov.Server.Core.Models.Enums; +using SPTarkov.Server.Core.Utils.Json.Converters; +namespace SPTarkov.Server.Core.Models.Enums; + +[EftListEnumConverter] public enum DamageType { Undefined = 1, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/EquipmentSlots.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/EquipmentSlots.cs index f5c71914..2d3edff2 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/EquipmentSlots.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/EquipmentSlots.cs @@ -1,5 +1,9 @@ +using SPTarkov.Server.Core.Utils.Json.Converters; + namespace SPTarkov.Server.Core.Models.Enums; +[EftEnumConverter] +[EftListEnumConverter] public enum EquipmentSlots { Headwear, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/EventType.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/EventType.cs index 578b88f2..01f8a990 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/EventType.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/EventType.cs @@ -1,5 +1,8 @@ +using SPTarkov.Server.Core.Utils.Json.Converters; + namespace SPTarkov.Server.Core.Models.Enums; +[EftEnumConverter] public enum EventType { None, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/ExfiltrationType.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/ExfiltrationType.cs index cffa17a6..50d98214 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/ExfiltrationType.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/ExfiltrationType.cs @@ -1,5 +1,8 @@ +using SPTarkov.Server.Core.Utils.Json.Converters; + namespace SPTarkov.Server.Core.Models.Enums; +[EftEnumConverter] public enum ExfiltrationType { Individual, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/ExitStatus.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/ExitStatus.cs index 8642ef73..f084521c 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/ExitStatus.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/ExitStatus.cs @@ -1,5 +1,8 @@ -namespace SPTarkov.Server.Core.Models.Enums; +using SPTarkov.Server.Core.Utils.Json.Converters; +namespace SPTarkov.Server.Core.Models.Enums; + +[EftEnumConverter] public enum ExitStatus { SURVIVED, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/GiftSenderType.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/GiftSenderType.cs index b9d3c69c..93bf8cfa 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/GiftSenderType.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/GiftSenderType.cs @@ -1,5 +1,8 @@ +using SPTarkov.Server.Core.Utils.Json.Converters; + namespace SPTarkov.Server.Core.Models.Enums; +[EftEnumConverter] public enum GiftSenderType { System, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/MemberCategory.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/MemberCategory.cs index 7a69da93..f4350748 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/MemberCategory.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/MemberCategory.cs @@ -1,5 +1,8 @@ -namespace SPTarkov.Server.Core.Models.Enums; +using SPTarkov.Server.Core.Utils.Json.Converters; +namespace SPTarkov.Server.Core.Models.Enums; + +[EftEnumConverter] public enum MemberCategory { Default = 0, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/PlayerSide.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/PlayerSide.cs index 6a450a93..65095235 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/PlayerSide.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/PlayerSide.cs @@ -1,5 +1,8 @@ -namespace SPTarkov.Server.Core.Models.Enums; +using SPTarkov.Server.Core.Utils.Json.Converters; +namespace SPTarkov.Server.Core.Models.Enums; + +[EftListEnumConverter] public enum PlayerSide { Usec = 1, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/PlayerSideMask.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/PlayerSideMask.cs index fccf8116..4290cf98 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/PlayerSideMask.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/PlayerSideMask.cs @@ -1,5 +1,8 @@ +using SPTarkov.Server.Core.Utils.Json.Converters; + namespace SPTarkov.Server.Core.Models.Enums; +[EftEnumConverter] public enum PlayerSideMask { None, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/QuestStatusEnum.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/QuestStatusEnum.cs index c0d1a536..14bec0f5 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/QuestStatusEnum.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/QuestStatusEnum.cs @@ -1,5 +1,8 @@ -namespace SPTarkov.Server.Core.Models.Enums; +using SPTarkov.Server.Core.Utils.Json.Converters; +namespace SPTarkov.Server.Core.Models.Enums; + +[EftEnumConverter] public enum QuestStatusEnum { Locked = 0, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/QuestTypeEnum.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/QuestTypeEnum.cs index 923f53c2..f1311b63 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/QuestTypeEnum.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/QuestTypeEnum.cs @@ -1,5 +1,8 @@ -namespace SPTarkov.Server.Core.Models.Enums; +using SPTarkov.Server.Core.Utils.Json.Converters; +namespace SPTarkov.Server.Core.Models.Enums; + +[EftEnumConverter] public enum QuestTypeEnum { PickUp, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/RepairStrategyType.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/RepairStrategyType.cs index 8466d71c..473cc5a7 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/RepairStrategyType.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/RepairStrategyType.cs @@ -1,5 +1,8 @@ +using SPTarkov.Server.Core.Utils.Json.Converters; + namespace SPTarkov.Server.Core.Models.Enums; +[EftEnumConverter] public enum RepairStrategyType { MeleeWeapon, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/RequirementState.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/RequirementState.cs index b251c5e0..b926f02c 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/RequirementState.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/RequirementState.cs @@ -1,5 +1,8 @@ +using SPTarkov.Server.Core.Utils.Json.Converters; + namespace SPTarkov.Server.Core.Models.Enums; +[EftEnumConverter] public enum RequirementState { None, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/RewardType.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/RewardType.cs index 1b2d39f1..232f957f 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/RewardType.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/RewardType.cs @@ -1,5 +1,8 @@ +using SPTarkov.Server.Core.Utils.Json.Converters; + namespace SPTarkov.Server.Core.Models.Enums; +[EftEnumConverter] public enum RewardType { Experience, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/SeasonalEventType.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/SeasonalEventType.cs index 587a85e2..418ff1bb 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/SeasonalEventType.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/SeasonalEventType.cs @@ -1,5 +1,8 @@ +using SPTarkov.Server.Core.Utils.Json.Converters; + namespace SPTarkov.Server.Core.Models.Enums; +[EftEnumConverter] public enum SeasonalEventType { None, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/SideType.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/SideType.cs index fc167059..2f69a3f3 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/SideType.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/SideType.cs @@ -1,5 +1,8 @@ +using SPTarkov.Server.Core.Utils.Json.Converters; + namespace SPTarkov.Server.Core.Models.Enums; +[EftEnumConverter] public enum SideType { Pmc, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/ThrowWeapType.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/ThrowWeapType.cs index c8bd9dc2..8f13b877 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/ThrowWeapType.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/ThrowWeapType.cs @@ -1,5 +1,8 @@ +using SPTarkov.Server.Core.Utils.Json.Converters; + namespace SPTarkov.Server.Core.Models.Enums; +[EftEnumConverter] public enum ThrowWeapType { frag_grenade, diff --git a/Libraries/SPTarkov.Server.Core/Models/Enums/TraderServiceType.cs b/Libraries/SPTarkov.Server.Core/Models/Enums/TraderServiceType.cs index a027ce6c..2fae19c0 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Enums/TraderServiceType.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Enums/TraderServiceType.cs @@ -1,5 +1,8 @@ +using SPTarkov.Server.Core.Utils.Json.Converters; + namespace SPTarkov.Server.Core.Models.Enums; +[EftEnumConverter] public enum TraderServiceType { ExUsecLoyalty, diff --git a/Libraries/SPTarkov.Server.Core/Models/Logging/LogBackgroundColor.cs b/Libraries/SPTarkov.Server.Core/Models/Logging/LogBackgroundColor.cs index 1e0829fe..31ac44c3 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Logging/LogBackgroundColor.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Logging/LogBackgroundColor.cs @@ -1,5 +1,8 @@ -namespace SPTarkov.Server.Core.Models.Logging; +using SPTarkov.Server.Core.Utils.Json.Converters; +namespace SPTarkov.Server.Core.Models.Logging; + +[EftEnumConverter] public enum LogBackgroundColor { Black = 40, diff --git a/Libraries/SPTarkov.Server.Core/Models/Logging/LogTextColor.cs b/Libraries/SPTarkov.Server.Core/Models/Logging/LogTextColor.cs index 9b8df4ec..8198a180 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Logging/LogTextColor.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Logging/LogTextColor.cs @@ -1,5 +1,8 @@ -namespace SPTarkov.Server.Core.Models.Logging; +using SPTarkov.Server.Core.Utils.Json.Converters; +namespace SPTarkov.Server.Core.Models.Logging; + +[EftEnumConverter] public enum LogTextColor { Black = 30, diff --git a/Libraries/SPTarkov.Server.Core/Models/RadioStationType.cs b/Libraries/SPTarkov.Server.Core/Models/RadioStationType.cs index d81709d7..19be1aae 100644 --- a/Libraries/SPTarkov.Server.Core/Models/RadioStationType.cs +++ b/Libraries/SPTarkov.Server.Core/Models/RadioStationType.cs @@ -1,5 +1,8 @@ +using SPTarkov.Server.Core.Utils.Json.Converters; + namespace SPTarkov.Server.Core.Models; +[EftEnumConverter] public enum RadioStationType { None, diff --git a/Libraries/SPTarkov.Server.Core/Models/Spt/Dialog/SendMessageDetails.cs b/Libraries/SPTarkov.Server.Core/Models/Spt/Dialog/SendMessageDetails.cs index b416f4e2..b7de12c7 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Spt/Dialog/SendMessageDetails.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Spt/Dialog/SendMessageDetails.cs @@ -2,6 +2,7 @@ using System.Text.Json.Serialization; using SPTarkov.Server.Core.Models.Eft.Common.Tables; using SPTarkov.Server.Core.Models.Eft.Profile; using SPTarkov.Server.Core.Models.Enums; +using SPTarkov.Server.Core.Utils.Json.Converters; namespace SPTarkov.Server.Core.Models.Spt.Dialog; @@ -176,6 +177,7 @@ public record ProfileChangeEvent } } +[EftEnumConverter] public enum ProfileChangeEventType { TraderSalesSum, diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftEnumConverter.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftEnumConverter.cs index 4cbbeeed..089d5589 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftEnumConverter.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftEnumConverter.cs @@ -85,3 +85,10 @@ public class EftEnumConverter : JsonConverter writer.WritePropertyName(propertyValue.ToString()); } } + +/// +/// This attribute should be applied to enums which should be added as a converter to the json converter +/// +[AttributeUsage(AttributeTargets.Enum)] +public class EftEnumConverterAttribute : Attribute +{ } diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftListEnumConverter.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftListEnumConverter.cs index 0470e1c4..63a79be3 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftListEnumConverter.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftListEnumConverter.cs @@ -34,3 +34,10 @@ public class EftListEnumConverter : JsonConverter> writer.WriteEndArray(); } } + +/// +/// This attribute should be applied to enums which should be added as a converter to the json converter +/// +[AttributeUsage(AttributeTargets.Enum)] +public class EftListEnumConverterAttribute : Attribute +{ } diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/IJsonConverterRegistrator.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/IJsonConverterRegistrator.cs new file mode 100644 index 00000000..bac3f1c6 --- /dev/null +++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/IJsonConverterRegistrator.cs @@ -0,0 +1,8 @@ +using System.Text.Json.Serialization; + +namespace SPTarkov.Server.Core.Utils.Json.Converters; + +public interface IJsonConverterRegistrator +{ + public IEnumerable GetJsonConverters(); +} diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/SptJsonConverterRegistrator.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/SptJsonConverterRegistrator.cs new file mode 100644 index 00000000..e31f0a56 --- /dev/null +++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/SptJsonConverterRegistrator.cs @@ -0,0 +1,37 @@ +using System.Reflection; +using System.Text.Json.Serialization; +using SPTarkov.DI.Annotations; + +namespace SPTarkov.Server.Core.Utils.Json.Converters; + +[Injectable] +public class SptJsonConverterRegistrator : IJsonConverterRegistrator +{ + public IEnumerable GetJsonConverters() + { + return [ + new BaseSptLoggerReferenceConverter(), + new ListOrTConverterFactory(), + new DictionaryOrListConverter(), + + new EftEnumConverter(), // Special case, this belongs to a lib. + new BaseInteractionRequestDataConverter(), + + ..GetGenericJsonConverters() + ]; + } + + private static List GetGenericJsonConverters() + { + var enums = Assembly.GetExecutingAssembly().GetTypes() + .Where(type => type.IsEnum && type.GetCustomAttribute() != null); + + var listEnums = Assembly.GetExecutingAssembly().GetTypes() + .Where(type => type.IsEnum && type.GetCustomAttribute() != null); + + var result = enums.Select(e => (JsonConverter) Activator.CreateInstance(typeof(EftEnumConverter<>).MakeGenericType(e))!).ToList(); + result.AddRange(listEnums.Select(e => (JsonConverter) Activator.CreateInstance(typeof(EftListEnumConverter<>).MakeGenericType(e))!)); + + return result; + } +} diff --git a/Libraries/SPTarkov.Server.Core/Utils/JsonUtil.cs b/Libraries/SPTarkov.Server.Core/Utils/JsonUtil.cs index 940c1e00..1b5ff942 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/JsonUtil.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/JsonUtil.cs @@ -2,75 +2,41 @@ using System.Text.Encodings.Web; using System.Text.Json; using System.Text.Json.Serialization; using SPTarkov.DI.Annotations; -using SPTarkov.Server.Core.Models; -using SPTarkov.Server.Core.Models.Eft.Common.Tables; -using SPTarkov.Server.Core.Models.Eft.Ws; -using SPTarkov.Server.Core.Models.Enums; -using SPTarkov.Server.Core.Models.Logging; -using SPTarkov.Server.Core.Models.Spt.Dialog; using SPTarkov.Server.Core.Utils.Json.Converters; -using LogLevel = SPTarkov.Server.Core.Models.Spt.Logging.LogLevel; namespace SPTarkov.Server.Core.Utils; [Injectable(InjectionType.Singleton)] public class JsonUtil { - private static JsonSerializerOptions jsonSerializerOptionsNoIndent = new() + private static JsonSerializerOptions? jsonSerializerOptionsNoIndent; + private static JsonSerializerOptions? jsonSerializerOptionsIndented; + + public JsonUtil( + IEnumerable registrators + ) { - WriteIndented = false, - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, - UnmappedMemberHandling = JsonUnmappedMemberHandling.Disallow, - Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, - Converters = + jsonSerializerOptionsNoIndent = new JsonSerializerOptions { - new BaseSptLoggerReferenceConverter(), - new ListOrTConverterFactory(), - new DictionaryOrListConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), - new EftEnumConverter(), + WriteIndented = false, + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, + UnmappedMemberHandling = JsonUnmappedMemberHandling.Disallow, + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + }; - new EftListEnumConverter(), - new EftListEnumConverter(), - new EftListEnumConverter(), - new BaseInteractionRequestDataConverter() + foreach (var registrator in registrators) + { + foreach (var converter in registrator.GetJsonConverters()) + { + jsonSerializerOptionsNoIndent.Converters.Add(converter); + } } - }; - protected static JsonSerializerOptions jsonSerializerOptionsIndented = new(jsonSerializerOptionsNoIndent) - { - WriteIndented = true - }; + jsonSerializerOptionsIndented = new JsonSerializerOptions(jsonSerializerOptionsNoIndent) + { + WriteIndented = true + }; + } /// /// Convert JSON into an object @@ -165,44 +131,4 @@ public class JsonUtil { return obj == null ? null : JsonSerializer.Serialize(obj, type, indented ? jsonSerializerOptionsIndented : jsonSerializerOptionsNoIndent); } - - protected static void AddConverter(JsonSerializerOptions options, JsonConverter newConverter) - { - if (options.Converters.All(c => c.GetType() != newConverter.GetType())) - { - // Doesn't exist, add - options.Converters.Add(newConverter); - } - } - - /// - /// Register a Json converter to serializer options - /// - /// The converter to add - public void RegisterJsonConverter(JsonConverter converter) - { - // This might actually be a terrible thing to do, but it is what it is for now - - if (!jsonSerializerOptionsNoIndent.IsReadOnly) - { - AddConverter(jsonSerializerOptionsNoIndent, converter); - } - else - { - var noIndentConverter = new JsonSerializerOptions(jsonSerializerOptionsNoIndent); - AddConverter(noIndentConverter, converter); - jsonSerializerOptionsNoIndent = noIndentConverter; - } - - if (!jsonSerializerOptionsIndented.IsReadOnly) - { - AddConverter(jsonSerializerOptionsIndented, converter); - } - else - { - var indentedConverter = new JsonSerializerOptions(jsonSerializerOptionsIndented); - AddConverter(indentedConverter, converter); - jsonSerializerOptionsIndented = indentedConverter; - } - } } diff --git a/UnitTests/Tests/Test.cs b/UnitTests/Tests/Test.cs index 989b5e08..c68a3bab 100644 --- a/UnitTests/Tests/Test.cs +++ b/UnitTests/Tests/Test.cs @@ -1,5 +1,6 @@ using SPTarkov.Server.Core.Models.Spt.Templates; using SPTarkov.Server.Core.Utils; +using SPTarkov.Server.Core.Utils.Json.Converters; using UnitTests.Mock; namespace UnitTests.Tests; @@ -12,7 +13,7 @@ public class Test [TestInitialize] public void Setup() { - var importer = new ImporterUtil(new MockLogger(), new FileUtil(), new JsonUtil()); + var importer = new ImporterUtil(new MockLogger(), new FileUtil(), new JsonUtil([ new SptJsonConverterRegistrator() ])); var loadTask = importer.LoadRecursiveAsync("./TestAssets/"); loadTask.Wait(); _templates = loadTask.Result; @@ -21,7 +22,7 @@ public class Test [TestMethod] public void TestMethod1() { - var result = new JsonUtil().Serialize(_templates); + var result = new JsonUtil([ new SptJsonConverterRegistrator() ]).Serialize(_templates); Console.WriteLine(result); } } diff --git a/UnitTests/Tests/Utils/HashUtilTests.cs b/UnitTests/Tests/Utils/HashUtilTests.cs index faee9b11..9d15bc49 100644 --- a/UnitTests/Tests/Utils/HashUtilTests.cs +++ b/UnitTests/Tests/Utils/HashUtilTests.cs @@ -2,6 +2,7 @@ using System.Collections.Concurrent; using System.Diagnostics; using SPTarkov.Server.Core.Utils; using SPTarkov.Server.Core.Utils.Cloners; +using SPTarkov.Server.Core.Utils.Json.Converters; using UnitTests.Mock; namespace UnitTests.Tests.Utils; @@ -9,7 +10,7 @@ namespace UnitTests.Tests.Utils; [TestClass] public class HashUtilTests { - protected HashUtil _hashUtil = new(new RandomUtil(new MockLogger(), new JsonCloner(new JsonUtil()))); + protected HashUtil _hashUtil = new(new RandomUtil(new MockLogger(), new JsonCloner(new JsonUtil([ new SptJsonConverterRegistrator() ])))); [TestMethod] public void GenerateTest() diff --git a/UnitTests/Tests/Utils/JsonUtilTests.cs b/UnitTests/Tests/Utils/JsonUtilTests.cs index a64c6d9b..8df9406a 100644 --- a/UnitTests/Tests/Utils/JsonUtilTests.cs +++ b/UnitTests/Tests/Utils/JsonUtilTests.cs @@ -1,12 +1,13 @@ using SPTarkov.Server.Core.Models.Enums; using SPTarkov.Server.Core.Utils; +using SPTarkov.Server.Core.Utils.Json.Converters; namespace UnitTests.Tests.Utils; [TestClass] public class JsonUtilTests { - protected JsonUtil _jsonUtil = new(); + protected JsonUtil _jsonUtil = new([ new SptJsonConverterRegistrator() ]); [TestMethod] public void SerializeAndDeserialize_WithDictionaryOfETFEnum_ExpectCorrectParsing() diff --git a/UnitTests/Tests/Utils/RandomUtilTests.cs b/UnitTests/Tests/Utils/RandomUtilTests.cs index abdfed13..1442e199 100644 --- a/UnitTests/Tests/Utils/RandomUtilTests.cs +++ b/UnitTests/Tests/Utils/RandomUtilTests.cs @@ -1,5 +1,6 @@ using SPTarkov.Server.Core.Utils; using SPTarkov.Server.Core.Utils.Cloners; +using SPTarkov.Server.Core.Utils.Json.Converters; using UnitTests.Mock; namespace UnitTests.Tests.Utils; @@ -7,7 +8,7 @@ namespace UnitTests.Tests.Utils; [TestClass] public sealed class RandomUtilTests { - private readonly RandomUtil _randomUtil = new(new MockLogger(), new JsonCloner(new JsonUtil())); + private readonly RandomUtil _randomUtil = new(new MockLogger(), new JsonCloner(new JsonUtil([ new SptJsonConverterRegistrator() ]))); [TestMethod] public void GetIntTest()