public void RenameDirectory(string directoryName, string newDirectoryName)
        {
            CreateDirectory(newDirectoryName);
            directoryName    = StorageUtils.NormalizeDirectoryName(directoryName);
            newDirectoryName = StorageUtils.NormalizeDirectoryName(newDirectoryName);

            CloudBlobDirectory directory = PublicContainer.GetDirectoryReference(directoryName);

            foreach (IListBlobItem item in directory.ListBlobsSegmentedAsync(null).GetAwaiter().GetResult().Results)
            {
                string fileName = string.Empty;

                if (item.GetType() == typeof(CloudBlockBlob))
                {
                    CloudBlockBlob blob = (CloudBlockBlob)item;
                    fileName = Path.GetFileName(blob.Name);
                    Copy(blob.Name, GxFileType.Public, newDirectoryName + fileName, GxFileType.Public);
                    Delete(blob.Name, GxFileType.Public);
                }
                else if (item.GetType() == typeof(CloudPageBlob))
                {
                    CloudPageBlob pageBlob = (CloudPageBlob)item;
                    fileName = Path.GetFileName(pageBlob.Name);
                    Copy(directoryName + fileName, GxFileType.Public, newDirectoryName + fileName, GxFileType.Public);
                }
                else if (item.GetType() == typeof(CloudBlobDirectory))
                {
                    CloudBlobDirectory dir = (CloudBlobDirectory)item;
                    RenameDirectory(directoryName + dir.Prefix, newDirectoryName + dir.Prefix);
                }
            }
            DeleteDirectory(directoryName);
        }
        public void DeleteDirectory(string directoryName)
        {
            directoryName = StorageUtils.NormalizeDirectoryName(directoryName);
            CloudBlobDirectory directory = PublicContainer.GetDirectoryReference(directoryName);

            foreach (IListBlobItem item in directory.ListBlobsSegmentedAsync(null).GetAwaiter().GetResult().Results)
            {
                if (item.GetType() == typeof(CloudBlockBlob))
                {
                    CloudBlockBlob blob = (CloudBlockBlob)item;

                    blob.DeleteAsync().GetAwaiter().GetResult();
                }
                else if (item.GetType() == typeof(CloudPageBlob))
                {
                    CloudPageBlob pageBlob = (CloudPageBlob)item;

                    pageBlob.DeleteAsync().GetAwaiter().GetResult();
                }
                else if (item.GetType() == typeof(CloudBlobDirectory))
                {
                    CloudBlobDirectory dir = (CloudBlobDirectory)item;

                    DeleteDirectory(dir.Prefix);
                }
            }
        }
        public bool ExistsDirectory(string directoryName)
        {
            directoryName = StorageUtils.NormalizeDirectoryName(directoryName);
            CloudBlobDirectory directory = PublicContainer.GetDirectoryReference(directoryName);

            return(directory.ListBlobsSegmentedAsync(null).GetAwaiter().GetResult().Results.Any());
        }
        public void CreateDirectory(string directoryName)
        {
            directoryName = StorageUtils.NormalizeDirectoryName(directoryName);
            CloudBlockBlob blob = PublicContainer.GetBlockBlobReference(directoryName);

            blob.UploadFromByteArrayAsync(Array.Empty <byte>(), 0, 0).GetAwaiter().GetResult();
        }
        private CloudBlockBlob GetCloudBlockBlob(string externalFileName, GxFileType fileType)
        {
            CloudBlockBlob blob;

            if (fileType.HasFlag(GxFileType.Private))
            {
                blob = PrivateContainer.GetBlockBlobReference(externalFileName);
            }
            else
            {
                blob = PublicContainer.GetBlockBlobReference(externalFileName);
            }

            return(blob);
        }
        public List <string> GetSubDirectories(string directoryName)
        {
            List <string> directories = new List <string>();

            directoryName = StorageUtils.NormalizeDirectoryName(directoryName);
            CloudBlobDirectory directory = PublicContainer.GetDirectoryReference(directoryName);

            foreach (IListBlobItem item in directory.ListBlobsSegmentedAsync(null).GetAwaiter().GetResult().Results)
            {
                if (item.GetType() == typeof(CloudBlobDirectory))
                {
                    CloudBlobDirectory dir = (CloudBlobDirectory)item;

                    directories.Add(dir.Prefix);
                }
            }
            return(directories);
        }
        public List <string> GetFiles(string directoryName, string filter = "")
        {
            List <string> files = new List <string>();

            directoryName = StorageUtils.NormalizeDirectoryName(directoryName);
            CloudBlobDirectory directory = PublicContainer.GetDirectoryReference(directoryName);

            foreach (IListBlobItem item in directory.ListBlobsSegmentedAsync(null).GetAwaiter().GetResult().Results)
            {
                if (item.GetType() == typeof(CloudBlockBlob))
                {
                    CloudBlockBlob blob = (CloudBlockBlob)item;
                    if (String.IsNullOrEmpty(filter) || blob.Name.Contains(filter))
                    {
                        files.Add(blob.Name);
                    }
                }
            }
            return(files);
        }
Beispiel #8
0
        public void SendDeliveryMessage(PublicContainer container)
        {
            var privateResult = new Dictionary <string, object>
            {
                { k.assignment, ToPrivateDictionary() }
            };

            if (volunteercharacter != Character.None)
            {
                Message.Builder.SetCommand(Commands.TransportAssignmentDelivered).WithData(privateResult).ToCharacter(volunteercharacter).Send();
            }

            var principalResult = new Dictionary <string, object>
            {
                { k.assignment, ToDictionary() },
                { k.container, container.ToDictionary() }
            };

            Message.Builder.SetCommand(Commands.TransportAssignmentDelivered).WithData(principalResult).ToCharacter(ownercharacter).Send();
        }
Beispiel #9
0
        // A sell order was found so the deal is done instantly
        public void FulfillBuyOrderInstantly(Character buyer, bool useBuyerCorporationWallet, MarketOrder marketSellOrder, double pricePerPiece, int duration, int quantity, PublicContainer publicContainer, long?forMembersOf)
        {
            var forCorporation = forMembersOf != null;
            var seller         = Character.GetByEid(marketSellOrder.submitterEID);

            Item itemOnMarket;

            if (!marketSellOrder.isVendorItem)
            {
                //the seller is NOT a vendor
                itemOnMarket = GetItemByMarketOrder(marketSellOrder);

                seller.ThrowIfEqual(null, ErrorCodes.CharacterNotFound);

                if (itemOnMarket.Quantity > quantity)
                {
                    // unstack a fraction
                    var fractionItem = itemOnMarket.Unstack(quantity);
                    fractionItem.Owner = buyer.Eid;

                    // save the remaining item
                    itemOnMarket.Save();

                    // add to public container and change owner
                    publicContainer.AddItem(fractionItem, true);

                    //the remaining amount
                    marketSellOrder.quantity = itemOnMarket.Quantity;

                    // update remaining amount
                    _orderRepository.UpdateQuantity(marketSellOrder);

                    //cash in
                    _marketHelper.CashIn(buyer, useBuyerCorporationWallet, marketSellOrder.price, marketSellOrder.itemDefinition, quantity, TransactionType.marketBuy);

                    //pay out
                    this.PayOutToSeller(seller, marketSellOrder.useCorporationWallet, itemOnMarket.Definition, marketSellOrder.price, quantity, TransactionType.marketSell, marketSellOrder.IsAffectsAverage(), forCorporation);
                }
                else if (itemOnMarket.Quantity == quantity)
                {
                    itemOnMarket.Owner = buyer.Eid;

                    // add to public container and change owner
                    publicContainer.AddItem(itemOnMarket, true);

                    //delete the sell order coz it's done
                    _orderRepository.Delete(marketSellOrder);

                    //cash in
                    _marketHelper.CashIn(buyer, useBuyerCorporationWallet, marketSellOrder.price, marketSellOrder.itemDefinition, quantity, TransactionType.marketBuy);

                    //pay out
                    this.PayOutToSeller(seller, marketSellOrder.useCorporationWallet, itemOnMarket.Definition, marketSellOrder.price, quantity, TransactionType.marketSell, marketSellOrder.IsAffectsAverage(), forCorporation);

                    marketSellOrder.quantity = 0; //signal the sell order delete to the client
                }
                else if (itemOnMarket.Quantity < quantity)
                {
                    //a part of the buy order is fulfilled immediately
                    itemOnMarket.Owner = buyer.Eid;

                    // add to public container and change owner
                    publicContainer.AddItem(itemOnMarket, true);

                    _orderRepository.Delete(marketSellOrder);

                    // create a buy order for the rest of the quantity
                    var newBuyOrder = CreateBuyOrder(buyer, marketSellOrder.itemDefinition, duration, pricePerPiece, quantity - itemOnMarket.Quantity, marketSellOrder.useCorporationWallet, forMembersOf);

                    // cash in for the actual transaction
                    _marketHelper.CashIn(buyer, useBuyerCorporationWallet, marketSellOrder.price, marketSellOrder.itemDefinition, itemOnMarket.Quantity, TransactionType.marketBuy);

                    // cash in for the deposit - for the rest of the quantity
                    _marketHelper.CashIn(buyer, useBuyerCorporationWallet, pricePerPiece, marketSellOrder.itemDefinition, quantity - itemOnMarket.Quantity, TransactionType.buyOrderDeposit);

                    AddCentralBank(TransactionType.buyOrderDeposit, pricePerPiece * (quantity - itemOnMarket.Quantity));

                    //pay out for the current market item
                    this.PayOutToSeller(seller, marketSellOrder.useCorporationWallet, itemOnMarket.Definition, marketSellOrder.price, itemOnMarket.Quantity, TransactionType.marketSell, marketSellOrder.IsAffectsAverage(), forCorporation);

                    marketSellOrder.quantity = 0; //signal to the client

                    //the item he just bought, the sell order update

                    //the new buy order
                    Message.Builder.SetCommand(Commands.MarketBuyOrderCreated)
                    .WithData(new Dictionary <string, object> {
                        { k.buyOrder, newBuyOrder.ToDictionary() }
                    })
                    .ToCharacter(buyer)
                    .Send();
                }

                Market.SendMarketItemBoughtMessage(buyer, itemOnMarket);

                Message.Builder.SetCommand(Commands.MarketSellOrderUpdate)
                .WithData(new Dictionary <string, object> {
                    { k.sellOrder, marketSellOrder.ToDictionary() }
                })
                .ToCharacters(seller, buyer)
                .Send();

                return;
            }

            //check VENDOR sell order's quantity
            if (marketSellOrder.quantity > 0)
            {
                //finite order cases

                var boughtQuantity = quantity;

                if (marketSellOrder.quantity == quantity)
                {
                    _orderRepository.Delete(marketSellOrder);
                    marketSellOrder.quantity = 0; //signal client
                }
                else if (marketSellOrder.quantity > quantity)
                {
                    marketSellOrder.quantity -= quantity; //signal client
                    _orderRepository.UpdateQuantity(marketSellOrder);
                }
                else if (marketSellOrder.quantity < quantity)
                {
                    _orderRepository.Delete(marketSellOrder);
                    boughtQuantity = marketSellOrder.quantity;

                    //create buyorder for the rest of the quantity
                    var buyOrder = CreateBuyOrder(buyer, marketSellOrder.itemDefinition, duration, pricePerPiece, quantity - marketSellOrder.quantity, marketSellOrder.useCorporationWallet, forMembersOf);

                    Message.Builder.SetCommand(Commands.MarketBuyOrderCreated)
                    .WithData(new Dictionary <string, object> {
                        { k.item, buyOrder.ToDictionary() }
                    })
                    .ToCharacter(buyer)
                    .Send();

                    marketSellOrder.quantity = 0; //signal client

                    //cash in deposit
                    _marketHelper.CashIn(buyer, useBuyerCorporationWallet, pricePerPiece, marketSellOrder.itemDefinition, quantity - boughtQuantity, TransactionType.buyOrderDeposit);

                    AddCentralBank(TransactionType.buyOrderDeposit, pricePerPiece * (quantity - boughtQuantity));
                }

                //take the money for the quantity bought
                _marketHelper.CashIn(buyer, useBuyerCorporationWallet, marketSellOrder.price, marketSellOrder.itemDefinition, boughtQuantity, TransactionType.marketBuy);

                Message.Builder.SetCommand(Commands.MarketSellOrderUpdate)
                .WithData(new Dictionary <string, object> {
                    { k.sellOrder, marketSellOrder.ToDictionary() }
                })
                .ToCharacter(buyer)
                .Send();

                // vendor stuff
                itemOnMarket = publicContainer.CreateAndAddItem(marketSellOrder.itemDefinition, false, item =>
                {
                    item.Owner    = buyer.Eid;
                    item.Quantity = boughtQuantity;
                });

                Market.SendMarketItemBoughtMessage(buyer, itemOnMarket);

                //average price
                _marketHandler.InsertAveragePrice(this, marketSellOrder.itemDefinition, boughtQuantity * marketSellOrder.price, boughtQuantity);

                AddCentralBank(TransactionType.marketBuy, boughtQuantity * pricePerPiece); //vendor income
                return;
            }

            //infinite quantity case
            _marketHelper.CashIn(buyer, useBuyerCorporationWallet, marketSellOrder.price, marketSellOrder.itemDefinition, quantity, TransactionType.marketBuy);

            itemOnMarket = publicContainer.CreateAndAddItem(marketSellOrder.itemDefinition, false, item =>
            {
                item.Owner    = buyer.Eid;
                item.Quantity = quantity;
            });

            Market.SendMarketItemBoughtMessage(buyer, itemOnMarket);

            //average price
            _marketHandler.InsertAveragePrice(this, marketSellOrder.itemDefinition, quantity * marketSellOrder.price, quantity);

            AddCentralBank(TransactionType.marketBuy, quantity * pricePerPiece); //vendor income
        }
Beispiel #10
0
        private void GetLocalPublicContainer(Character characterForVolumeWrapper, out VolumeWrapperContainer volumeWrapperContainer, Character characterForPublicContainer, out PublicContainer publicContainer)
        {
            volumeWrapperContainer = (VolumeWrapperContainer)Container.GetWithItems(containereid, characterForVolumeWrapper, ContainerAccess.List);
            var storage = Container.GetOrThrow(volumeWrapperContainer.Parent);

            publicContainer = Container.GetFromStructure(storage.Parent);
            publicContainer.ReloadItems(characterForPublicContainer);
        }
Beispiel #11
0
 public void PrepareProductionForPublicContainer <TFacility>(long facilityEid, Character character, out TFacility facility, out PublicContainer container) where TFacility : ProductionFacility
 {
     GetFacilityAndCheckDocking(facilityEid, character, out facility);
     container = character.GetPublicContainerWithItems();
 }
        public static void SendCommandWithTransportAssignmentsAndContainer(Command command, PublicContainer publicContainer, Character character, Dictionary <string, object> extraInfo = null)
        {
            Transaction.Current.OnCommited(() =>
            {
                var containerInfo  = publicContainer.ToDictionary();
                var transportInfos = GetRunningTransportAssignments(character).ToDictionary(true, character);

                var result = new Dictionary <string, object>
                {
                    { k.container, containerInfo },
                    { k.transportAssignments, transportInfos }
                };

                if (extraInfo != null)
                {
                    result.AddRange(extraInfo);
                }

                result.Add(k.count, GetCountInfo(character));
                Message.Builder.SetCommand(command)
                .WithData(result)
                .ToCharacter(character)
                .Send();
            });
        }
        private static void AdministerDelivery(TransportAssignment transportAssignmentInfo, VolumeWrapperContainer volumeWrapperContainer, PublicContainer container)
        {
            //normal procedure
            //successful delivery

            transportAssignmentInfo.PayOutReward();

            volumeWrapperContainer.ReloadItems(transportAssignmentInfo.volunteercharacter);
            volumeWrapperContainer.PrintDebug();

            container.AddItem(volumeWrapperContainer, transportAssignmentInfo.ownercharacter.Eid, false);

            volumeWrapperContainer.Owner = transportAssignmentInfo.ownercharacter.Eid;
            volumeWrapperContainer.ClearAssignmentId();
            volumeWrapperContainer.Save();

            volumeWrapperContainer.PrintDebug();

            //owner
            transportAssignmentInfo.WriteLog(TransportAssignmentEvent.deliver, container.Parent);
            transportAssignmentInfo.DeleteFromDb();
            transportAssignmentInfo.SendDeliveryMessage(container);
        }
Beispiel #14
0
        public void GiveToVolunteer(out VolumeWrapperContainer volumeWrapperContainer, out PublicContainer publicContainer)
        {
            if (volunteercharacter == Character.None)
            {
                throw new PerpetuumException(ErrorCodes.WTFErrorMedicalAttentionSuggested);
            }

            GetLocalPublicContainer(ownercharacter, out volumeWrapperContainer, volunteercharacter, out publicContainer);

            volumeWrapperContainer.Owner = volunteercharacter.Eid;
            publicContainer.AddItem(volumeWrapperContainer, false);
            volumeWrapperContainer.Save();
        }
Beispiel #15
0
        //storage => base => public container -> owner character
        public void ReturnToLocalPublicContainer(out VolumeWrapperContainer volumeWrapperContainer, out PublicContainer publicContainer)
        {
            GetLocalPublicContainer(ownercharacter, out volumeWrapperContainer, ownercharacter, out publicContainer);

            publicContainer.AddItem(volumeWrapperContainer, false);
            volumeWrapperContainer.Owner = ownercharacter.Eid;
            volumeWrapperContainer.ClearAssignmentId();

            volumeWrapperContainer.Save();
        }
Beispiel #16
0
        public ErrorCodes PrepareResearchKitMerge(
            PublicContainer publicContainer,
            Character character, long target, int quantity,
            out int nextDefinition,
            out int nextLevel,
            out double fullPrice,
            out int availableQuantity,
            out int searchDefinition)
        {
            ErrorCodes ec;

            nextDefinition    = 0;
            nextLevel         = 0;
            fullPrice         = 0;
            availableQuantity = 0;
            searchDefinition  = 0;

            var researchKit = (ResearchKit)publicContainer.GetItem(target, true);

            if (researchKit == null)
            {
                return(ErrorCodes.ItemNotFound);
            }

            var definition = researchKit.Definition;

            searchDefinition = definition;

            EntityDefault ed;

            if (!EntityDefault.TryGet(definition, out ed))
            {
                return(ErrorCodes.DefinitionNotSupported);
            }

            int level = ed.Options.Level;

            if (level == 0)
            {
                Logger.Error("no level was defined for research kit: " + ed.Name + " " + ed.Definition);
                return(ErrorCodes.ConsistencyError);
            }

            if (level == 10)
            {
                return(ErrorCodes.MaximumResearchLevelReached);
            }

            nextLevel = level + 1;

            var sameDefinitions = publicContainer.GetItems().Where(i => i.Definition == definition).Sum(i => i.Quantity);

            if (sameDefinitions % 2 == 1)
            {
                sameDefinitions--;
            }

            var pairs = sameDefinitions / 2;

            if ((ec = ProductionHelper.FindResearchKitDefinitionByLevel(nextLevel, out nextDefinition)) != ErrorCodes.NoError)
            {
                return(ec);
            }

            availableQuantity = Math.Min(pairs, quantity);

            fullPrice = GetReserchKitMergePrice(nextLevel, character) * availableQuantity;

            return(ec);
        }
Beispiel #17
0
        public ErrorCodes DoResearchKitMerge(PublicContainer publicContainer, Character character, int nextDefinition,
                                             int nextLevel, double fullPrice, int availableQuantity, int searchDefinition, out Dictionary <string, object> result, bool useCorporationWallet)
        {
            var ec            = ErrorCodes.NoError;
            var foundQuantity = 0;

            result = new Dictionary <string, object>();
            var amountToLookFor = availableQuantity * 2;

            foreach (var item in publicContainer.GetItems().Where(i => i.Definition == searchDefinition))
            {
                if (item.Quantity <= amountToLookFor - foundQuantity)
                {
                    foundQuantity += item.Quantity;

                    Repository.Delete(item);
                }
                else
                {
                    item.Quantity = item.Quantity - (amountToLookFor - foundQuantity);

                    foundQuantity = amountToLookFor;
                    break;
                }
            }

            if (foundQuantity != amountToLookFor)
            {
                //safe check
                return(ErrorCodes.ItemNotFound);
            }

            publicContainer.CreateAndAddItem(nextDefinition, true, item =>
            {
                item.Owner    = character.Eid;
                item.Quantity = availableQuantity;
            });

            var wallet = character.GetWalletWithAccessCheck(useCorporationWallet, TransactionType.ResearchKitMerge, CorporationRole.ProductionManager);

            wallet.Balance -= fullPrice;

            var b = TransactionLogEvent.Builder()
                    .SetTransactionType(TransactionType.ResearchKitMerge)
                    .SetCreditBalance(wallet.Balance)
                    .SetCreditChange(-fullPrice)
                    .SetCharacter(character);

            var corpWallet = wallet as CorporationWallet;

            if (corpWallet != null)
            {
                b.SetCorporation(corpWallet.Corporation);
                corpWallet.Corporation.LogTransaction(b);
            }
            else
            {
                character.LogTransaction(b);
            }

            result = new Dictionary <string, object> {
                { k.container, publicContainer.ToDictionary() }
            };
            return(ec);
        }
 protected override void ConfigureContainer()
 {
     base.ConfigureContainer();
     PublicContainer = Container;
     PublicContainer.ComposeParts(this);
 }