using System.Text.Json; using System.Text.Json.Serialization; using Core.Models.Eft.Common.Request; using Core.Models.Eft.Customization; using Core.Models.Eft.Health; using Core.Models.Eft.Hideout; using Core.Models.Eft.Insurance; using Core.Models.Eft.Inventory; using Core.Models.Eft.Notes; using Core.Models.Eft.Quests; using Core.Models.Eft.Ragfair; using Core.Models.Eft.Repair; using Core.Models.Eft.Trade; using Core.Models.Eft.Wishlist; using Core.Models.Enums; namespace Core.Utils.Json.Converters; public class BaseInteractionRequestDataConverter : JsonConverter { public override BaseInteractionRequestData? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { using var jsonDocument = JsonDocument.ParseValue(ref reader); // Need to read the actual JSON text here so we can convert to the correct type var jsonText = jsonDocument.RootElement.GetRawText(); var value = JsonSerializer.Deserialize(jsonText); return ConvertToCorrectType(value, jsonText); } private BaseInteractionRequestData? ConvertToCorrectType(BaseInteractionRequestData? value, string jsonText) { switch (value.Action) { case ItemEventActions.CUSTOMIZATION_BUY: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.CUSTOMIZATION_SET: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.EAT: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.HEAL: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.RESTORE_HEALTH: return JsonSerializer.Deserialize(jsonText); case HideoutEventActions.HIDEOUT_UPGRADE: return JsonSerializer.Deserialize(jsonText); case HideoutEventActions.HIDEOUT_UPGRADE_COMPLETE: return JsonSerializer.Deserialize(jsonText); case HideoutEventActions.HIDEOUT_PUT_ITEMS_IN_AREA_SLOTS: return JsonSerializer.Deserialize(jsonText); case HideoutEventActions.HIDEOUT_TAKE_ITEMS_FROM_AREA_SLOTS: return JsonSerializer.Deserialize(jsonText); case HideoutEventActions.HIDEOUT_TOGGLE_AREA: return JsonSerializer.Deserialize(jsonText); case HideoutEventActions.HIDEOUT_SINGLE_PRODUCTION_START: return JsonSerializer.Deserialize(jsonText); case HideoutEventActions.HIDEOUT_SCAV_CASE_PRODUCTION_START: return JsonSerializer.Deserialize(jsonText); case HideoutEventActions.HIDEOUT_CONTINUOUS_PRODUCTION_START: return JsonSerializer.Deserialize(jsonText); case HideoutEventActions.HIDEOUT_TAKE_PRODUCTION: return JsonSerializer.Deserialize(jsonText); case HideoutEventActions.HIDEOUT_RECORD_SHOOTING_RANGE_POINTS: return JsonSerializer.Deserialize(jsonText); case HideoutEventActions.HIDEOUT_IMPROVE_AREA: case HideoutEventActions.HIDEOUT_CANCEL_PRODUCTION_COMMAND: return JsonSerializer.Deserialize(jsonText); case HideoutEventActions.HIDEOUT_CIRCLE_OF_CULTIST_PRODUCTION_START: return JsonSerializer.Deserialize(jsonText); case HideoutEventActions.HIDEOUT_DELETE_PRODUCTION_COMMAND: return JsonSerializer.Deserialize(jsonText); case HideoutEventActions.HIDEOUT_CUSTOMIZATION_APPLY_COMMAND: return JsonSerializer.Deserialize(jsonText); case HideoutEventActions.HIDEOUT_CUSTOMIZATION_SET_MANNEQUIN_POSE: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.INSURE: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.ADD_TO_WISHLIST: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.REMOVE_FROM_WISHLIST: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.CHANGE_WISHLIST_ITEM_CATEGORY: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.TRADING_CONFIRM: { var json = JsonSerializer.Deserialize(jsonText); switch (json.Type) { case ItemEventActions.BUY_FROM_TRADER: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.SELL_TO_TRADER: return JsonSerializer.Deserialize(jsonText); default: throw new Exception( $"Unhandled action type {value.Action}, make sure the BaseInteractionRequestDataConverter has the deserialization for this action handled." ); } } case ItemEventActions.RAGFAIR_BUY_OFFER: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.SELL_ALL_FROM_SAVAGE: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.REPAIR: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.TRADER_REPAIR: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.RAGFAIR_ADD_OFFER: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.RAGFAIR_REMOVE_OFFER: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.RAGFAIR_RENEW_OFFER: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.QUEST_ACCEPT: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.QUEST_COMPLETE: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.QUEST_HANDOVER: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.REPEATABLE_QUEST_CHANGE: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.ADD_NOTE: case ItemEventActions.EDIT_NOTE: case ItemEventActions.DELETE_NOTE: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.MOVE: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.REMOVE: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.SPLIT: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.MERGE: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.TRANSFER: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.SWAP: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.FOLD: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.TOGGLE: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.TAG: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.BIND: case ItemEventActions.UNBIND: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.EXAMINE: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.READ_ENCYCLOPEDIA: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.APPLY_INVENTORY_CHANGES: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.CREATE_MAP_MARKER: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.DELETE_MAP_MARKER: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.EDIT_MAP_MARKER: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.OPEN_RANDOM_LOOT_CONTAINER: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.HIDEOUT_QTE_EVENT: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.REDEEM_PROFILE_REWARD: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.SET_FAVORITE_ITEMS: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.QUEST_FAIL: return JsonSerializer.Deserialize(jsonText); case ItemEventActions.PIN_LOCK: return JsonSerializer.Deserialize(jsonText); default: throw new Exception( $"Unhandled action type {value.Action}, make sure the BaseInteractionRequestDataConverter has the deserialization for this action handled." ); } } public override void Write(Utf8JsonWriter writer, BaseInteractionRequestData value, JsonSerializerOptions options) { JsonSerializer.Serialize(writer, value, options); } }