using Microsoft.EntityFrameworkCore; using RadicadeServer.DB; using RadicadeServer.Extensions; using RadicadeServer.RecNet.Accounts.Local; namespace RadicadeServer.RecNet.Avatar; public static class SavedOutfits { public static async Task> GetAsync(RecDBContext db, long accountId) { var avatar = await db.Avatars.AsNoTracking().FirstOrDefaultAsync(x => x.AccountId == accountId); return Parse(avatar?.Outfits); } public static async Task SaveAsync(RecDBContext db, long accountId, Outfit? outfit) { if (outfit?.Slot == null) return null; var avatar = await db.Avatars.FirstOrDefaultAsync(x => x.AccountId == accountId); if (avatar == null) { avatar = new PlayerAvatar { AccountId = accountId, Avatar = DBConfig.DefaultAvatar, Outfits = "[]" }; db.Avatars.Add(avatar); } var outfits = Parse(avatar.Outfits); var matchingSlot = outfits.FindIndex(x => x.Slot == outfit.Slot); if (matchingSlot >= 0) outfits[matchingSlot] = outfit; else outfits.Add(outfit); avatar.Outfits = outfits.ToJson(); await db.SaveChangesAsync(); return outfit; } private static List Parse(string? stored) { try { var outfits = (stored ?? string.Empty).FromJson>(); return outfits?.Where(x => x != null).ToList() ?? new List(); } catch { return new List(); } } }