From d3cd4359fac4e1c2cb09a320821972c118643415 Mon Sep 17 00:00:00 2001 From: Jesse Date: Thu, 3 Jul 2025 21:24:05 +0200 Subject: [PATCH] Mongo fixes (#444) * Pass Json serializer options to all converters * Fix required on record that has two sets of id's * Pass options to mod handlers * Update method --- .../Models/Eft/Common/Tables/Item.cs | 2 +- .../BaseInteractionRequestDataConverter.cs | 184 +++++++++++------- 2 files changed, 119 insertions(+), 67 deletions(-) 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 6007344b..27ee5e62 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/Item.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/Item.cs @@ -62,7 +62,7 @@ public record HideoutItem } [JsonPropertyName("id")] - public required MongoId Id { get; set; } + public MongoId Id { get; set; } [JsonPropertyName("_tpl")] public required MongoId Template { get; set; } diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/BaseInteractionRequestDataConverter.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/BaseInteractionRequestDataConverter.cs index ff8bec21..7b71bedc 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/BaseInteractionRequestDataConverter.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/BaseInteractionRequestDataConverter.cs @@ -18,8 +18,10 @@ namespace SPTarkov.Server.Core.Utils.Json.Converters; public class BaseInteractionRequestDataConverter : JsonConverter { - private static Dictionary> _modHandlers = - new(); + private static Dictionary< + string, + Func + > _modHandlers = []; public override BaseInteractionRequestData? Read( ref Utf8JsonReader reader, @@ -35,7 +37,7 @@ public class BaseInteractionRequestDataConverter : JsonConverter @@ -48,76 +50,105 @@ public class BaseInteractionRequestDataConverter : JsonConverter(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.CUSTOMIZATION_SET: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.EAT: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.HEAL: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.RESTORE_HEALTH: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case HideoutEventActions.HIDEOUT_UPGRADE: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case HideoutEventActions.HIDEOUT_UPGRADE_COMPLETE: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize( + jsonText, + options + ); case HideoutEventActions.HIDEOUT_PUT_ITEMS_IN_AREA_SLOTS: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case HideoutEventActions.HIDEOUT_TAKE_ITEMS_FROM_AREA_SLOTS: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case HideoutEventActions.HIDEOUT_TOGGLE_AREA: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case HideoutEventActions.HIDEOUT_SINGLE_PRODUCTION_START: return JsonSerializer.Deserialize( - jsonText + jsonText, + options ); case HideoutEventActions.HIDEOUT_SCAV_CASE_PRODUCTION_START: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize( + jsonText, + options + ); case HideoutEventActions.HIDEOUT_CONTINUOUS_PRODUCTION_START: return JsonSerializer.Deserialize( - jsonText + jsonText, + options ); case HideoutEventActions.HIDEOUT_TAKE_PRODUCTION: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize( + jsonText, + options + ); case HideoutEventActions.HIDEOUT_RECORD_SHOOTING_RANGE_POINTS: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case HideoutEventActions.HIDEOUT_IMPROVE_AREA: case HideoutEventActions.HIDEOUT_CANCEL_PRODUCTION_COMMAND: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case HideoutEventActions.HIDEOUT_CIRCLE_OF_CULTIST_PRODUCTION_START: return JsonSerializer.Deserialize( - jsonText + jsonText, + options ); case HideoutEventActions.HIDEOUT_DELETE_PRODUCTION_COMMAND: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize( + jsonText, + options + ); case HideoutEventActions.HIDEOUT_CUSTOMIZATION_APPLY_COMMAND: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize( + jsonText, + options + ); case HideoutEventActions.HIDEOUT_CUSTOMIZATION_SET_MANNEQUIN_POSE: return JsonSerializer.Deserialize( - jsonText + jsonText, + options ); case ItemEventActions.INSURE: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.ADD_TO_WISHLIST: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.REMOVE_FROM_WISHLIST: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.CHANGE_WISHLIST_ITEM_CATEGORY: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize( + jsonText, + options + ); case ItemEventActions.TRADING_CONFIRM: { switch (jsonDocumentRoot.GetProperty("type").GetString()) { case ItemEventActions.BUY_FROM_TRADER: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize( + jsonText, + options + ); case ItemEventActions.SELL_TO_TRADER: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize( + jsonText, + options + ); default: throw new Exception( $"Unhandled action type: {action}, make sure BaseInteractionRequestDataConverter has deserialization for this action." @@ -125,80 +156,101 @@ public class BaseInteractionRequestDataConverter : JsonConverter(jsonText); + return JsonSerializer.Deserialize( + jsonText, + options + ); case ItemEventActions.SELL_ALL_FROM_SAVAGE: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize( + jsonText, + options + ); case ItemEventActions.REPAIR: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.TRADER_REPAIR: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.RAGFAIR_ADD_OFFER: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.RAGFAIR_REMOVE_OFFER: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.RAGFAIR_RENEW_OFFER: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.QUEST_ACCEPT: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.QUEST_COMPLETE: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.QUEST_HANDOVER: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.REPEATABLE_QUEST_CHANGE: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.ADD_NOTE: case ItemEventActions.EDIT_NOTE: case ItemEventActions.DELETE_NOTE: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.MOVE: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.REMOVE: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.SPLIT: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.MERGE: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.TRANSFER: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.SWAP: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.FOLD: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.TOGGLE: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.TAG: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.BIND: case ItemEventActions.UNBIND: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.EXAMINE: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.READ_ENCYCLOPEDIA: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize( + jsonText, + options + ); case ItemEventActions.APPLY_INVENTORY_CHANGES: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.CREATE_MAP_MARKER: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize( + jsonText, + options + ); case ItemEventActions.DELETE_MAP_MARKER: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize( + jsonText, + options + ); case ItemEventActions.EDIT_MAP_MARKER: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize( + jsonText, + options + ); case ItemEventActions.OPEN_RANDOM_LOOT_CONTAINER: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize( + jsonText, + options + ); case ItemEventActions.HIDEOUT_QTE_EVENT: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.REDEEM_PROFILE_REWARD: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.SET_FAVORITE_ITEMS: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.QUEST_FAIL: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); case ItemEventActions.PIN_LOCK: - return JsonSerializer.Deserialize(jsonText); + return JsonSerializer.Deserialize(jsonText, options); default: if (_modHandlers.TryGetValue(action, out var handler)) { - return handler(jsonText); + return handler(jsonText, options); } throw new Exception( $"Unhandled action type {action}, make sure the BaseInteractionRequestDataConverter has the deserialization for this action handled." @@ -208,7 +260,7 @@ public class BaseInteractionRequestDataConverter : JsonConverter handler + Func handler ) { if (!_modHandlers.TryAdd(action, handler))