public void HandleRequest(IRequest request)
        {
            using (var scope = Db.CreateTransaction())
            {
                var baseEID   = request.Data.GetOrDefault <long>(k.baseEID);
                var character = request.Session.Character;

                character.IsDocked.ThrowIfFalse(ErrorCodes.CharacterHasToBeDocked);

                var dockingBase = character.GetCurrentDockingBase();
                if (dockingBase.Eid != baseEID)
                {
                    throw new PerpetuumException(ErrorCodes.FacilityOutOfReach);
                }

                var corporation = character.GetPrivateCorporationOrThrow();

                var role = corporation.GetMemberRole(character);
                role.IsAnyRole(CorporationRole.CEO, CorporationRole.HangarOperator, CorporationRole.DeputyCEO).ThrowIfFalse(ErrorCodes.InsufficientPrivileges);

                if (!role.IsAnyRole(CorporationRole.CEO))
                {
                    _corporationManager.IsInJoinOrLeave(character).ThrowIfError();
                }

                var mainHangar = dockingBase.GetPublicCorporationHangarStorage();

                var rentInfo = mainHangar.GetCorporationHangarRentInfo();

                var wallet = new CorporationWallet(corporation);
                wallet.Balance -= rentInfo.price;

                var b = TransactionLogEvent.Builder()
                        .SetCorporation(corporation)
                        .SetTransactionType(TransactionType.hangarRent)
                        .SetCreditBalance(wallet.Balance)
                        .SetCreditChange(-rentInfo.price);

                corporation.LogTransaction(b);

                var corporateHangar = CorporateHangar.Create();
                corporateHangar.Owner = corporation.Eid;
                mainHangar.AddChild(corporateHangar);

                //set lease start time
                corporateHangar.LeaseStart     = DateTime.Now;
                corporateHangar.LeaseEnd       = DateTime.Now + rentInfo.period;
                corporateHangar.IsLeaseExpired = false;
                corporateHangar.SetLogging(true, character); //set logging on by default

                mainHangar.Save();

                dockingBase.AddCentralBank(TransactionType.hangarRent, rentInfo.price);
                Message.Builder.FromRequest(request).WithData(corporateHangar.ToDictionary()).Send();

                scope.Complete();
            }
        }
        public void Visit(CorporateHangar hangar)
        {
            Visit((Container)hangar);

            if (_error != ErrorCodes.NoError)
            {
                return;
            }

            if (hangar.IsLeaseExpired && _access != ContainerAccess.LogList)
            {
                _error = ErrorCodes.CorporationHangarLeaseExpired;
                return;
            }

            if (!(_access == ContainerAccess.LogList || _access == ContainerAccess.LogClear || _access == ContainerAccess.LogStart ||
                  _access == ContainerAccess.List || _access == ContainerAccess.LogStop))
            {
                _error = CheckDockedState(hangar);
                if (_error != ErrorCodes.NoError)
                {
                    return;
                }
            }

            //is the owner of this container is the corporation the character is a member of?
            var corpEid = _character.CorporationEid;

            if (DefaultCorporationDataCache.IsCorporationDefault(corpEid))
            {
                _error = ErrorCodes.CharacterMustBeInPrivateCorporation;
                return;
            }

            if (!Corporation.Exists(corpEid))
            {
                Logger.Error("a character found with a non-existing corporationEID. characterID:" + _character + " corpEID:" + corpEid);
                _error = ErrorCodes.InsufficientPrivileges; //no such corporation
                return;
            }

            if (hangar.Owner != corpEid)
            {
                _error = ErrorCodes.InsufficientPrivileges;
                return;
            }

            //if his corporation owns this container
            //check role
            var memberRole = Corporation.GetRoleFromSql(_character);

            if (!hangar.HasAccess(memberRole, _access))
            {
                _error = ErrorCodes.InsufficientPrivileges;
            }
        }
Exemple #3
0
        public void HandleRequest(IRequest request)
        {
            using (var scope = Db.CreateTransaction())
            {
                var character          = request.Session.Character;
                var itemEids           = request.Data.GetOrDefault <long[]>(k.eid);
                var sourceContainerEid = request.Data.GetOrDefault <long>(k.sourceContainer);
                var targetContainerEid = request.Data.GetOrDefault <long>(k.targetContainer);

                if (sourceContainerEid == targetContainerEid)
                {
                    return;
                }

                Container.GetContainersWithItems(character, sourceContainerEid, targetContainerEid, out Container sourceContainer, out Container targetContainer);

                if (targetContainer is RobotInventory)
                {
                    CorporateHangar.Contains(targetContainer).ThrowIfTrue(ErrorCodes.AccessDenied);
                }

                sourceContainer.RelocateItems(character, character, itemEids, targetContainer);
                sourceContainer.Save();
                targetContainer.Save();

                var targetList = targetContainer.ToDictionary();

                try
                {
                    targetContainer.CheckAccessAndThrowIfFailed(character, ContainerAccess.List);
                }
                catch (PerpetuumException gex)
                {
                    if (gex.error == ErrorCodes.InsufficientPrivileges)
                    {
                        targetList[k.items] = new Dictionary <string, object>();
                    }
                    else
                    {
                        throw;
                    }
                }

                var result = new Dictionary <string, object>
                {
                    { k.source, sourceContainer.ToDictionary() },
                    { k.target, targetList }
                };

                Message.Builder.FromRequest(request).WithData(result).Send();

                scope.Complete();
            }
        }
        public void HandleRequest(IRequest request)
        {
            using (var scope = Db.CreateTransaction())
            {
                var character          = request.Session.Character;
                var itemEid            = request.Data.GetOrDefault <long>(k.eid);
                var amount             = request.Data.GetOrDefault <int>(k.amount);
                var size               = request.Data.GetOrDefault <int>(k.size);
                var sourceContainerEid = request.Data.GetOrDefault <long>(k.container);
                var targetContainerEid = request.Data.GetOrDefault <long>(k.targetContainer);

                size.ThrowIfLessOrEqual(0, ErrorCodes.WTFErrorMedicalAttentionSuggested);
                amount.ThrowIfLessOrEqual(0, ErrorCodes.WTFErrorMedicalAttentionSuggested);

                Db.Query().CommandText("select eid from entities (UPDLOCK) where eid = @eid").SetParameter("@eid", itemEid).ExecuteNonQuery();

                //load the container
                Container.GetContainersWithItems(character, sourceContainerEid, targetContainerEid, out Container sourceContainer, out Container targetContainer);

                if (targetContainer is RobotInventory)
                {
                    CorporateHangar.Contains(targetContainer).ThrowIfTrue(ErrorCodes.AccessDenied);
                }

                var result = new Dictionary <string, object>();

                if (sourceContainerEid == targetContainerEid)
                {
                    sourceContainer.UnstackItem(itemEid, character, amount, size, sourceContainer);
                }
                else
                {
                    sourceContainer.UnstackItem(itemEid, character, amount, size, targetContainer);

                    targetContainer.Save();

                    var targetList = targetContainer.ToDictionary();

                    try
                    {
                        targetContainer.CheckAccessAndThrowIfFailed(character, ContainerAccess.List);
                    }
                    catch (PerpetuumException gex)
                    {
                        if (gex.error == ErrorCodes.InsufficientPrivileges)
                        {
                            targetList[k.items] = new Dictionary <string, object>();
                        }
                        else
                        {
                            throw;
                        }
                    }

                    result.Add(k.target, targetList);
                }

                sourceContainer.Save();

                result.Add(k.source, sourceContainer.ToDictionary());
                Message.Builder.FromRequest(request).WithData(result).Send();

                scope.Complete();
            }
        }