diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/BuiltInCommands.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/BuiltInCommands.kt index b4549263e..78a17cd26 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/BuiltInCommands.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/BuiltInCommands.kt @@ -62,17 +62,14 @@ public object BuiltInCommands { public object Managers : CompositeCommand( ConsoleCommandOwner, "managers", - description = "Manage the managers for each bot", - permission = CommandPermission.Console or CommandPermission.Manager + description = "Manage the managers for each bot" ), BuiltInCommand { - @Permission(CommandPermission.Console::class) @SubCommand public suspend fun CommandSender.add(target: User) { target.bot.addManager(target.id) sendMessage("已成功添加 ${target.render()} 为 ${target.bot.render()} 的管理员") } - @Permission(CommandPermission.Console::class) @SubCommand public suspend fun CommandSender.remove(target: User) { target.bot.removeManager(target.id) diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/Command.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/Command.kt index 2dcca4945..096be5791 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/Command.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/Command.kt @@ -15,7 +15,11 @@ import net.mamoe.kjbb.JvmBlockingBridge import net.mamoe.mirai.console.command.CommandManager.INSTANCE.executeCommand import net.mamoe.mirai.console.command.CommandManager.INSTANCE.register import net.mamoe.mirai.console.command.java.JCommand +import net.mamoe.mirai.console.internal.command.createCommandPermission import net.mamoe.mirai.console.internal.command.isValidSubName +import net.mamoe.mirai.console.permission.ExperimentalPermission +import net.mamoe.mirai.console.permission.Permission +import net.mamoe.mirai.console.permission.PermissionId import net.mamoe.mirai.message.data.MessageChain import net.mamoe.mirai.message.data.SingleMessage @@ -51,7 +55,7 @@ public interface Command { /** * 指令权限 */ - public val permission: CommandPermission + public val permission: Permission /** * 为 `true` 时表示 [指令前缀][CommandManager.commandPrefix] 可选 @@ -95,13 +99,13 @@ public suspend inline fun Command.onCommand(sender: CommandSender, args: Message * @see CompositeCommand * @see RawCommand */ -public abstract class AbstractCommand @JvmOverloads constructor( +public abstract class AbstractCommand +@JvmOverloads constructor( /** 指令拥有者. */ public override val owner: CommandOwner, vararg names: String, description: String = "", - /** 指令权限 */ - public override val permission: CommandPermission = CommandPermission.Default, + basePermission: PermissionId? = null, /** 为 `true` 时表示 [指令前缀][CommandManager.commandPrefix] 可选 */ public override val prefixOptional: Boolean = false ) : Command { @@ -111,4 +115,6 @@ public abstract class AbstractCommand @JvmOverloads constructor( list.firstOrNull { !it.isValidSubName() }?.let { error("Invalid name: $it") } }.toTypedArray() + @OptIn(ExperimentalPermission::class) + public override val permission: Permission by lazy { createCommandPermission(basePermission) } } \ No newline at end of file diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/CommandOwner.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/CommandOwner.kt index 49d2715f3..49932f8df 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/CommandOwner.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/CommandOwner.kt @@ -10,6 +10,9 @@ package net.mamoe.mirai.console.command import net.mamoe.mirai.console.command.CommandManager.INSTANCE.unregisterAllCommands +import net.mamoe.mirai.console.permission.ExperimentalPermission +import net.mamoe.mirai.console.permission.PermissionId +import net.mamoe.mirai.console.permission.PermissionIdNamespace import net.mamoe.mirai.console.plugin.jvm.JvmPlugin /** @@ -20,9 +23,12 @@ import net.mamoe.mirai.console.plugin.jvm.JvmPlugin * * @see JvmPlugin 是一个 [CommandOwner] */ -public interface CommandOwner +public interface CommandOwner : PermissionIdNamespace /** * 代表控制台所有者. 所有的 mirai-console 内建的指令都属于 [ConsoleCommandOwner]. */ -internal object ConsoleCommandOwner : CommandOwner \ No newline at end of file +internal object ConsoleCommandOwner : CommandOwner { + @ExperimentalPermission + override fun permissionId(id: String): PermissionId = PermissionId("console", id) +} \ No newline at end of file diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/CommandPermission.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/CommandPermission.kt deleted file mode 100644 index 6ea195f7d..000000000 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/CommandPermission.kt +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright 2019-2020 Mamoe Technologies and contributors. - * - * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. - * Use of this source code is governed by the GNU AFFERO GENERAL PUBLIC LICENSE version 3 license that can be found via the following link. - * - * https://github.com/mamoe/mirai/blob/master/LICENSE - */ - -@file:Suppress("unused", "NOTHING_TO_INLINE", "MemberVisibilityCanBePrivate") - -package net.mamoe.mirai.console.command - -import net.mamoe.mirai.Bot -import net.mamoe.mirai.console.command.CommandManager.INSTANCE.executeCommand -import net.mamoe.mirai.console.internal.command.AndCommandPermissionImpl -import net.mamoe.mirai.console.internal.command.OrCommandPermissionImpl -import net.mamoe.mirai.console.util.BotManager.INSTANCE.isManager -import net.mamoe.mirai.contact.isAdministrator -import net.mamoe.mirai.contact.isOperator -import net.mamoe.mirai.contact.isOwner - -/** - * 指令权限. - * - * 在 [CommandManager.executeCommand] 时将会检查权限. - * - * @see Command.permission 从指令获取权限 - */ -public fun interface CommandPermission { - /** - * 判断 [this] 是否拥有这个指令的权限 - * - * @see CommandSender.hasPermission - * @see CommandPermission.testPermission - */ - public fun CommandSender.hasPermission(): Boolean - - - /** - * 满足两个权限其中一个即可使用指令 - */ // no extension for Java - public infix fun or(another: CommandPermission): CommandPermission = OrCommandPermissionImpl(this, another) - - /** - * 同时拥有两个权限才能使用指令 - */ // no extension for Java - public infix fun and(another: CommandPermission): CommandPermission = AndCommandPermissionImpl(this, another) - - - /** - * 任何人都可以使用这个指令 - */ - public object Any : CommandPermission { - public override fun CommandSender.hasPermission(): Boolean = true - } - - /** - * 任何人都不能使用这个指令. 指令只能通过调用 [Command.onCommand] 执行. - */ - public object None : CommandPermission { - public override fun CommandSender.hasPermission(): Boolean = false - } - - /** - * 来自任何 [Bot] 的任何一个管理员或群主都可以使用这个指令 - */ - public object Operator : CommandPermission { - public override fun CommandSender.hasPermission(): Boolean { - return this is MemberCommandSender && this.user.isOperator() - } - } - - /** - * 来自任何 [Bot] 的任何一个群主都可以使用这个指令 - */ - public object GroupOwner : CommandPermission { - public override fun CommandSender.hasPermission(): Boolean { - return this is MemberCommandSender && this.user.isOwner() - } - } - - /** - * 管理员 (不包含群主) 可以使用这个指令 - */ - public object GroupAdmin : CommandPermission { - public override fun CommandSender.hasPermission(): Boolean { - return this is MemberCommandSender && this.user.isAdministrator() - } - } - - /** - * 任何 [Bot] 的 manager 都可以使用这个指令 - */ - public object Manager : CommandPermission { - public override fun CommandSender.hasPermission(): Boolean { - return this is MemberCommandSender && this.user.isManager - } - } - - /** - * 仅控制台能使用和这个指令 - */ - public object Console : CommandPermission { - public override fun CommandSender.hasPermission(): Boolean = this is ConsoleCommandSender - } - - /** - * 默认权限. - * - * @return [Manager] or [Console] - */ - public object Default : CommandPermission by (Manager or Console) -} - -/** - * 判断 [this] 是否拥有权限 [permission] - * - * @see CommandSender.hasPermission - * @see CommandPermission.testPermission - * @see CommandPermission.hasPermission - */ -public inline fun CommandSender.hasPermission(permission: CommandPermission): Boolean = - permission.run { this@hasPermission.hasPermission() } - - -/** - * 判断 [sender] 是否拥有权限 [this] - * - * @see CommandSender.hasPermission - * @see CommandPermission.testPermission - * @see CommandPermission.hasPermission - */ -public inline fun CommandPermission.testPermission(sender: CommandSender): Boolean = this.run { sender.hasPermission() } - -/** - * 判断 [sender] 是否拥有权限 [Command.permission] - * - * @see CommandSender.hasPermission - * @see CommandPermission.testPermission - * @see CommandPermission.hasPermission - */ -public inline fun Command.testPermission(sender: CommandSender): Boolean = sender.hasPermission(this.permission) \ No newline at end of file diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/CompositeCommand.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/CompositeCommand.kt index c901ea4ca..26a71f9d8 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/CompositeCommand.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/CompositeCommand.kt @@ -20,11 +20,12 @@ package net.mamoe.mirai.console.command import net.mamoe.mirai.console.command.description.* import net.mamoe.mirai.console.internal.command.AbstractReflectionCommand import net.mamoe.mirai.console.internal.command.CompositeCommandSubCommandAnnotationResolver +import net.mamoe.mirai.console.permission.ExperimentalPermission +import net.mamoe.mirai.console.permission.PermissionId import net.mamoe.mirai.console.util.ConsoleExperimentalAPI import net.mamoe.mirai.message.data.MessageChain import kotlin.annotation.AnnotationRetention.RUNTIME import kotlin.annotation.AnnotationTarget.FUNCTION -import kotlin.reflect.KClass /** * 复合指令. 指令注册时候会通过反射构造指令解析器. @@ -85,10 +86,10 @@ public abstract class CompositeCommand( owner: CommandOwner, vararg names: String, description: String = "no description available", - permission: CommandPermission = CommandPermission.Default, + basePermission: PermissionId? = null, prefixOptional: Boolean = false, overrideContext: CommandArgumentContext = EmptyCommandArgumentContext -) : Command, AbstractReflectionCommand(owner, names, description, permission, prefixOptional), +) : Command, AbstractReflectionCommand(owner, names, description, basePermission, prefixOptional), CommandArgumentContextAware { /** @@ -112,7 +113,8 @@ public abstract class CompositeCommand( /** 指定子指令要求的权限 */ @Retention(RUNTIME) @Target(FUNCTION) - protected annotation class Permission(val value: KClass) + @ExperimentalPermission + protected annotation class Permission(val value: String) /** 指令描述 */ @Retention(RUNTIME) diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/RawCommand.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/RawCommand.kt index 57a436a4f..fd1a36515 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/RawCommand.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/RawCommand.kt @@ -14,6 +14,10 @@ package net.mamoe.mirai.console.command import net.mamoe.mirai.console.command.CommandManager.INSTANCE.execute import net.mamoe.mirai.console.command.CommandManager.INSTANCE.executeCommand import net.mamoe.mirai.console.command.java.JRawCommand +import net.mamoe.mirai.console.internal.command.createCommandPermission +import net.mamoe.mirai.console.permission.ExperimentalPermission +import net.mamoe.mirai.console.permission.Permission +import net.mamoe.mirai.console.permission.PermissionId import net.mamoe.mirai.message.data.MessageChain /** @@ -40,10 +44,13 @@ public abstract class RawCommand( /** 指令描述, 用于显示在 [BuiltInCommands.Help] */ public override val description: String = "", /** 指令权限 */ - public override val permission: CommandPermission = CommandPermission.Default, + basePermission: PermissionId? = null, /** 为 `true` 时表示 [指令前缀][CommandManager.commandPrefix] 可选 */ public override val prefixOptional: Boolean = false ) : Command { + @OptIn(ExperimentalPermission::class) + public override val permission: Permission by lazy { createCommandPermission(basePermission) } + /** * 在指令被执行时调用. * diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/SimpleCommand.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/SimpleCommand.kt index 12c4a16a2..9c83c9228 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/SimpleCommand.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/SimpleCommand.kt @@ -22,6 +22,7 @@ import net.mamoe.mirai.console.command.description.* import net.mamoe.mirai.console.command.java.JSimpleCommand import net.mamoe.mirai.console.internal.command.AbstractReflectionCommand import net.mamoe.mirai.console.internal.command.SimpleCommandSubCommandAnnotationResolver +import net.mamoe.mirai.console.permission.PermissionId import net.mamoe.mirai.message.data.MessageChain /** @@ -51,10 +52,10 @@ public abstract class SimpleCommand( owner: CommandOwner, vararg names: String, description: String = "no description available", - permission: CommandPermission = CommandPermission.Default, + basePermission: PermissionId? = null, prefixOptional: Boolean = false, overrideContext: CommandArgumentContext = EmptyCommandArgumentContext -) : Command, AbstractReflectionCommand(owner, names, description, permission, prefixOptional), +) : Command, AbstractReflectionCommand(owner, names, description, basePermission, prefixOptional), CommandArgumentContextAware { /** diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JCompositeCommand.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JCompositeCommand.kt index ee585a8cc..ef400b3c0 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JCompositeCommand.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JCompositeCommand.kt @@ -9,8 +9,13 @@ package net.mamoe.mirai.console.command.java -import net.mamoe.mirai.console.command.* +import net.mamoe.mirai.console.command.BuiltInCommands +import net.mamoe.mirai.console.command.CommandManager +import net.mamoe.mirai.console.command.CommandOwner +import net.mamoe.mirai.console.command.CompositeCommand import net.mamoe.mirai.console.command.description.buildCommandArgumentContext +import net.mamoe.mirai.console.permission.ExperimentalPermission +import net.mamoe.mirai.console.permission.PermissionId import net.mamoe.mirai.console.util.ConsoleExperimentalAPI /** @@ -64,16 +69,17 @@ import net.mamoe.mirai.console.util.ConsoleExperimentalAPI * @see buildCommandArgumentContext */ @ConsoleExperimentalAPI -public abstract class JCompositeCommand( +public abstract class JCompositeCommand @JvmOverloads constructor( owner: CommandOwner, - vararg names: String -) : CompositeCommand(owner, *names) { + vararg names: String, + basePermission: PermissionId? = null, +) : CompositeCommand(owner, *names, basePermission = basePermission) { /** 指令描述, 用于显示在 [BuiltInCommands.Help] */ public final override var description: String = "" protected set - /** 指令权限 */ - public final override var permission: CommandPermission = CommandPermission.Default + @OptIn(ExperimentalPermission::class) + public final override var permission: net.mamoe.mirai.console.permission.Permission = super.permission protected set /** 为 `true` 时表示 [指令前缀][CommandManager.commandPrefix] 可选 */ diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JRawCommand.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JRawCommand.kt index d3b3fb87a..f53daf865 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JRawCommand.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JRawCommand.kt @@ -13,6 +13,9 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import net.mamoe.mirai.console.command.* import net.mamoe.mirai.console.command.CommandManager.INSTANCE.execute +import net.mamoe.mirai.console.internal.command.createCommandPermission +import net.mamoe.mirai.console.permission.Permission +import net.mamoe.mirai.console.permission.PermissionId import net.mamoe.mirai.message.data.MessageChain import net.mamoe.mirai.message.data.SingleMessage @@ -42,14 +45,15 @@ import net.mamoe.mirai.message.data.SingleMessage * * @see JRawCommand */ -public abstract class JRawCommand( +public abstract class JRawCommand @JvmOverloads constructor( /** * 指令拥有者. * @see CommandOwner */ public override val owner: CommandOwner, /** 指令名. 需要至少有一个元素. 所有元素都不能带有空格 */ - public override vararg val names: String + public override vararg val names: String, + basePermission: PermissionId? = null, ) : Command { /** 用法说明, 用于发送给用户 */ public override var usage: String = "" @@ -60,7 +64,7 @@ public abstract class JRawCommand( protected set /** 指令权限 */ - public final override var permission: CommandPermission = CommandPermission.Default + public final override var permission: Permission = createCommandPermission(basePermission) protected set /** 为 `true` 时表示 [指令前缀][CommandManager.commandPrefix] 可选 */ diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JSimpleCommand.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JSimpleCommand.kt index 25d886a55..2f6ce1e4d 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JSimpleCommand.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/command/java/JSimpleCommand.kt @@ -12,9 +12,10 @@ package net.mamoe.mirai.console.command.java import net.mamoe.mirai.console.command.CommandManager import net.mamoe.mirai.console.command.CommandManager.INSTANCE.executeCommand import net.mamoe.mirai.console.command.CommandOwner -import net.mamoe.mirai.console.command.CommandPermission import net.mamoe.mirai.console.command.SimpleCommand import net.mamoe.mirai.console.command.description.CommandArgumentContext +import net.mamoe.mirai.console.permission.Permission +import net.mamoe.mirai.console.permission.PermissionId /** * Java 实现: @@ -41,11 +42,12 @@ import net.mamoe.mirai.console.command.description.CommandArgumentContext */ public abstract class JSimpleCommand( owner: CommandOwner, - vararg names: String -) : SimpleCommand(owner, *names) { + vararg names: String, + basePermission: PermissionId, +) : SimpleCommand(owner, *names, basePermission = basePermission) { public override var description: String = super.description protected set - public override var permission: CommandPermission = super.permission + public override var permission: Permission = super.permission protected set public override var prefixOptional: Boolean = super.prefixOptional protected set diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/command/CommandPermissionImpl.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/command/CommandPermissionImpl.kt deleted file mode 100644 index 8c98125fb..000000000 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/command/CommandPermissionImpl.kt +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2019-2020 Mamoe Technologies and contributors. - * - * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. - * Use of this source code is governed by the GNU AFFERO GENERAL PUBLIC LICENSE version 3 license that can be found via the following link. - * - * https://github.com/mamoe/mirai/blob/master/LICENSE - */ - -package net.mamoe.mirai.console.internal.command - -import net.mamoe.mirai.console.command.CommandPermission -import net.mamoe.mirai.console.command.CommandSender -import net.mamoe.mirai.console.command.hasPermission - -internal class OrCommandPermissionImpl( - private val first: CommandPermission, - private val second: CommandPermission -) : CommandPermission { - override fun CommandSender.hasPermission(): Boolean { - return this.hasPermission(first) || this.hasPermission(second) - } -} - -internal class AndCommandPermissionImpl( - private val first: CommandPermission, - private val second: CommandPermission -) : CommandPermission { - override fun CommandSender.hasPermission(): Boolean { - return this.hasPermission(first) && this.hasPermission(second) - } -} \ No newline at end of file diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/command/CompositeCommandInternal.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/command/CompositeCommandInternal.kt index e0c5b78b5..cda7b6fd4 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/command/CompositeCommandInternal.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/command/CompositeCommandInternal.kt @@ -16,11 +16,15 @@ import net.mamoe.mirai.console.command.Command.Companion.primaryName import net.mamoe.mirai.console.command.description.CommandArgumentContext import net.mamoe.mirai.console.command.description.CommandArgumentContextAware import net.mamoe.mirai.console.internal.data.kClassQualifiedNameOrTip +import net.mamoe.mirai.console.permission.* import net.mamoe.mirai.message.data.* import kotlin.reflect.KAnnotatedElement import kotlin.reflect.KClass import kotlin.reflect.KFunction -import kotlin.reflect.full.* +import kotlin.reflect.full.callSuspend +import kotlin.reflect.full.declaredFunctions +import kotlin.reflect.full.findAnnotation +import kotlin.reflect.full.isSubclassOf internal object CompositeCommandSubCommandAnnotationResolver : AbstractReflectionCommand.SubCommandAnnotationResolver { @@ -44,13 +48,13 @@ internal abstract class AbstractReflectionCommand @JvmOverloads constructor( owner: CommandOwner, names: Array, description: String = "", - permission: CommandPermission = CommandPermission.Default, + basePermission: PermissionId? = null, prefixOptional: Boolean = false ) : Command, AbstractCommand( owner, names = names, description = description, - permission = permission, + basePermission = basePermission, prefixOptional = prefixOptional ), CommandArgumentContextAware { internal abstract val subCommandAnnotationResolver: SubCommandAnnotationResolver @@ -70,7 +74,7 @@ internal abstract class AbstractReflectionCommand @JvmOverloads constructor( internal val defaultSubCommand: DefaultSubCommandDescriptor by lazy { DefaultSubCommandDescriptor( "", - permission, + createCommandPermission(basePermission), onCommand = { sender: CommandSender, args: MessageChain -> sender.onDefault(args) } @@ -115,7 +119,7 @@ internal abstract class AbstractReflectionCommand @JvmOverloads constructor( internal class DefaultSubCommandDescriptor( val description: String, - val permission: CommandPermission, + val permission: Permission, val onCommand: suspend (sender: CommandSender, rawArgs: MessageChain) -> Unit ) @@ -123,7 +127,7 @@ internal abstract class AbstractReflectionCommand @JvmOverloads constructor( val names: Array, val params: Array>, val description: String, - val permission: CommandPermission, + val permission: Permission, val onCommand: suspend (sender: CommandSender, parsedArgs: Array) -> Boolean, val context: CommandArgumentContext ) { @@ -209,10 +213,6 @@ internal fun Any.flattenCommandComponents(): MessageChain = buildMessageChain { internal inline fun KAnnotatedElement.hasAnnotation(): Boolean = findAnnotation() != null -internal inline fun KClass.getInstance(): T { - return this.objectInstance ?: this.createInstance() -} - internal val KClass<*>.qualifiedNameOrTip: String get() = this.qualifiedName ?: "" internal fun Array.createUsage(baseCommand: AbstractReflectionCommand): String = @@ -246,6 +246,7 @@ internal fun AbstractReflectionCommand.SubCommandDescriptor.createUsage(baseComm appendLine() }.trimEnd() +@OptIn(ExperimentalPermission::class) internal fun AbstractReflectionCommand.createSubCommand( function: KFunction<*>, context: CommandArgumentContext @@ -322,8 +323,8 @@ internal fun AbstractReflectionCommand.createSubCommand( return SubCommandDescriptor( commandName, params, - subDescription, - overridePermission?.value?.getInstance() ?: permission, + subDescription, // overridePermission?.value + overridePermission?.value?.let { PermissionService.INSTANCE[PermissionId.parseFromString(it)] } ?: permission, onCommand = { sender: CommandSender, args: Array -> val result = if (notStatic) { if (hasSenderParam) { diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/command/internal.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/command/internal.kt index cd8ef90a9..f89fc1731 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/command/internal.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/command/internal.kt @@ -10,6 +10,8 @@ package net.mamoe.mirai.console.internal.command import net.mamoe.mirai.console.command.* +import net.mamoe.mirai.console.command.Command.Companion.primaryName +import net.mamoe.mirai.console.permission.* import net.mamoe.mirai.contact.Group import net.mamoe.mirai.contact.Member import net.mamoe.mirai.message.data.MessageChain @@ -136,12 +138,17 @@ internal fun Group.fuzzySearchMember( } } +@OptIn(ExperimentalPermission::class) +internal fun Command.createCommandPermission(basePermission: PermissionId?): Permission { + return PermissionService.INSTANCE.register(owner.permissionId(primaryName), description, basePermission) +} //// internal @JvmSynthetic internal inline fun List.dropToTypedArray(n: Int): Array = Array(size - n) { this[n + it] } +@OptIn(ExperimentalPermission::class) @JvmSynthetic @Throws(CommandExecutionException::class) internal suspend fun CommandSender.executeCommandInternal( @@ -150,7 +157,7 @@ internal suspend fun CommandSender.executeCommandInternal( commandName: String, checkPermission: Boolean ): CommandExecuteResult { - if (checkPermission && !command.testPermission(this)) { + if (checkPermission && !command.permission.testPermission(this)) { return CommandExecuteResult.PermissionDenied(command, commandName) } diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/plugin/JvmPluginInternal.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/plugin/JvmPluginInternal.kt index 0036fc1a8..05c7f5127 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/plugin/JvmPluginInternal.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/internal/plugin/JvmPluginInternal.kt @@ -47,8 +47,8 @@ internal abstract class JvmPluginInternal( resourceContainerDelegate.getResourceAsStream(path) @OptIn(ExperimentalPermission::class) - override fun permissionIdentifier(identifierString: String): PermissionId { - return PermissionId(description.name, identifierString) + override fun permissionId(id: String): PermissionId { + return PermissionId(description.name, id) } // region JvmPlugin diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/permission/PermissionGroup.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/permission/PermissionGroup.kt index 3366c56ce..115d76175 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/permission/PermissionGroup.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/permission/PermissionGroup.kt @@ -14,7 +14,7 @@ import kotlin.reflect.KProperty @ExperimentalPermission public abstract class PermissionGroup( - private val identifierNamespace: PermissionIdentifierNamespace, + private val idNamespace: PermissionIdNamespace, ) { @ExperimentalPermission public inner class PermissionBuilder { @@ -45,7 +45,7 @@ public abstract class PermissionGroup( public fun build(property: KProperty<*>): Permission { return PermissionService.INSTANCE.register( - identifierNamespace.permissionIdentifier(property.name), + idNamespace.permissionId(property.name), description, basePermission ) diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/permission/PermissionId.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/permission/PermissionId.kt index 6488751e8..a71b29924 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/permission/PermissionId.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/permission/PermissionId.kt @@ -36,12 +36,21 @@ public data class PermissionId( public object AsStringSerializer : KSerializer by String.serializer().map( serializer = { it.namespace + ":" + it.id }, - deserializer = { it.split(':').let { (namespace, id) -> PermissionId(namespace, id) } } + deserializer = ::parseFromString ) + + public override fun toString(): String { + return "$namespace:$id" + } + + public companion object { + public fun parseFromString(string: String): PermissionId = + string.split(':').let { (namespace, id) -> PermissionId(namespace, id) } + } } @ExperimentalPermission -public interface PermissionIdentifierNamespace { +public interface PermissionIdNamespace { @ExperimentalPermission - public fun permissionIdentifier(identifierString: String): PermissionId + public fun permissionId(id: String): PermissionId } diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/jvm/JvmPlugin.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/jvm/JvmPlugin.kt index 82ba0b863..b6ce680a7 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/jvm/JvmPlugin.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugin/jvm/JvmPlugin.kt @@ -22,7 +22,7 @@ import net.mamoe.mirai.console.data.AutoSavePluginDataHolder import net.mamoe.mirai.console.data.PluginConfig import net.mamoe.mirai.console.data.PluginData import net.mamoe.mirai.console.permission.ExperimentalPermission -import net.mamoe.mirai.console.permission.PermissionIdentifierNamespace +import net.mamoe.mirai.console.permission.PermissionIdNamespace import net.mamoe.mirai.console.plugin.Plugin import net.mamoe.mirai.console.plugin.PluginFileExtensions import net.mamoe.mirai.console.plugin.ResourceContainer @@ -45,7 +45,7 @@ import net.mamoe.mirai.utils.MiraiLogger */ @OptIn(ExperimentalPermission::class) public interface JvmPlugin : Plugin, CoroutineScope, - PluginFileExtensions, ResourceContainer, AutoSavePluginDataHolder, PermissionIdentifierNamespace { + PluginFileExtensions, ResourceContainer, AutoSavePluginDataHolder, PermissionIdNamespace { /** 日志 */ public val logger: MiraiLogger