using System.Text.Json; using System.Text.Json.Serialization; using RadicadeServer.Extensions; using RadicadeServer.RecNet.Enums.Store; namespace RadicadeServer.RecNet.Avatar { public class EquipmentSkinItem { [JsonPropertyName("prefab_name")] public string PrefabName { get; set; } = ""; [JsonPropertyName("modification_guid")] public string ModificationGuid { get; set; } = ""; [JsonPropertyName("display_name")] public string DisplayName { get; set; } = ""; [JsonPropertyName("tooltip")] public string Tooltip { get; set; } = ""; [JsonPropertyName("rarity")] public Rarity Rarity { get; set; } = Rarity.Common; [JsonPropertyName("storefront")] public string Storefront { get; set; } = ""; [JsonPropertyName("price")] public long Price { get; set; } [JsonPropertyName("image_name")] public string ImageName { get; set; } = ""; } public class EquipmentSkinFile { [JsonPropertyName("items")] public List Items { get; set; } = new(); } public static class EquipmentSkinCatalog { private static readonly JsonSerializerOptions ReadOptions = new() { PropertyNameCaseInsensitive = true, ReadCommentHandling = JsonCommentHandling.Skip, AllowTrailingCommas = true }; public static List Parse(string? json) { if (string.IsNullOrWhiteSpace(json)) return new List(); try { var file = JsonSerializer.Deserialize(json, ReadOptions); return (file?.Items ?? new List()) .Where(item => item != null && !string.IsNullOrWhiteSpace(item.PrefabName) && !string.IsNullOrWhiteSpace(item.ModificationGuid)) .ToList(); } catch (JsonException) { return new List(); } } public static List ToEquipment(IEnumerable skins) { return skins.Select(skin => new Equipment { PrefabName = skin.PrefabName.Trim(), ModificationGuid = skin.ModificationGuid.Trim(), UnlockedLevel = 0, Favorited = false, FriendlyName = string.IsNullOrWhiteSpace(skin.DisplayName) ? skin.PrefabName.Trim() : skin.DisplayName.Trim(), Tooltip = skin.Tooltip ?? "", Rarity = skin.Rarity }).ToList(); } public static string MergeInto(string? equipmentJson, string? skinsJson) { var skins = ToEquipment(Parse(skinsJson)); if (skins.Count == 0) return equipmentJson ?? "[]"; var equipment = ParseEquipment(equipmentJson); if (equipment == null) return equipmentJson ?? "[]"; var known = new HashSet( equipment.Select(Key), StringComparer.OrdinalIgnoreCase); var added = 0; foreach (var skin in skins) { if (!known.Add(Key(skin))) continue; equipment.Add(skin); added++; } return added == 0 ? equipmentJson ?? "[]" : equipment.ToJson(); } private static List? ParseEquipment(string? equipmentJson) { if (string.IsNullOrWhiteSpace(equipmentJson)) return new List(); try { return equipmentJson.FromJson>(ReadOptions) ?? new List(); } catch (JsonException) { return null; } } private static string Key(Equipment item) => $"{(item.PrefabName ?? "").Trim()}\u001f{(item.ModificationGuid ?? "").Trim()}"; } }