All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.blr19c.falowp.bot.system.plugin.hook.HookProcess.kt Maven / Gradle / Ivy

There is a newer version: 2.0.0-RC2
Show newest version
package com.blr19c.falowp.bot.system.plugin.hook

import com.blr19c.falowp.bot.system.plugin.HookPluginRegister
import com.blr19c.falowp.bot.system.plugin.Plugin

/**
 * hook处理程序
 */
interface HookProcess {

    /**
     * 链式处理
     */
    suspend fun process(hookJoinPoint: HookJoinPoint, hook: Plugin.Listener.Hook)

    /**
     * 获取botApi
     */
    fun botApi(): HookBotApi
}

/**
 * 普通的
 */
open class NormalHookProcess(
    private val hookPluginRegister: HookPluginRegister,
    private val hookBotApi: HookBotApi
) : HookProcess {

    override suspend fun process(hookJoinPoint: HookJoinPoint, hook: Plugin.Listener.Hook) {
        hookPluginRegister.hook(hookJoinPoint, hook)
        hookJoinPoint.process()
    }

    override fun botApi(): HookBotApi {
        return hookBotApi
    }
}

/**
 * Around环绕的
 */
class AroundHookProcess(
    private val hookPluginRegister: HookPluginRegister,
    private val hookBotApi: HookBotApi
) : HookProcess {

    override suspend fun process(hookJoinPoint: HookJoinPoint, hook: Plugin.Listener.Hook) {
        hookPluginRegister.hook(hookJoinPoint, hook)
    }

    override fun botApi(): HookBotApi {
        return hookBotApi
    }
}

/**
 * Throwing异常的
 */
class ThrowingHookProcess(
    private val hookPluginRegister: HookPluginRegister,
    private val hookBotApi: HookBotApi
) : HookProcess {

    override suspend fun process(hookJoinPoint: HookJoinPoint, hook: Plugin.Listener.Hook) {
        try {
            hookJoinPoint.process()
        } catch (ex: Throwable) {
            hookPluginRegister.hook(hookJoinPoint, hook)
            throw ex
        }
    }

    override fun botApi(): HookBotApi {
        return hookBotApi
    }
}

/**
 * Finally最终的
 */
class FinallyHookProcess(
    private val hookPluginRegister: HookPluginRegister,
    private val hookBotApi: HookBotApi
) : HookProcess {

    override suspend fun process(hookJoinPoint: HookJoinPoint, hook: Plugin.Listener.Hook) {
        try {
            hookJoinPoint.process()
        } finally {
            hookPluginRegister.hook(hookJoinPoint, hook)
        }
    }

    override fun botApi(): HookBotApi {
        return hookBotApi
    }
}

/**
 * 目标对象的
 */
class TargetHookProcess(
    private val block: suspend () -> Unit
) : HookProcess {

    override suspend fun process(hookJoinPoint: HookJoinPoint, hook: Plugin.Listener.Hook) {
        block.invoke()
        hookJoinPoint.process()
    }

    override fun botApi(): HookBotApi {
        throw IllegalStateException("TargetHookProcess不应该使用process中的botApi")
    }

}





© 2015 - 2024 Weber Informatics LLC | Privacy Policy