using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using RadicadeServer.DB; using RadicadeServer.Extensions; using RadicadeServer.RecNet.Accounts; using RadicadeServer.RecNet.Avatar; namespace RadicadeServer.API.Avatars.V2 { [Route("api/equipment/v2")] [Route("econ/api/equipment/v2")] public class EquipmentV2 : Controller { RecDBContext db; public EquipmentV2(RecDBContext context) { this.db = context; } [HttpGet("getUnlocked"), Authorize] public List GetUnlockedEquipment() { var userId = User.GetUserId(); var items = db.Unlocks.FirstOrDefault(x => x.AccountId == userId); var defaultEquipment = TryReadEquipment(LockerAccess.HasFullInventory(db, userId) ? EquipmentSkinCatalog.MergeInto(DBConfig.DefaultEquipmentItems, DBConfig.DefaultEquipmentSkinItems) : DBConfig.DefaultEquipmentUnlocks); var playerEquipment = GetPlayerEquipment(items); return MergeEquipment(defaultEquipment, playerEquipment); } private static List TryReadEquipment(string json) { try { return (json.FromJson>() ?? new List()) .Where(x => !string.IsNullOrWhiteSpace(x.PrefabName)) .Select(NormalizeEquipment) .ToList(); } catch { return new List(); } } private static List GetPlayerEquipment(PlayerUnlocks? items) { try { return items?.GetEquipment() ?? new List(); } catch { return new List(); } } private static List MergeEquipment(IEnumerable defaults, IEnumerable playerEquipment) { var merged = new Dictionary(); foreach (var item in defaults.Concat(playerEquipment).Select(NormalizeEquipment)) { if (string.IsNullOrWhiteSpace(item.PrefabName)) continue; merged[$"{item.PrefabName}\u001f{item.ModificationGuid}"] = item; } return merged.Values.ToList(); } private static Equipment NormalizeEquipment(Equipment item) { item.PrefabName ??= ""; item.ModificationGuid ??= ""; item.FriendlyName = string.IsNullOrWhiteSpace(item.FriendlyName) ? item.PrefabName : item.FriendlyName; item.Tooltip ??= ""; return item; } } }