Make PluginManager not static object

This commit is contained in:
Him188
2021-12-25 13:23:41 +00:00
parent 662fbf8d1e
commit ea0bf38203
6 changed files with 33 additions and 19 deletions

View File

@@ -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

View File

@@ -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<Plugin> get() = PluginManagerImpl.resolvedPlugins
override val resolvedPlugins: MutableList<Plugin> get() = MiraiConsole.pluginManagerImpl.resolvedPlugins
}
@Volatile

View File

@@ -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("<none>")
} else {
PluginManagerImpl.resolvedPlugins.joinTo(this) { plugin ->
MiraiConsole.pluginManagerImpl.resolvedPlugins.joinTo(this) { plugin ->
green().append(plugin.name).reset().append(" v").gold()
plugin.version.toString()
}

View File

@@ -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") {

View File

@@ -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()

View File

@@ -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]
*/