public void HandleRequest(IRequest request) { var character = request.Session.Character; var orderId = request.Data.GetOrDefault <int>(k.ID); var newPrice = request.Data.GetOrDefault <double>(k.price); var testMode = request.Session.AccessLevel.IsAdminOrGm(); using (var scope = Db.CreateTransaction()) { newPrice.ThrowIfLessOrEqual(0, ErrorCodes.IllegalMarketPrice); var order = _marketOrderRepository.Get(orderId).ThrowIfNull(ErrorCodes.ItemNotFound); order.submitterEID.ThrowIfNotEqual(character.Eid, ErrorCodes.AccessDenied); if (!request.Session.AccessLevel.IsAdminOrGm()) { if (!order.IsModifyTimeValid()) { Message.Builder.FromRequest(request).WithData(order.GetValidModifyInfo()).WrapToResult().Send(); return; } } var newTotalPrice = newPrice * order.quantity; var oldPrice = order.FullPrice; order.price = newPrice; // set the new price if (!order.isSell) { //BUY order var priceDifference = newTotalPrice - oldPrice; if (Math.Abs(priceDifference) < double.Epsilon) { //nothing to do return; } // take the deposit from the character or corp _marketHelper.CashIn(character, order.useCorporationWallet, priceDifference, order.itemDefinition, 1, TransactionType.ModifyMarketOrder); //store the deposit in the central bank var dockingBase = order.GetMarket().GetDockingBase(); dockingBase.AddCentralBank(TransactionType.ModifyMarketOrder, priceDifference); } //update the price in sql _marketOrderRepository.UpdatePrice(order); var result = _marketHelper.GetMarketOrdersInfo(character); Message.Builder.FromRequest(request).WithData(result).WrapToResult().Send(); scope.Complete(); } Task.Run(() => { BackgroundProcess(testMode); }); }
public void HandleRequest(IRequest request) { using (var scope = Db.CreateTransaction()) { var buyer = request.Session.Character; var marketItemId = request.Data.GetOrDefault <int>(k.marketItemID); var useCorporationWallet = request.Data.GetOrDefault <int>(k.useCorporationWallet) == 1; var quantity = request.Data.GetOrDefault <int>(k.quantity); quantity.ThrowIfLessOrEqual(0, ErrorCodes.WTFErrorMedicalAttentionSuggested); buyer.IsDocked.ThrowIfFalse(ErrorCodes.CharacterHasToBeDocked); buyer.CheckPrivilegedTransactionsAndThrowIfFailed(); var market = buyer.GetCurrentDockingBase().GetMarketOrThrow(); var sellOrder = _marketOrderRepository.Get(marketItemId).ThrowIfNull(ErrorCodes.ItemNotFound); sellOrder.submitterEID.ThrowIfEqual(buyer.Eid, ErrorCodes.CannotBuyFromYourself); var corporationEid = buyer.CorporationEid; if (sellOrder.forMembersOf != null) { corporationEid.ThrowIfNotEqual((long)sellOrder.forMembersOf, ErrorCodes.AccessDenied); } var publicContainer = buyer.GetPublicContainerWithItems(); var sellerEid = sellOrder.submitterEID; var seller = Character.GetByEid(sellerEid); if (!sellOrder.isVendorItem) { //nem vendor, hanem player az aki eladja a cuccot var forCorporation = sellOrder.forMembersOf != null; var boughtQuantity = quantity; seller.ThrowIfEqual(null, ErrorCodes.CharacterNotFound); // the item as entity var itemOnMarket = market.GetItemByMarketOrder(sellOrder); var resultItem = itemOnMarket; if (sellOrder.quantity == quantity) { //delete the sell order coz it's done _marketOrderRepository.Delete(sellOrder); sellOrder.quantity = 0; } else if (sellOrder.quantity > quantity) { sellOrder.quantity = sellOrder.quantity - quantity; _marketOrderRepository.UpdateQuantity(sellOrder); resultItem = itemOnMarket.Unstack(quantity); itemOnMarket.Save(); } else if (sellOrder.quantity < quantity) { //bought quantity => marketitem.quantity boughtQuantity = sellOrder.quantity; //delete the sell order coz it's done _marketOrderRepository.Delete(sellOrder); sellOrder.quantity = 0; } resultItem.Owner = buyer.Eid; // add to public container publicContainer.AddItem(resultItem, false); publicContainer.Save(); //take money _marketHelper.CashIn(buyer, useCorporationWallet, sellOrder.price, sellOrder.itemDefinition, boughtQuantity, TransactionType.marketBuy); //pay out market.PayOutToSeller(seller, sellOrder.useCorporationWallet, resultItem.Definition, sellOrder.price, boughtQuantity, TransactionType.marketSell, sellOrder.IsAffectsAverage(), forCorporation); Market.SendMarketItemBoughtMessage(buyer, resultItem); Message.Builder.SetCommand(Commands.MarketSellOrderUpdate) .WithData(new Dictionary <string, object> { { k.sellOrder, sellOrder.ToDictionary() } }) .ToCharacters(seller, buyer) .Send(); } else { // the item is a vendor sell order if (sellOrder.quantity < 0) { //infinite quantity case _marketHelper.CashIn(buyer, useCorporationWallet, sellOrder.price, sellOrder.itemDefinition, quantity, TransactionType.marketBuy); var boughtItem = publicContainer.CreateAndAddItem(sellOrder.itemDefinition, false, item => { item.Owner = buyer.Eid; item.Quantity = quantity; }); Market.SendMarketItemBoughtMessage(buyer, boughtItem); //average price _marketHandler.InsertAveragePrice(market, sellOrder.itemDefinition, quantity * sellOrder.price, quantity); market.AddCentralBank(TransactionType.marketBuy, quantity * sellOrder.price); //vendor income } else { // vendor finite var boughtQuantity = quantity; if (sellOrder.quantity == quantity) { sellOrder.quantity = 0; //signal order delete //all sold _marketOrderRepository.Delete(sellOrder); } else if (sellOrder.quantity < quantity) { boughtQuantity = sellOrder.quantity; //clip the amount sellOrder.quantity = 0; //signal order delete //all sold _marketOrderRepository.Delete(sellOrder); } else if (sellOrder.quantity > quantity) { sellOrder.quantity -= quantity; //update entry _marketOrderRepository.UpdateQuantity(sellOrder); } _marketHelper.CashIn(buyer, useCorporationWallet, sellOrder.price, sellOrder.itemDefinition, boughtQuantity, TransactionType.marketBuy); //average price _marketHandler.InsertAveragePrice(market, sellOrder.itemDefinition, boughtQuantity * sellOrder.price, boughtQuantity); market.AddCentralBank(TransactionType.marketBuy, boughtQuantity * sellOrder.price); //vendor income var boughtItem = publicContainer.CreateAndAddItem(sellOrder.itemDefinition, false, item => { item.Owner = buyer.Eid; item.Quantity = boughtQuantity; }); Market.SendMarketItemBoughtMessage(buyer, boughtItem); Message.Builder.SetCommand(Commands.MarketSellOrderUpdate) .WithData(new Dictionary <string, object> { { k.sellOrder, sellOrder.ToDictionary() } }) .ToCharacter(buyer) .Send(); } } publicContainer.Save(); Message.Builder.SetCommand(Commands.ListContainer) .WithData(publicContainer.ToDictionary()) .ToCharacter(buyer) .Send(); scope.Complete(); } }
public void HandleRequest(IRequest request) { using (var scope = Db.CreateTransaction()) { var buyer = request.Session.Character; var itemDefinition = request.Data.GetOrDefault <int>(k.definition); var duration = request.Data.GetOrDefault <int>(k.duration); var pricePerPiece = request.Data.GetOrDefault <double>(k.price); var quantity = request.Data.GetOrDefault(k.quantity, 1); var useBuyerCorporationWallet = request.Data.GetOrDefault <int>(k.useCorporationWallet) == 1; var forMyCorporation = request.Data.GetOrDefault <int>(k.forMembersOf) == 1; quantity.ThrowIfLessOrEqual(0, ErrorCodes.AmountTooLow); buyer.IsDocked.ThrowIfFalse(ErrorCodes.CharacterHasToBeDocked); buyer.CheckPrivilegedTransactionsAndThrowIfFailed(); pricePerPiece.ThrowIfLessOrEqual(0, ErrorCodes.IllegalMarketPrice); duration.ThrowIfLessOrEqual(1, ErrorCodes.MinimalDurationNotReached); var ed = EntityDefault.Get(itemDefinition).ThrowIfEqual(EntityDefault.None, ErrorCodes.DefinitionNotSupported); ed.IsSellable.ThrowIfFalse(ErrorCodes.ItemNotSellable); var market = buyer.GetCurrentDockingBase().GetMarketOrThrow(); var realMarketFee = Market.GetRealMarketFee(buyer, duration); var corporationEid = buyer.CorporationEid; //cash market fee anyways _marketHelper.CashInMarketFee(buyer, useBuyerCorporationWallet, realMarketFee); buyer.GetCurrentDockingBase().AddCentralBank(TransactionType.marketFee, realMarketFee); if (_marketInfoService.CheckAveragePrice) { var avgPrice = _marketHandler.GetAveragePriceByMarket(market, itemDefinition); if (avgPrice != null && avgPrice.AveragePrice > 0) { if (pricePerPiece < avgPrice.AveragePrice * (1 - _marketInfoService.Margin) || pricePerPiece > avgPrice.AveragePrice * (1 + _marketInfoService.Margin)) { throw new PerpetuumException(ErrorCodes.PriceOutOfAverageRange); } } } var publicContainer = buyer.GetPublicContainerWithItems(); long?forMembersOf = null; if (forMyCorporation) { if (!DefaultCorporationDataCache.IsCorporationDefault(corporationEid)) { forMembersOf = corporationEid; } else { forMyCorporation = false; } } if (!forMyCorporation) { _marketHelper.CheckBuyOrderCounts(buyer).ThrowIfFalse(ErrorCodes.MarketItemsExceed); } var lowestSellOrder = _marketOrderRepository.GetLowestSellOrder(itemDefinition, pricePerPiece, buyer.Eid, market, corporationEid); if (!forMyCorporation && lowestSellOrder != null) { // requested item was found on the market, make immediate transaction market.FulfillBuyOrderInstantly(buyer, useBuyerCorporationWallet, lowestSellOrder, pricePerPiece, duration, quantity, publicContainer, forMembersOf); } else { var deposit = pricePerPiece * quantity; // take the deposit from the character _marketHelper.CashIn(buyer, useBuyerCorporationWallet, pricePerPiece, itemDefinition, quantity, TransactionType.buyOrderDeposit); //store the deposit in the central bank market.AddCentralBank(TransactionType.buyOrderDeposit, deposit); // create a new buy order var newBuyOrder = market.CreateBuyOrder(buyer, itemDefinition, duration, pricePerPiece, quantity, useBuyerCorporationWallet, forMembersOf); var data = new Dictionary <string, object> { { k.buyOrder, newBuyOrder.ToDictionary() } }; Message.Builder.SetCommand(Commands.MarketBuyOrderCreated) .WithData(data) .ToCharacter(buyer) .Send(); } publicContainer.Save(); Message.Builder.SetCommand(Commands.ListContainer) .WithData(publicContainer.ToDictionary()) .ToCharacter(buyer) .Send(); scope.Complete(); } }