public void HandleRequest(IRequest request) { using (var scope = Db.CreateTransaction()) { var character = request.Session.Character; var lockBase = request.Data.GetOrDefault <int>(k.locked) == 1; double?standingLimit = request.Data.GetOrDefault <double>(k.standing); var baseEid = request.Data.GetOrDefault <long>(k.baseEID); var eventType = IntrusionEvents.dockingRightsSet; if (!lockBase) { standingLimit = null; //opening the outpost for everyone eventType = IntrusionEvents.dockingRightsClear; } if (!(_dockingBaseHelper.GetDockingBase(baseEid) is Outpost outpost)) { throw new PerpetuumException(ErrorCodes.OperationAllowedOnlyOnIntrusionSites); } var siteInfo = outpost.GetIntrusionSiteInfo(); if (siteInfo.DockingStandingLimit == standingLimit) { //nothing to do => exit Message.Builder.FromRequest(request).WithData(new Dictionary <string, object> { { k.baseEID, outpost.Eid } }).Send(); return; } var owner = siteInfo.Owner.ThrowIfNull(ErrorCodes.AccessDenied); var corporationEid = character.CorporationEid; //only owner corp controls the docking rights corporationEid.ThrowIfNotEqual((long)owner, ErrorCodes.AccessDenied); DefaultCorporationDataCache.IsCorporationDefault(corporationEid).ThrowIfTrue(ErrorCodes.CharacterMustBeInPrivateCorporation); var role = Corporation.GetRoleFromSql(character); role.IsAnyRole(CorporationRole.CEO, CorporationRole.DeputyCEO, CorporationRole.Accountant).ThrowIfFalse(ErrorCodes.InsufficientPrivileges); var stabilityLimit = Outpost.GetDockingRightsStabilityLimit(); siteInfo.Stability.ThrowIfLess(stabilityLimit, ErrorCodes.StabilityTooLow); var dockingControlLimit = siteInfo.DockingControlLimit; if (dockingControlLimit != null) { DateTime.Now.ThrowIfLess((DateTime)dockingControlLimit, ErrorCodes.DockingRightsChangeCooldownInProgress); } outpost.SetDockingControlDetails(standingLimit, !lockBase); outpost.InsertDockingRightsLog(character, standingLimit, corporationEid, eventType); Transaction.Current.OnCommited(() => outpost.SendSiteInfoToOnlineCharacters()); Message.Builder.FromRequest(request).WithData(new Dictionary <string, object> { { k.baseEID, baseEid } }).Send(); scope.Complete(); } }