using LiteDB; using Vanadium.Classes.DBs.DBClasses; using static Vanadium.Classes.DBs.DBClasses.StorefrontsDBClasses; using static Vanadium.Classes.DBs.DBClasses.PlayerDBClasses; namespace Vanadium.Classes.DBs { public class StorefrontsDB { public static LiteDatabase StorefrontsDBFile = new LiteDatabase("Filename=" + Path.Join(Program.dataDir, "DBs", "Storefronts.db") + ";Connection=shared"); public static readonly ILiteCollection Wishlists = StorefrontsDBFile.GetCollection("Wishlists"); public static readonly ILiteCollection AdCarousel = StorefrontsDBFile.GetCollection("AdCarousel"); public static readonly ILiteCollection TransferableConsumables = StorefrontsDBFile.GetCollection("TransferableConsumables"); static StorefrontsDB() { Wishlists.EnsureIndex(x => x.AccountId); Wishlists.EnsureIndex(x => x.PurchasableItemId); TransferableConsumables.EnsureIndex(x => x.PlayerId); } public static GiftDropStoreResponse? GetGiftDropStore(int storefrontType) { string fileName = $"{storefrontType}.json"; string path = Path.Combine(Environment.CurrentDirectory, "Data", "Storefronts", fileName); if (!File.Exists(path)) return null; try { var json = File.ReadAllText(path); var result = System.Text.Json.JsonSerializer.Deserialize(json, new System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true }); return result; } catch { return null; } } public static StoreItem? GetStoreItemById(int storefrontType, int purchasableItemId) { var store = GetGiftDropStore(storefrontType); return store?.StoreItems.FirstOrDefault(x => x.PurchasableItemId == purchasableItemId); } public static GiftDrop? GetGiftDropById(int storefrontType, int giftDropId) { var store = GetGiftDropStore(storefrontType); return store?.StoreItems.FirstOrDefault(x => x.GiftDrop?.GiftDropId == giftDropId)?.GiftDrop; } public static GiftDrop? GetGiftDropByIdAcrossAllStores(int giftDropId) { for (int i = 1; i <= 10; i++) { var drop = GetGiftDropById(i, giftDropId); if (drop != null) return drop; } return null; } public static List GetWishlist(long accountId) { return Wishlists.Find(x => x.AccountId == accountId).ToList(); } public static WishlistItem? AddToWishlist(long accountId, int purchasableItemId) { var existing = Wishlists.FindOne(x => x.AccountId == accountId && x.PurchasableItemId == purchasableItemId); if (existing != null) return existing; var item = new WishlistItem { WishlistItemId = Guid.NewGuid().ToString(), AccountId = accountId, CreatedAt = DateTime.UtcNow, PurchasableItemId = purchasableItemId }; Wishlists.Insert(item); return item; } public static bool RemoveFromWishlist(long accountId, int purchasableItemId) { var item = Wishlists.FindOne(x => x.AccountId == accountId && x.PurchasableItemId == purchasableItemId); if (item == null) return false; return Wishlists.Delete(item.WishlistItemId); } public static List? GetAdCarouselItems() { string path = Path.Combine(Environment.CurrentDirectory, "Data", "Storefronts", "AdCarousel.json"); if (!File.Exists(path)) return null; try { var json = File.ReadAllText(path); return System.Text.Json.JsonSerializer.Deserialize>(json, new System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true }); } catch { return null; } } public static PlayerCurrency? DeductCurrency(long playerId, int currencyType, int amount) { var player = PlayerDB.Players.FindById(playerId); if (player?.Player?.PlayerExtra?.Currencies == null) return null; var currency = player.Player.PlayerExtra.Currencies .FirstOrDefault(x => (int)x.CurrencyType == currencyType); if (currency == null || currency.Balance < amount) return null; currency.Balance -= amount; PlayerDB.Players.Update(player); return currency; } public static PlayerCurrency? AddCurrency(long playerId, int currencyType, int amount, BalanceType balanceType = BalanceType.NonPurchasedNotUsableInP2P) { var player = PlayerDB.Players.FindById(playerId); if (player?.Player == null) return null; player.Player.PlayerExtra ??= new PlayerExtra(); player.Player.PlayerExtra.Currencies ??= new List(); var currency = player.Player.PlayerExtra.Currencies .FirstOrDefault(x => (int)x.CurrencyType == currencyType); if (currency == null) { currency = new PlayerCurrency { Balance = 0, CurrencyType = (CurrencyType)currencyType, BalanceType = balanceType }; player.Player.PlayerExtra.Currencies.Add(currency); } currency.Balance += amount; PlayerDB.Players.Update(player); return currency; } public static int GetBalance(long playerId, int currencyType) { var player = PlayerDB.Players.FindById(playerId); if (player?.Player?.PlayerExtra?.Currencies == null) return 0; var currency = player.Player.PlayerExtra.Currencies .FirstOrDefault(x => (int)x.CurrencyType == currencyType); return currency?.Balance ?? 0; } public static List GetTransferableConsumables(long playerId) { var items = TransferableConsumables .Find(x => x.PlayerId == playerId && x.IsTransferable) .ToList(); return items .GroupBy(x => x.ConsumableItemDesc) .Select(g => { var first = g.First(); return new TransferableConsumableGroup { ActiveDurationMinutes = first.ActiveDurationMinutes, ConsumableItemDesc = g.Key, Count = first.Count, InitialCount = first.InitialCount, IsActive = first.IsActive, IsTransferable = first.IsTransferable, CreatedAts = g.Select(x => x.CreatedAt).ToList(), Ids = g.Select(x => x.Id).ToList() }; }) .ToList(); } public static List GrantTransferableConsumables(long playerId, string consumableItemDesc, int count, int activeDurationMinutes) { var granted = new List(); for (int i = 0; i < count; i++) { var item = new TransferableConsumable { PlayerId = playerId, ConsumableItemDesc = consumableItemDesc, ActiveDurationMinutes = activeDurationMinutes, Count = 1, InitialCount = 0, IsActive = false, IsTransferable = true, CreatedAt = DateTime.UtcNow }; TransferableConsumables.Insert(item); granted.Add(new ConsumableItemDTO { Id = item.Id, ConsumableItemDesc = item.ConsumableItemDesc, ActiveDurationMinutes = item.ActiveDurationMinutes, Count = item.Count, InitialCount = item.InitialCount, IsActive = item.IsActive, IsTransferable = item.IsTransferable, CreatedAt = item.CreatedAt }); } return granted; } } }