diff --git a/mirai-console/backend/mirai-console/src/MiraiConsole.kt b/mirai-console/backend/mirai-console/src/MiraiConsole.kt index 98e9ef02d..724b3958b 100644 --- a/mirai-console/backend/mirai-console/src/MiraiConsole.kt +++ b/mirai-console/backend/mirai-console/src/MiraiConsole.kt @@ -28,10 +28,10 @@ import net.mamoe.mirai.console.plugin.loader.PluginLoader import net.mamoe.mirai.console.util.AnsiMessageBuilder import net.mamoe.mirai.console.util.ConsoleExperimentalApi import net.mamoe.mirai.console.util.ConsoleInternalApi -import net.mamoe.mirai.utils.childScopeContext import net.mamoe.mirai.console.util.SemVersion import net.mamoe.mirai.utils.BotConfiguration import net.mamoe.mirai.utils.MiraiLogger +import net.mamoe.mirai.utils.childScopeContext import net.mamoe.mirai.utils.verbose import java.io.File import java.nio.file.Path @@ -83,6 +83,12 @@ public interface MiraiConsole : CoroutineScope { */ public val version: SemVersion + /** + * [PluginManager] 实例. 在 [MiraiConsole] 生命周期内应保持不变. + * + * @since 2.10 + */ + public val pluginManager: PluginManager @ConsoleExperimentalApi public val pluginCenter: PluginCenter diff --git a/mirai-console/backend/mirai-console/src/MiraiConsoleImplementation.kt b/mirai-console/backend/mirai-console/src/MiraiConsoleImplementation.kt index 726d30064..a808eef45 100644 --- a/mirai-console/backend/mirai-console/src/MiraiConsoleImplementation.kt +++ b/mirai-console/backend/mirai-console/src/MiraiConsoleImplementation.kt @@ -21,7 +21,7 @@ import net.mamoe.mirai.console.extension.ComponentStorage import net.mamoe.mirai.console.internal.MiraiConsoleImplementationBridge import net.mamoe.mirai.console.internal.extension.GlobalComponentStorage import net.mamoe.mirai.console.internal.logging.LoggerControllerImpl -import net.mamoe.mirai.console.internal.plugin.PluginManagerImpl +import net.mamoe.mirai.console.internal.pluginManagerImpl import net.mamoe.mirai.console.logging.LoggerController import net.mamoe.mirai.console.plugin.Plugin import net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader @@ -243,7 +243,7 @@ public interface MiraiConsoleImplementation : CoroutineScope { public companion object { private val backendAccessInstance = object : BackendAccess { override val globalComponentStorage: ComponentStorage get() = GlobalComponentStorage - override val resolvedPlugins: MutableList get() = PluginManagerImpl.resolvedPlugins + override val resolvedPlugins: MutableList get() = MiraiConsole.pluginManagerImpl.resolvedPlugins } @Volatile diff --git a/mirai-console/backend/mirai-console/src/command/BuiltInCommands.kt b/mirai-console/backend/mirai-console/src/command/BuiltInCommands.kt index 3e7a5e7a4..9e074c859 100644 --- a/mirai-console/backend/mirai-console/src/command/BuiltInCommands.kt +++ b/mirai-console/backend/mirai-console/src/command/BuiltInCommands.kt @@ -30,7 +30,7 @@ import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.* import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.PasswordKind.MD5 import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.PasswordKind.PLAIN import net.mamoe.mirai.console.internal.permission.BuiltInPermissionService -import net.mamoe.mirai.console.internal.plugin.PluginManagerImpl +import net.mamoe.mirai.console.internal.pluginManagerImpl import net.mamoe.mirai.console.internal.util.autoHexToBytes import net.mamoe.mirai.console.internal.util.runIgnoreException import net.mamoe.mirai.console.permission.Permission @@ -49,7 +49,6 @@ import net.mamoe.mirai.event.events.EventCancelledException import net.mamoe.mirai.message.nextMessageOrNull import net.mamoe.mirai.utils.BotConfiguration import net.mamoe.mirai.utils.MiraiLogger -import net.mamoe.mirai.utils.readString import net.mamoe.mirai.utils.secondsToMillis import java.lang.management.ManagementFactory import java.lang.management.MemoryUsage @@ -181,7 +180,7 @@ public object BuiltInCommands { @Handler public suspend fun CommandSender.handle( @Name("qq") id: Long - ){ + ) { if (Bot.getInstanceOrNull(id)?.close() == null) { sendMessage("$id 未登录") } else { @@ -505,10 +504,10 @@ public object BuiltInCommands { reset().append("\n\n") append("Plugins: ") - if (PluginManagerImpl.resolvedPlugins.isEmpty()) { + if (MiraiConsole.pluginManagerImpl.resolvedPlugins.isEmpty()) { gray().append("") } else { - PluginManagerImpl.resolvedPlugins.joinTo(this) { plugin -> + MiraiConsole.pluginManagerImpl.resolvedPlugins.joinTo(this) { plugin -> green().append(plugin.name).reset().append(" v").gold() plugin.version.toString() } diff --git a/mirai-console/backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt b/mirai-console/backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt index 010167757..dd62ee3e5 100644 --- a/mirai-console/backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt +++ b/mirai-console/backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt @@ -53,6 +53,7 @@ import net.mamoe.mirai.console.plugin.name import net.mamoe.mirai.console.util.ConsoleExperimentalApi import net.mamoe.mirai.console.util.ConsoleInput import net.mamoe.mirai.console.util.SemVersion +import net.mamoe.mirai.console.util.cast import net.mamoe.mirai.utils.* import java.nio.file.Path import java.time.Instant @@ -64,6 +65,8 @@ import kotlin.coroutines.CoroutineContext import kotlin.reflect.KProperty import kotlin.reflect.KProperty0 +internal val MiraiConsole.pluginManagerImpl: PluginManagerImpl get() = this.pluginManager.cast() + /** * [MiraiConsole] 公开 API 与前端实现的连接桥. */ @@ -79,6 +82,7 @@ internal object MiraiConsoleImplementationBridge : CoroutineScope, MiraiConsoleI override val buildDate: Instant by MiraiConsoleBuildConstants::buildDate override val version: SemVersion by MiraiConsoleBuildConstants::version + override val pluginManager: PluginManagerImpl by lazy { PluginManagerImpl(coroutineContext) } override val rootPath: Path by instance::rootPath override val frontEndDescription: MiraiConsoleFrontEndDescription by instance::frontEndDescription @@ -163,11 +167,11 @@ internal object MiraiConsoleImplementationBridge : CoroutineScope, MiraiConsoleI } phase("initialize all plugins") { - PluginManager // init + pluginManager // init mainLogger.verbose { "Loading JVM plugins..." } - PluginManagerImpl.loadAllPluginsUsingBuiltInLoaders() - PluginManagerImpl.initExternalPluginLoaders().let { count -> + pluginManager.loadAllPluginsUsingBuiltInLoaders() + pluginManager.initExternalPluginLoaders().let { count -> mainLogger.verbose { "$count external PluginLoader(s) found. " } if (count != 0) { mainLogger.verbose { "Loading external plugins..." } @@ -176,7 +180,7 @@ internal object MiraiConsoleImplementationBridge : CoroutineScope, MiraiConsoleI } phase("load all plugins") { - PluginManagerImpl.loadPlugins(PluginManagerImpl.scanPluginsUsingPluginLoadersIncludingThoseFromPluginLoaderProvider()) + pluginManager.loadPlugins(pluginManager.scanPluginsUsingPluginLoadersIncludingThoseFromPluginLoaderProvider()) mainLogger.verbose { "${PluginManager.plugins.size} plugin(s) loaded." } } @@ -217,13 +221,13 @@ internal object MiraiConsoleImplementationBridge : CoroutineScope, MiraiConsoleI phase("enable plugins") { mainLogger.verbose { "Enabling plugins..." } - PluginManagerImpl.enableAllLoadedPlugins() + pluginManager.enableAllLoadedPlugins() for (registeredCommand in CommandManager.allRegisteredCommands) { registeredCommand.permission // init } - mainLogger.info { "${PluginManagerImpl.plugins.size} plugin(s) enabled." } + mainLogger.info { "${pluginManager.plugins.size} plugin(s) enabled." } } phase("auto-login bots") { diff --git a/mirai-console/backend/mirai-console/src/internal/plugin/PluginManagerImpl.kt b/mirai-console/backend/mirai-console/src/internal/plugin/PluginManagerImpl.kt index 442de6489..182ca304d 100644 --- a/mirai-console/backend/mirai-console/src/internal/plugin/PluginManagerImpl.kt +++ b/mirai-console/backend/mirai-console/src/internal/plugin/PluginManagerImpl.kt @@ -15,7 +15,6 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import net.mamoe.mirai.console.MiraiConsole import net.mamoe.mirai.console.extensions.PluginLoaderProvider -import net.mamoe.mirai.console.internal.data.cast import net.mamoe.mirai.console.internal.data.mkdir import net.mamoe.mirai.console.internal.extension.GlobalComponentStorage import net.mamoe.mirai.console.plugin.Plugin @@ -28,13 +27,19 @@ import net.mamoe.mirai.console.plugin.loader.PluginLoadException import net.mamoe.mirai.console.plugin.loader.PluginLoader import net.mamoe.mirai.console.plugin.name import net.mamoe.mirai.console.util.SemVersion +import net.mamoe.mirai.utils.cast import net.mamoe.mirai.utils.childScope import net.mamoe.mirai.utils.info import java.io.File import java.nio.file.Path import java.util.concurrent.CopyOnWriteArrayList +import kotlin.coroutines.CoroutineContext -internal object PluginManagerImpl : PluginManager, CoroutineScope by MiraiConsole.childScope("PluginManager") { +internal val PluginManager.impl: PluginManagerImpl get() = this.cast() + +internal class PluginManagerImpl( + private val parentCoroutineContext: CoroutineContext +) : PluginManager, CoroutineScope by parentCoroutineContext.childScope("PluginManager") { override val pluginsPath: Path = MiraiConsole.rootPath.resolve("plugins").apply { mkdir() } override val pluginsFolder: File = pluginsPath.toFile() @@ -130,7 +135,7 @@ internal object PluginManagerImpl : PluginManager, CoroutineScope by MiraiConsol builtInLoaders.listAndSortAllPlugins() .asSequence() .onEach { (_, descriptions) -> - descriptions.let(PluginManagerImpl::checkPluginDescription) + descriptions.let(::checkPluginDescription) } return allDescriptions.toList().sortByDependencies() diff --git a/mirai-console/backend/mirai-console/src/plugin/PluginManager.kt b/mirai-console/backend/mirai-console/src/plugin/PluginManager.kt index dbaf4fa3d..8444de84c 100644 --- a/mirai-console/backend/mirai-console/src/plugin/PluginManager.kt +++ b/mirai-console/backend/mirai-console/src/plugin/PluginManager.kt @@ -11,8 +11,8 @@ package net.mamoe.mirai.console.plugin +import me.him188.kotlin.dynamic.delegation.dynamicDelegation import net.mamoe.mirai.console.MiraiConsole -import net.mamoe.mirai.console.internal.plugin.PluginManagerImpl import net.mamoe.mirai.console.plugin.description.PluginDescription import net.mamoe.mirai.console.plugin.loader.PluginLoader import java.io.File @@ -130,7 +130,7 @@ public interface PluginManager { // endregion - public companion object INSTANCE : PluginManager by PluginManagerImpl { + public companion object INSTANCE : PluginManager by (dynamicDelegation(MiraiConsole::pluginManager)) { /** * 经过泛型类型转换的 [Plugin.loader] */