Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rewrite component storage #1889

Merged
merged 6 commits into from
Feb 24, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1134,12 +1134,6 @@ public final class net/mamoe/mirai/console/command/parse/CommandValueArgumentKt
public static final fun mapValue (Lnet/mamoe/mirai/console/command/parse/CommandValueArgument;Lnet/mamoe/mirai/console/command/descriptor/TypeVariant;)Ljava/lang/Object;
}

public final class net/mamoe/mirai/console/command/parse/SpaceSeparatedCommandCallParser$Provider : net/mamoe/mirai/console/extensions/CommandCallParserProvider {
public static final field INSTANCE Lnet/mamoe/mirai/console/command/parse/SpaceSeparatedCommandCallParser$Provider;
public synthetic fun getInstance ()Ljava/lang/Object;
public fun getInstance ()Lnet/mamoe/mirai/console/command/parse/CommandCallParser;
}

public abstract interface class net/mamoe/mirai/console/command/resolve/CommandCallInterceptor {
public static final field Companion Lnet/mamoe/mirai/console/command/resolve/CommandCallInterceptor$Companion;
public fun interceptBeforeCall (Lnet/mamoe/mirai/message/data/Message;Lnet/mamoe/mirai/console/command/CommandSender;)Lnet/mamoe/mirai/console/command/resolve/InterceptResult;
Expand Down Expand Up @@ -1431,7 +1425,6 @@ public abstract class net/mamoe/mirai/console/extension/AbstractExtensionPoint :
}

public abstract class net/mamoe/mirai/console/extension/AbstractInstanceExtensionPoint : net/mamoe/mirai/console/extension/AbstractExtensionPoint {
public final fun getBuiltinImplementations ()[Lkotlin/jvm/functions/Function0;
}

public abstract class net/mamoe/mirai/console/extension/AbstractSingletonExtensionPoint : net/mamoe/mirai/console/extension/AbstractExtensionPoint, net/mamoe/mirai/console/extension/SingletonExtensionPoint {
Expand All @@ -1442,9 +1435,12 @@ public abstract class net/mamoe/mirai/console/extension/AbstractSingletonExtensi
public abstract interface class net/mamoe/mirai/console/extension/ComponentStorage {
public abstract fun contribute (Lnet/mamoe/mirai/console/extension/ExtensionPoint;Lnet/mamoe/mirai/console/plugin/Plugin;Lkotlin/jvm/functions/Function0;)V
public abstract fun contribute (Lnet/mamoe/mirai/console/extension/ExtensionPoint;Lnet/mamoe/mirai/console/plugin/Plugin;Lnet/mamoe/mirai/console/extension/Extension;)V
public abstract fun getExtensions (Lnet/mamoe/mirai/console/extension/ExtensionPoint;)Lkotlin/sequences/Sequence;
public abstract fun getExtensionsStream (Lnet/mamoe/mirai/console/extension/ExtensionPoint;)Ljava/util/stream/Stream;
}

public abstract interface class net/mamoe/mirai/console/extension/Extension {
public fun getPriority ()I
}

public class net/mamoe/mirai/console/extension/ExtensionException : java/lang/RuntimeException {
Expand All @@ -1458,6 +1454,11 @@ public abstract interface class net/mamoe/mirai/console/extension/ExtensionPoint
public abstract fun getExtensionType ()Lkotlin/reflect/KClass;
}

public abstract interface class net/mamoe/mirai/console/extension/ExtensionRegistry {
public abstract fun getExtension ()Lnet/mamoe/mirai/console/extension/Extension;
public abstract fun getPlugin ()Lnet/mamoe/mirai/console/plugin/Plugin;
}

public abstract interface class net/mamoe/mirai/console/extension/FunctionExtension : net/mamoe/mirai/console/extension/Extension {
}

Expand Down Expand Up @@ -1543,11 +1544,11 @@ public final class net/mamoe/mirai/console/extensions/CommandCallParserProviderI
public fun getInstance ()Lnet/mamoe/mirai/console/command/parse/CommandCallParser;
}

public abstract interface class net/mamoe/mirai/console/extensions/CommandCallResolverProvider : net/mamoe/mirai/console/extension/SingletonExtension {
public abstract interface class net/mamoe/mirai/console/extensions/CommandCallResolverProvider : net/mamoe/mirai/console/extension/InstanceExtension {
public static final field ExtensionPoint Lnet/mamoe/mirai/console/extensions/CommandCallResolverProvider$ExtensionPoint;
}

public final class net/mamoe/mirai/console/extensions/CommandCallResolverProvider$ExtensionPoint : net/mamoe/mirai/console/extension/AbstractSingletonExtensionPoint {
public final class net/mamoe/mirai/console/extensions/CommandCallResolverProvider$ExtensionPoint : net/mamoe/mirai/console/extension/AbstractInstanceExtensionPoint {
}

public final class net/mamoe/mirai/console/extensions/CommandCallResolverProviderImpl : net/mamoe/mirai/console/extensions/CommandCallResolverProvider {
Expand All @@ -1562,14 +1563,11 @@ public final class net/mamoe/mirai/console/extensions/CommandCallResolverProvide
public fun getInstance ()Lnet/mamoe/mirai/console/command/resolve/CommandCallResolver;
}

public abstract interface class net/mamoe/mirai/console/extensions/PermissionServiceProvider : net/mamoe/mirai/console/extension/SingletonExtension {
public abstract interface class net/mamoe/mirai/console/extensions/PermissionServiceProvider : net/mamoe/mirai/console/extension/InstanceExtension {
public static final field ExtensionPoint Lnet/mamoe/mirai/console/extensions/PermissionServiceProvider$ExtensionPoint;
}

public final class net/mamoe/mirai/console/extensions/PermissionServiceProvider$ExtensionPoint : net/mamoe/mirai/console/extension/AbstractSingletonExtensionPoint {
public final fun getProviderPlugin ()Lnet/mamoe/mirai/console/plugin/Plugin;
public synthetic fun getSelectedInstance ()Ljava/lang/Object;
public fun getSelectedInstance ()Lnet/mamoe/mirai/console/permission/PermissionService;
public final class net/mamoe/mirai/console/extensions/PermissionServiceProvider$ExtensionPoint : net/mamoe/mirai/console/extension/AbstractInstanceExtensionPoint {
}

public final class net/mamoe/mirai/console/extensions/PermissionServiceProviderImpl : net/mamoe/mirai/console/extensions/PermissionServiceProvider {
Expand Down
9 changes: 3 additions & 6 deletions mirai-console/backend/mirai-console/src/MiraiConsole.kt
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ public interface MiraiConsole : CoroutineScope {
*
* 调用 [Bot.login] 可登录.
*
* @see Bot.botInstances 获取现有 [Bot] 实例列表
* @see Bot.instances 获取现有 [Bot] 实例列表
* @see BotConfigurationAlterer ExtensionPoint
*/
// don't static
Expand Down Expand Up @@ -225,11 +225,8 @@ public interface MiraiConsole : CoroutineScope {
configuration()
}

config = GlobalComponentStorage.run {
BotConfigurationAlterer.foldExtensions(config) { acc, extension ->
extension.alterConfiguration(id, acc)

}
config = GlobalComponentStorage.foldExtensions(BotConfigurationAlterer, config) { acc, extension ->
extension.alterConfiguration(id, acc)
}

return when (password) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import net.mamoe.mirai.console.extension.ComponentStorage
import net.mamoe.mirai.console.internal.MiraiConsoleImplementationBridge
import net.mamoe.mirai.console.internal.command.CommandManagerImpl
import net.mamoe.mirai.console.internal.data.builtins.ConsoleDataScopeImpl
import net.mamoe.mirai.console.internal.extension.GlobalComponentStorage
import net.mamoe.mirai.console.internal.logging.LoggerControllerImpl
import net.mamoe.mirai.console.internal.plugin.BuiltInJvmPluginLoaderImpl
import net.mamoe.mirai.console.internal.pluginManagerImpl
Expand All @@ -39,12 +38,14 @@ import net.mamoe.mirai.message.data.Message
import net.mamoe.mirai.utils.BotConfiguration
import net.mamoe.mirai.utils.LoginSolver
import net.mamoe.mirai.utils.MiraiLogger
import net.mamoe.mirai.utils.NotStableForInheritance
import java.nio.file.Path
import java.util.*
import java.util.concurrent.locks.ReentrantLock
import kotlin.annotation.AnnotationTarget.*
import kotlin.concurrent.thread
import kotlin.coroutines.CoroutineContext
import kotlin.reflect.KClass


/**
Expand Down Expand Up @@ -228,7 +229,7 @@ public interface MiraiConsoleImplementation : CoroutineScope {
/**
* 前端预先定义的 [LoggerController], 以允许前端使用自己的配置系统
*/
public val loggerController: LoggerController get() = LoggerControllerImpl
public val loggerController: LoggerController get() = LoggerControllerImpl()

///////////////////////////////////////////////////////////////////////////
// ConsoleDataScope
Expand Down Expand Up @@ -258,17 +259,40 @@ public interface MiraiConsoleImplementation : CoroutineScope {
* @since 2.10.0-RC
*/
@ConsoleFrontEndImplementation
@NotStableForInheritance
public interface ConsoleDataScope {
public val dataHolder: AutoSavePluginDataHolder
public val configHolder: AutoSavePluginDataHolder
public fun addAndReloadConfig(config: PluginConfig)

/**
* @since 2.11.0-RC
*/
public fun <T : PluginData> find(type: KClass<T>): T?

/**
* @since 2.11.0-RC
*/
public fun <T : PluginData> get(type: KClass<T>): T =
find(type) ?: throw NoSuchElementException(type.qualifiedName)

public fun reloadAll()

/**
* @since 2.10.0-RCl
* @since 2.10.0-RC
*/
@ConsoleFrontEndImplementation
public companion object {
/**
* @since 2.11.0-RC
*/
public inline fun <reified T : PluginData> ConsoleDataScope.find(): T? = find(T::class)

/**
* @since 2.11.0-RC
*/
public inline fun <reified T : PluginData> ConsoleDataScope.get(): T = get(T::class)

@JvmStatic
public fun createDefault(
coroutineContext: CoroutineContext,
Expand Down Expand Up @@ -317,6 +341,9 @@ public interface MiraiConsoleImplementation : CoroutineScope {
@ConsoleFrontEndImplementation
public interface BackendAccess {
// GlobalComponentStorage
/**
* 在 Mirai Console 第一个 phase 之后会包含内建 storages.
*/
public val globalComponentStorage: ComponentStorage

// PluginManagerImpl.resolvedPlugins
Expand Down Expand Up @@ -365,7 +392,7 @@ public interface MiraiConsoleImplementation : CoroutineScope {
@ConsoleFrontEndImplementation
public companion object {
private val backendAccessInstance = object : BackendAccess {
override val globalComponentStorage: ComponentStorage get() = GlobalComponentStorage
override val globalComponentStorage: ComponentStorage get() = getBridge().globalComponentStorage
override val resolvedPlugins: MutableList<Plugin> get() = MiraiConsole.pluginManagerImpl.resolvedPlugins
}

Expand Down
36 changes: 23 additions & 13 deletions mirai-console/backend/mirai-console/src/command/BuiltInCommands.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import kotlinx.coroutines.sync.withLock
import net.mamoe.mirai.Bot
import net.mamoe.mirai.console.MiraiConsole
import net.mamoe.mirai.console.MiraiConsoleImplementation
import net.mamoe.mirai.console.MiraiConsoleImplementation.ConsoleDataScope.Companion.get
import net.mamoe.mirai.console.command.CommandManager.INSTANCE.allRegisteredCommands
import net.mamoe.mirai.console.command.CommandManager.INSTANCE.register
import net.mamoe.mirai.console.command.descriptor.CommandArgumentParserException
Expand All @@ -28,6 +29,8 @@ import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig
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.data.builtins.DataScope
import net.mamoe.mirai.console.internal.extension.GlobalComponentStorage
import net.mamoe.mirai.console.internal.permission.BuiltInPermissionService
import net.mamoe.mirai.console.internal.pluginManagerImpl
import net.mamoe.mirai.console.internal.util.autoHexToBytes
Expand Down Expand Up @@ -202,7 +205,8 @@ public object BuiltInCommands {
}

suspend fun getPassword(id: Long): Any? {
val acc = AutoLoginConfig.accounts.firstOrNull { it.account == id.toString() }
val config = DataScope.get<AutoLoginConfig>()
val acc = config.accounts.firstOrNull { it.account == id.toString() }
if (acc == null) {
sendMessage("Could not find '$id' in AutoLogin config. Please specify password.")
return null
Expand Down Expand Up @@ -320,8 +324,9 @@ public object BuiltInCommands {
@Description("查看自动登录账号列表")
@SubCommand
public suspend fun CommandSender.list() {
val config = DataScope.get<AutoLoginConfig>()
sendMessage(buildString {
for (account in AutoLoginConfig.accounts) {
for (account in config.accounts) {
if (account.account == "123456") continue
append("- ")
append("账号: ")
Expand All @@ -345,27 +350,30 @@ public object BuiltInCommands {
@Description("添加自动登录, passwordKind 可选 PLAIN 或 MD5")
@SubCommand
public suspend fun CommandSender.add(account: Long, password: String, passwordKind: PasswordKind = PLAIN) {
val config = DataScope.get<AutoLoginConfig>()
val accountStr = account.toString()
if (AutoLoginConfig.accounts.any { it.account == accountStr }) {
if (config.accounts.any { it.account == accountStr }) {
sendMessage("已有相同账号在自动登录配置中. 请先删除该账号.")
return
}
AutoLoginConfig.accounts.add(AutoLoginConfig.Account(accountStr, Password(passwordKind, password)))
config.accounts.add(AutoLoginConfig.Account(accountStr, Password(passwordKind, password)))
sendMessage("已成功添加 '$account'.")
}

@Description("清除所有配置")
@SubCommand
public suspend fun CommandSender.clear() {
AutoLoginConfig.accounts.clear()
val config = DataScope.get<AutoLoginConfig>()
config.accounts.clear()
sendMessage("已清除所有自动登录配置.")
}

@Description("删除一个账号")
@SubCommand
public suspend fun CommandSender.remove(account: Long) {
val config = DataScope.get<AutoLoginConfig>()
val accountStr = account.toString()
if (AutoLoginConfig.accounts.removeIf { it.account == accountStr }) {
if (config.accounts.removeIf { it.account == accountStr }) {
sendMessage("已成功删除 '$account'.")
return
}
Expand All @@ -375,9 +383,10 @@ public object BuiltInCommands {
@Description("设置一个账号的一个配置项")
@SubCommand
public suspend fun CommandSender.setConfig(account: Long, configKey: ConfigurationKey, value: String) {
val config = DataScope.get<AutoLoginConfig>()
val accountStr = account.toString()

val oldAccount = AutoLoginConfig.accounts.find { it.account == accountStr } ?: kotlin.run {
val oldAccount = config.accounts.find { it.account == accountStr } ?: kotlin.run {
sendMessage("未找到账号 $account.")
return
}
Expand All @@ -388,18 +397,19 @@ public object BuiltInCommands {
put(configKey, value)
})

AutoLoginConfig.accounts.remove(oldAccount)
AutoLoginConfig.accounts.add(newAccount)
config.accounts.remove(oldAccount)
config.accounts.add(newAccount)

sendMessage("成功修改 '$account' 的配置 '$configKey' 为 '$value'")
}

@Description("删除一个账号的一个配置项")
@SubCommand
public suspend fun CommandSender.removeConfig(account: Long, configKey: ConfigurationKey) {
val config = DataScope.get<AutoLoginConfig>()
val accountStr = account.toString()

val oldAccount = AutoLoginConfig.accounts.find { it.account == accountStr } ?: kotlin.run {
val oldAccount = config.accounts.find { it.account == accountStr } ?: kotlin.run {
sendMessage("未找到账号 $account.")
return
}
Expand All @@ -408,8 +418,8 @@ public object BuiltInCommands {
remove(configKey)
})

AutoLoginConfig.accounts.remove(oldAccount)
AutoLoginConfig.accounts.add(newAccount)
config.accounts.remove(oldAccount)
config.accounts.add(newAccount)

sendMessage("成功删除 '$account' 的配置 '$configKey'.")
}
Expand Down Expand Up @@ -484,7 +494,7 @@ public object BuiltInCommands {
lightYellow()
"Built In Permission Service"
} else {
val plugin = PermissionServiceProvider.providerPlugin
val plugin = GlobalComponentStorage.getPreferredExtension(PermissionServiceProvider).plugin
if (plugin == null) {
PermissionService.INSTANCE.toString()
} else {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2019-2021 Mamoe Technologies and contributors.
* Copyright 2019-2022 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
Expand Down Expand Up @@ -44,10 +44,8 @@ public interface CommandCallParser {
*/
@JvmStatic
public fun MessageChain.parseCommandCall(sender: CommandSender): CommandCall? {
GlobalComponentStorage.run {
CommandCallParserProvider.useExtensions { provider ->
provider.instance.parse(sender, this@parseCommandCall)?.let { return it }
}
GlobalComponentStorage.useEachExtensions(CommandCallParserProvider) { provider ->
provider.instance.parse(sender, this@parseCommandCall)?.let { return it }
}
return null
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2019-2021 Mamoe Technologies and contributors.
* Copyright 2019-2022 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
Expand All @@ -12,7 +12,6 @@ package net.mamoe.mirai.console.command.parse
import net.mamoe.mirai.console.command.CommandSender
import net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors
import net.mamoe.mirai.console.extensions.CommandCallParserProvider
import net.mamoe.mirai.console.extensions.CommandCallParserProviderImpl
import net.mamoe.mirai.console.internal.command.flattenCommandComponents
import net.mamoe.mirai.console.util.ConsoleExperimentalApi
import net.mamoe.mirai.message.data.MessageChain
Expand All @@ -22,6 +21,14 @@ import net.mamoe.mirai.message.data.content
@ConsoleExperimentalApi
@ExperimentalCommandDescriptors
public object SpaceSeparatedCommandCallParser : CommandCallParser {

@ConsoleExperimentalApi
@ExperimentalCommandDescriptors
public object Provider : CommandCallParserProvider {
override val instance: CommandCallParser get() = SpaceSeparatedCommandCallParser
override val priority: Int get() = -1
}

override fun parse(caller: CommandSender, message: MessageChain): CommandCall? {
val flatten = message.flattenCommandComponents().filterIsInstance<MessageContent>()
if (flatten.isEmpty()) return null
Expand All @@ -31,6 +38,4 @@ public object SpaceSeparatedCommandCallParser : CommandCallParser {
valueArguments = flatten.drop(1).map(::DefaultCommandValueArgument)
)
}

public object Provider : CommandCallParserProvider by CommandCallParserProviderImpl(SpaceSeparatedCommandCallParser)
}
Loading