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!")
    }
}