Hooks can be used to intercept any phase of each request processing. This mechanism allows you to log, modify or completely interrupt a request.
How to use
You can handle different hooks right in the scenario:
val HelloWorldScenario = Scenario {
    handle<BotRequestHook> {
        // This handler will be invoked right after a new request was received
    }
    handle<BeforeProcessHook> { 
        // This handler will be invoked right before each request processing
    }
    handle<BeforeActionHook> { 
        // This handler be invoked right before each action block execution
    }
    handle<AfterActionHook> { 
        // This handler will be invoked right after each action block execution
    }
    handle<AfterProcessHook> {
        // This handler will be invoked once a request processing is complete
    }
    handle<ActionErrorHook> { 
        // This handler will be invoked if action block crashed with an exception
    }
}
You can also add handlers outside of scenario using BotEngine instance:
val helloWorldBot = BotEngine(
    scenario = HelloWorldScenario,
    activators = arrayOf(
        AlexaActivator,
        dialogflowActivator,
        RegexActivator,
        BaseEventActivator,
        CatchAllActivator
    )
).apply { 
    hooks.addHookAction<BotRequestHook> { 
        ...
    }
}
Request interruption
Your handler can completely interrupt a request processing. Just throw a BotHookException this way:
Scenario {
    handle<BotRequestHook> {
        throw BotHookException("I'm on vacation and won't process any request!")
    }
}