Fix flatten

This commit is contained in:
Him188 2020-05-14 16:05:27 +08:00
parent ee8be9799f
commit 3eb5a0a4cf
4 changed files with 94 additions and 29 deletions

View File

@ -68,7 +68,7 @@ class CommandDescriptor(
/** /**
* `fullName + aliases` * `fullName + aliases`
*/ */
val allNames = arrayOf(fullName, *aliases) val allNames: Array<CommandFullName> = arrayOf(fullName, *aliases)
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
if (this === other) return true if (this === other) return true
@ -117,7 +117,7 @@ internal fun Any.flattenCommandComponents(): Sequence<Any> = when (this) {
is String -> splitToSequence(' ').filterNot { it.isBlank() } is String -> splitToSequence(' ').filterNot { it.isBlank() }
is PlainText -> content.flattenCommandComponents() is PlainText -> content.flattenCommandComponents()
is SingleMessage -> sequenceOf(this) is SingleMessage -> sequenceOf(this)
is MessageChain -> this.asSequence().map { it.flattenCommandComponents() } is MessageChain -> this.asSequence().flatMap { it.flattenCommandComponents() }
else -> throw IllegalArgumentException("Illegal component: $this") else -> throw IllegalArgumentException("Illegal component: $this")
} }
@ -134,11 +134,14 @@ internal fun CommandFullName.checkFullName(errorHint: String): CommandFullName {
inline fun CommandDescriptor( inline fun CommandDescriptor(
vararg fullName: Any, vararg fullName: Any,
block: CommandDescriptorBuilder.() -> Unit = {} block: CommandDescriptorBuilder.() -> Unit = {}
): CommandDescriptor = CommandDescriptorBuilder(fullName).apply(block).build() ): CommandDescriptor = CommandDescriptorBuilder(*fullName).apply(block).build()
class CommandDescriptorBuilder( class CommandDescriptorBuilder(
vararg val fullName: Any vararg fullName: Any
) { ) {
@PublishedApi
internal var fullName: CommandFullName = fullName.checkFullName("fullName")
@PublishedApi @PublishedApi
internal var context: CommandParserContext = CommandParserContext.Builtins internal var context: CommandParserContext = CommandParserContext.Builtins

View File

@ -25,16 +25,14 @@ fun CommandOwner.unregisterAllCommands() {
* 注册一个指令. 若此指令已经注册或有已经注册的指令与 [allNames] 重名, 返回 `false` * 注册一个指令. 若此指令已经注册或有已经注册的指令与 [allNames] 重名, 返回 `false`
*/ */
fun Command.register(): Boolean = InternalCommandManager.modifyLock.withLock { fun Command.register(): Boolean = InternalCommandManager.modifyLock.withLock {
with(descriptor) { if (findDuplicate() != null) {
if (findDuplicate() != null) { return false
return false
}
InternalCommandManager.registeredCommands.add(this@register)
for (name in this.allNames) {
InternalCommandManager.nameToCommandMap[name] = this@register
}
return true
} }
InternalCommandManager.registeredCommands.add(this@register)
for (name in this.allNames) {
InternalCommandManager.nameToCommandMap[name] = this@register
}
return true
} }
/** /**
@ -85,8 +83,7 @@ suspend fun CommandSender.execute(command: Command, args: CommandArgs): Boolean
} }
suspend fun Command.execute(sender: CommandSender, args: CommandArgs): Boolean = sender.execute(this, args) suspend fun Command.execute(sender: CommandSender, args: CommandArgs): Boolean = sender.execute(this, args)
suspend fun Command.execute(sender: CommandSender, vararg args: Any): Boolean = sender.execute(this, args) suspend fun CommandSender.execute(vararg args: Any): Boolean = args.toList().executeCommand(this)
suspend fun CommandSender.execute(command: Command, vararg args: Any): Boolean = command.execute(this, args)
internal suspend fun List<Any>.executeCommand(sender: CommandSender): Boolean { internal suspend fun List<Any>.executeCommand(sender: CommandSender): Boolean {

View File

@ -10,24 +10,14 @@
package net.mamoe.mirai.console.command package net.mamoe.mirai.console.command
suspend fun main() { suspend fun main() {
ConsoleCommandSender.execute(DefaultCommands.Test, "test")
}
internal object DefaultCommands { if (ConsoleCommandSender.execute("test")) {
object Test : ConsoleCommand(
CommandDescriptor("test") {
param<String>()
}
) {
override suspend fun onCommand(sender: CommandSender, args: CommandArgs): Boolean {
val s = args.getReified<String>()
sender.sendMessage(s)
return true
}
} }
} }
internal object DefaultCommands
/* /*
/** /**

View File

@ -0,0 +1,75 @@
/*
* Copyright 2020 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.
*
* https://github.com/mamoe/mirai/blob/master/LICENSE
*/
@file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
package net.mamoe.mirai.console.command
import net.mamoe.mirai.console.plugins.PluginBase
import net.mamoe.mirai.message.data.PlainText
import net.mamoe.mirai.message.data.messageChainOf
import net.mamoe.mirai.message.data.toMessage
import org.junit.jupiter.api.Test
import kotlin.test.assertEquals
import kotlin.test.assertFalse
import kotlin.test.assertTrue
val plugin: PluginBase = object : PluginBase() {
}
internal object TestCommand : PluginCommand(
plugin,
CommandDescriptor("test") {
param<String>()
}
) {
override suspend fun onCommand(sender: CommandSender, args: CommandArgs): Boolean {
val s = args.getReified<String>()
sender.sendMessage(s)
return true
}
}
internal class TestCommands {
@Test
fun testFlatten() {
assertEquals(listOf("test", "v1"), "test v1".flattenCommandComponents().toList())
assertEquals(listOf("test", "v1"), PlainText("test v1").flattenCommandComponents().toList())
assertEquals(listOf("test", "v1"), arrayOf("test ", "v1", " ").flattenCommandComponents().toList())
assertEquals(
listOf("test", "v1"),
messageChainOf("test v1".toMessage(), " ".toMessage()).flattenCommandComponents().toList()
)
}
@Test
fun testRegister() {
assertTrue(TestCommand.register())
assertEquals(listOf("test"), TestCommand.allNames.single().toList())
assertFalse(TestCommand.register())
assertFalse(
object : PluginCommand(
plugin,
CommandDescriptor("test") {
param<String>()
}
) {
override suspend fun onCommand(sender: CommandSender, args: CommandArgs): Boolean {
val s = args.getReified<String>()
sender.sendMessage(s)
return true
}
}.register()
)
}
}