LTD-ManaagerBot/src/main/kotlin/top/r3944realms/ltdmanager/module/BaseModule.kt

89 lines
2.2 KiB
Kotlin

package top.r3944realms.ltdmanager.module
import kotlinx.coroutines.CompletableDeferred
import top.r3944realms.ltdmanager.GlobalManager
import top.r3944realms.ltdmanager.utils.LoggerUtil
import kotlin.coroutines.cancellation.CancellationException
/**
* 模块抽象基类
* 所有功能模块都继承该类
*/
abstract class BaseModule {
/**
* 模块名称
*/
abstract val name: String
/**
* 停止信号
*/
private val stopSignal = CompletableDeferred<Unit>()
/**
* 模块是否加载
*/
@Volatile
var loaded: Boolean = false
private set
/**
* 模块加载
* 可以在这里初始化协程、监听器、定时任务等
*/
open fun load() {
if (!loaded) {
loaded = true
onLoad()
LoggerUtil.logger.info("模块加载: $name")
}
}
/**
* 模块卸载
* 清理资源,取消协程、关闭监听器等
*/
open suspend fun unload() {
if (loaded) {
loaded = false
onUnload()
stopSignal.complete(Unit)
LoggerUtil.logger.info("模块卸载: $name")
}
}
/**
* 模块加载时的实际逻辑,由子类实现
*/
protected abstract fun onLoad()
/**
* 模块卸载时的实际逻辑,由子类实现
*/
protected abstract suspend fun onUnload()
/**
* 可选的停止方法,模块内部协程等后台任务在这里被取消
*/
open suspend fun stop() {
if (!loaded) return
LoggerUtil.syncInfo("[$name] 收到停止命令")
unload() // 默认实现直接卸载
try {
stopSignal.await()
} catch (_: CancellationException) {}
LoggerUtil.syncInfo("[$name] 模块已安全停止")
}
/**
* 提供访问全局 NapCatClient 的快捷方式
*/
protected val napCatClient get() = GlobalManager.napCatClient
/**
* 提供访问全局 blessingSkinClient 的快捷方式
*/
protected val blessingSkinClient get() = GlobalManager.blessingSkinClient
/**
* 获取数据库连接
* 使用 try-with-resources 时会自动关闭
*/
protected fun getConnection() = GlobalManager.getConnection()
}