Hook

Hook 是可修改执行链的高级能力。内置 Hook 包括 ReceiveMessageHookSendMessageHookMessagePluginExecutionHookEventPluginExecutionHookTaskPluginExecutionHookHelpEventHook

五种类型

API时机是否需要 process()
beforeHook目标前普通实现会自动继续
afterReturningHook正常完成后
afterThrowingHook抛错时否,异常会继续抛出
afterFinallyHook无论结果
aroundHook包裹目标必须手动调用,否则目标不执行
private val timing = aroundHook<MessagePluginExecutionHook> { hook ->
    val start = System.currentTimeMillis()
    try { process() }
    finally { log().info("{}ms: {}", System.currentTimeMillis() - start, hook.register.plugin.name) }
}

terminate() 停止后续 Hook 和目标;botApi() 返回当前位置正确的 API;pluginInfo() 返回目标插件信息。Hook 的 order 升序执行,可用 HookPluginRegisterMatchPluginInfo 过滤。

修改发送消息

private val footer = sendMessageHook { messages ->
    messages + SendMessage.builder("\n— 小花落").build().messageList
}

等待下一条回复

val answer = withTimeoutOrNull(30.seconds) {
    awaitReply(MessageMatch(regex = Regex("确认|取消"))) { args ->
        receiveMessage.content.message
    }
} ?: "超时"

awaitReply 用运行时 ReceiveMessageHook 实现,会在第一次匹配后自动注销。应始终设置超时,并用更严格的 sendIdsourceType 或自定义条件限制会话,避免接走别人的消息。

Hook 内要使用 this.botApi(),不要捕获注册 Hook 时的外部 BotApi。Around Hook 漏掉 process() 会静默阻断整个功能。