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); 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 "CustomizationBuy": return JsonSerializer.Deserialize(jsonText); case "CustomizationSet": return JsonSerializer.Deserialize(jsonText); case "Eat": return JsonSerializer.Deserialize(jsonText); case "Heal": return JsonSerializer.Deserialize(jsonText); case "RestoreHealth": 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 "Insure": return JsonSerializer.Deserialize(jsonText); /////////////////////////////////////////// InventoryBaseActionRequestData case "AddToWishList": return JsonSerializer.Deserialize(jsonText); case "RemoveFromWishList": return JsonSerializer.Deserialize(jsonText); case "ChangeWishlistItemCategory": return JsonSerializer.Deserialize(jsonText); case "TradingConfirm": { var json = JsonSerializer.Deserialize(jsonText); switch (json.Type) { case "buy_from_trader": return JsonSerializer.Deserialize(jsonText); case "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 "RagFairBuyOffer": return JsonSerializer.Deserialize(jsonText); case "SellAllFromSavage": return JsonSerializer.Deserialize(jsonText); case "Repair": return JsonSerializer.Deserialize(jsonText); case "TraderRepair": return JsonSerializer.Deserialize(jsonText); case "RagFairAddOffer": return JsonSerializer.Deserialize(jsonText); case "RagFairRemoveOffer": return JsonSerializer.Deserialize(jsonText); case "RagFairRenewOffer": return JsonSerializer.Deserialize(jsonText); case "QuestAccept": return JsonSerializer.Deserialize(jsonText); case "QuestComplete": return JsonSerializer.Deserialize(jsonText); case "QuestHandover": return JsonSerializer.Deserialize(jsonText); case "RepeatableQuestChange": return JsonSerializer.Deserialize(jsonText); case "AddNote": case "EditNote": case "DeleteNote": 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); } }