using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using BazaarServer.Managers; using WingsAPI.Communication; using WingsAPI.Communication.Bazaar; using WingsAPI.Data.Bazaar; using WingsEmu.Health; namespace BazaarServer.Services { public class BazaarService : IBazaarService { private readonly BazaarManager _bazaarManager; private readonly IMaintenanceManager _maintenanceManager; public BazaarService(BazaarManager bazaarManager, IMaintenanceManager maintenanceManager) { _bazaarManager = bazaarManager; _maintenanceManager = maintenanceManager; } private bool MaintenanceMode => _maintenanceManager.IsMaintenanceActive; public async ValueTask GetBazaarItemById(BazaarGetItemByIdRequest request) { if (MaintenanceMode) { return new BazaarItemResponse { ResponseType = RpcResponseType.MAINTENANCE_MODE }; } BazaarItemDTO bazaarItem = await _bazaarManager.GetBazaarItemById(request.BazaarItemId); return new BazaarItemResponse { ResponseType = bazaarItem == null ? RpcResponseType.GENERIC_SERVER_ERROR : RpcResponseType.SUCCESS, BazaarItemDto = bazaarItem }; } public async ValueTask AddItemToBazaar(BazaarAddItemRequest request) { if (MaintenanceMode) { return new BazaarItemResponse { ResponseType = RpcResponseType.MAINTENANCE_MODE }; } if (request.MaximumListedItems <= _bazaarManager.GetItemsByCharacterId(request.BazaarItemDto.CharacterId)?.Count) { return new BazaarItemResponse { ResponseType = RpcResponseType.GENERIC_SERVER_ERROR }; } BazaarItemDTO bazaarItemDto = await _bazaarManager.SaveAsync(request.BazaarItemDto); return new BazaarItemResponse { ResponseType = RpcResponseType.SUCCESS, BazaarItemDto = bazaarItemDto }; } public async ValueTask RemoveItemFromBazaar(BazaarRemoveItemRequest request) { if (MaintenanceMode) { return new BazaarItemResponse { ResponseType = RpcResponseType.MAINTENANCE_MODE }; } BazaarItemDTO deletedItem = await _bazaarManager.DeleteItemWithDto(request.BazaarItemDto, request.RequesterCharacterId); if (deletedItem == null) { return new BazaarItemResponse { ResponseType = RpcResponseType.GENERIC_SERVER_ERROR }; } return new BazaarItemResponse { ResponseType = RpcResponseType.SUCCESS, BazaarItemDto = deletedItem }; } public async ValueTask ChangeItemPriceFromBazaar(BazaarChangeItemPriceRequest request) { if (MaintenanceMode) { return new BazaarItemResponse { ResponseType = RpcResponseType.MAINTENANCE_MODE }; } BazaarItemDTO updatedItem = await _bazaarManager.ChangeItemPriceWithDto(request.BazaarItemDto, request.ChangerCharacterId, request.NewPrice, request.NewSaleFee); if (updatedItem == null) { return new BazaarItemResponse { ResponseType = RpcResponseType.GENERIC_SERVER_ERROR, BazaarItemDto = null }; } return new BazaarItemResponse { ResponseType = RpcResponseType.SUCCESS, BazaarItemDto = updatedItem }; } public async ValueTask GetItemsByCharacterIdFromBazaar(BazaarGetItemsByCharIdRequest request) { if (MaintenanceMode) { return new BazaarGetItemsByCharIdResponse { ResponseType = RpcResponseType.MAINTENANCE_MODE }; } return new BazaarGetItemsByCharIdResponse { ResponseType = RpcResponseType.SUCCESS, BazaarItems = _bazaarManager.GetItemsByCharacterId(request.CharacterId) }; } public async ValueTask RemoveItemsByCharacterIdFromBazaar(BazaarRemoveItemsByCharIdRequest request) { if (MaintenanceMode) { return new BazaarRemoveItemsByCharIdResponse { ResponseType = RpcResponseType.MAINTENANCE_MODE }; } ICollection items = _bazaarManager.GetItemsByCharacterId(request.CharacterId); if (items == null) { return new BazaarRemoveItemsByCharIdResponse { ResponseType = RpcResponseType.SUCCESS }; } foreach (BazaarItemDTO item in items) { await _bazaarManager.DeleteItemWithDto(item, request.CharacterId); } return new BazaarRemoveItemsByCharIdResponse { ResponseType = RpcResponseType.SUCCESS }; } public async ValueTask SearchBazaarItems(BazaarSearchBazaarItemsRequest request) { if (MaintenanceMode) { return new BazaarSearchBazaarItemsResponse { ResponseType = RpcResponseType.MAINTENANCE_MODE }; } return new BazaarSearchBazaarItemsResponse { ResponseType = RpcResponseType.SUCCESS, BazaarItemDtos = _bazaarManager.SearchBazaarItems(request.BazaarSearchContext) }; } public async ValueTask BuyItemFromBazaar(BazaarBuyItemRequest request) { if (MaintenanceMode) { return new BazaarItemResponse { ResponseType = RpcResponseType.MAINTENANCE_MODE }; } BazaarItemDTO cachedItem = await _bazaarManager.BuyItemWithExpectedValues(request.BazaarItemId, request.BuyerCharacterId, request.Amount, request.PricePerItem); if (cachedItem == null) { return new BazaarItemResponse { BazaarItemDto = null, ResponseType = RpcResponseType.GENERIC_SERVER_ERROR }; } return new BazaarItemResponse { BazaarItemDto = cachedItem, ResponseType = RpcResponseType.SUCCESS }; } public async ValueTask UnlistItemsFromBazaarWithVnumAsync(UnlistItemFromBazaarRequest request) { IReadOnlyCollection itemsToUnlist = _bazaarManager.SearchBazaarItems(new BazaarSearchContext { ItemVNumFilter = request.Vnum, Index = 0, AmountOfItemsPerIndex = 10000 }); List unlistedItems = await _bazaarManager.UnlistItemsWithVnums(itemsToUnlist.ToList()); return new UnlistItemFromBazaarResponse { UnlistedItems = unlistedItems.Count }; } public async ValueTask UnlistCharacterItemsFromBazaarAsync(UnlistCharacterItemsFromBazaarRequest request) { ICollection itemsToUnlist = _bazaarManager.GetItemsByCharacterId(request.Id); List unlistedItems = await _bazaarManager.UnlistItemsWithVnums(itemsToUnlist.ToList()); return new UnlistItemFromBazaarResponse { UnlistedItems = unlistedItems.Count }; } } }