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

                character.IsDocked.ThrowIfFalse(ErrorCodes.CharacterHasToBeDocked);
                character.CheckNextAvailableUndockTimeAndThrowIfFailed();
                CheckExtensionLevelAndThrowIfFailed(character);

                var sparkTeleport      = _sparkTeleportHelper.Get(id);
                var currentDockingBase = character.GetCurrentDockingBase();

                character.SubtractFromWallet(TransactionType.SparkTeleportUse, SparkTeleport.SPARK_TELEPORT_USE_FEE);

                if (sparkTeleport.DockingBase == currentDockingBase)
                {
                    throw new PerpetuumException(ErrorCodes.YouAreHereAlready);
                }

                sparkTeleport.DockingBase.IsDockingAllowed(character).ThrowIfError();
                sparkTeleport.DockingBase.DockIn(character, Player.NormalUndockDelay);

                var robot = sparkTeleport.DockingBase.GetPublicContainerWithItems(character)
                            .GetFullTree()
                            .OfType <Robot>()
                            .FirstOrDefault(r => !r.IsRepackaged && ItemExtensions.HaveAllEnablerExtensions(r, character));

                character.SetActiveRobot(robot);

                Transaction.Current.OnCommited(() =>
                {
                    currentDockingBase.LeaveChannel(character);

                    Message.Builder.FromRequest(request)
                    .WithData(sparkTeleport.ToDictionary())
                    .Send();
                });

                scope.Complete();
            }
        }