using Microsoft.AspNetCore.Mvc; using Vanadium.Auth; using Vanadium.Classes; using Vanadium.Classes.DBs; using Vanadium.Classes.DBs.DBClasses; using Vanadium.Utils.NotiController; using static Vanadium.Classes.DBs.DBClasses.GiftsDBClasses; namespace Vanadium.Controllers { [ApiController] public partial class GiftsController : ControllerBase { [HttpGet("/api/avatar/v2/gifts")] public async Task GetMyGifts() { var id = AuthStuff.GetPlayerId(Request); if (id == null) return Unauthorized(""); var gifts = GiftsDB.GetUnconsumedGifts(id.Value); return Ok(gifts); } [HttpPost("/api/avatar/v2/gifts/consume/")] public async Task ConsumeGift([FromForm] long Id, [FromForm] int UnlockedLevel = 0) { var playerId = AuthStuff.GetPlayerId(Request); if (playerId == null) return Unauthorized(""); var gift = GiftsDB.GetGiftById(Id); if (gift == null) return NotFound(""); if (gift.ToPlayerId != playerId.Value) return StatusCode(403); bool consumed = GiftsDB.ConsumeGift(Id, playerId.Value); if (!consumed) return BadRequest(new { error = "Gift already consumed or not found", success = false, value = (object?)null }); var player = PlayerDB.Players.FindById(playerId.Value); bool playerUpdated = false; Console.WriteLine($"Comparing Gift Currency: {gift.Currency} > 0 && {gift.CurrencyType} != 0"); if (gift.Currency > 0 && gift.CurrencyType != 0) { Console.WriteLine($"Adding currency to player {playerId.Value}: {gift.Currency} of type {gift.CurrencyType}"); if (player?.Player?.PlayerExtra != null) { player.Player.PlayerExtra.Currencies ??= new List(); var currency = player.Player.PlayerExtra.Currencies .FirstOrDefault(x => (int)x.CurrencyType == gift.CurrencyType); Console.WriteLine($"About to set currency balance. Current balance: {currency?.Balance ?? 0}, Gift currency: {gift.Currency}"); if (currency != null) currency.Balance += gift.Currency; else player.Player.PlayerExtra.Currencies.Add(new PlayerDBClasses.PlayerCurrency { Balance = gift.Currency, CurrencyType = (PlayerDBClasses.CurrencyType)gift.CurrencyType, BalanceType = (PlayerDBClasses.BalanceType)gift.BalanceType }); Console.WriteLine($"Updated player {playerId.Value} currency. New balance: {currency?.Balance ?? gift.Currency}"); playerUpdated = true; } } if (!string.IsNullOrWhiteSpace(gift.EquipmentModificationGuid) && player?.Player != null) { string equipPath = Path.Join(Program.dataDir, "APIS", "Items", "Equipment.json"); if (System.IO.File.Exists(equipPath)) { var allItems = System.Text.Json.JsonSerializer.Deserialize>( System.IO.File.ReadAllText(equipPath), new System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true }); var target = allItems?.FirstOrDefault(i => string.Equals(i.ModificationGuid, gift.EquipmentModificationGuid, StringComparison.OrdinalIgnoreCase)); if (target != null) { player.Player.PlayerExtra ??= new PlayerDBClasses.PlayerExtra(); player.Player.PlayerExtra.OwnedEquipment ??= new List(); bool owns = player.Player.PlayerExtra.OwnedEquipment .Any(e => string.Equals(e.ModificationGuid, target.ModificationGuid, StringComparison.OrdinalIgnoreCase)); if (!owns) { player.Player.PlayerExtra.OwnedEquipment.Add(new PlayerDBClasses.OwnedEquipmentItem { PrefabName = target.PrefabName, ModificationGuid = target.ModificationGuid, FriendlyName = target.FriendlyName, PlatformMask = target.PlatformMask, Tooltip = target.Tooltip, Rarity = target.Rarity, Favorited = false }); playerUpdated = true; } } } } if (playerUpdated && player != null) PlayerDB.Players.Update(player); var giftDto = GiftsDB.MapToDTO(gift); await NotiController.SendEvent(playerId.Value, "30", giftDto); var remainingGifts = GiftsDB.GetUnconsumedGifts(playerId.Value); await NotiController.SendEvent(playerId.Value, "GiftConsumed", new { GiftId = Id, RemainingGifts = remainingGifts }); return Ok(new { error = "", success = true, value = (object?)null }); } } }