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; } }
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(); } }