mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-16 00:30:15 +08:00
Use MessageContent for CommandArgumentParser
This commit is contained in:
parent
d58e907d73
commit
e8d96aaae2
@ -16,10 +16,8 @@ import net.mamoe.mirai.console.command.CommandManager
|
||||
import net.mamoe.mirai.console.command.CommandSender
|
||||
import net.mamoe.mirai.console.command.CompositeCommand
|
||||
import net.mamoe.mirai.console.command.SimpleCommand
|
||||
import net.mamoe.mirai.contact.Friend
|
||||
import net.mamoe.mirai.contact.Group
|
||||
import net.mamoe.mirai.contact.Member
|
||||
import net.mamoe.mirai.contact.User
|
||||
import net.mamoe.mirai.contact.*
|
||||
import net.mamoe.mirai.message.data.MessageContent
|
||||
import net.mamoe.mirai.message.data.SingleMessage
|
||||
import net.mamoe.mirai.message.data.content
|
||||
import kotlin.contracts.InvocationKind
|
||||
@ -46,6 +44,7 @@ import kotlin.contracts.contract
|
||||
* - [Group]: [ExistingGroupArgumentParser]
|
||||
* - [Member]: [ExistingMemberArgumentParser]
|
||||
* - [User]: [ExistingUserArgumentParser]
|
||||
* - [Contact]: [ExistingContactArgumentParser]
|
||||
*
|
||||
*
|
||||
* @see SimpleCommand 简单指令
|
||||
@ -68,7 +67,7 @@ public interface CommandArgumentParser<out T : Any> {
|
||||
public fun parse(raw: String, sender: CommandSender): T
|
||||
|
||||
/**
|
||||
* 解析一个字符串为 [T] 类型参数
|
||||
* 解析一个消息内容元素为 [T] 类型参数
|
||||
*
|
||||
* **实现提示**: 在解析时遇到意料之中的问题, 如无法找到目标群员, 可抛出 [CommandArgumentParserException].
|
||||
* 此异常将会被特殊处理, 不会引发一个错误, 而是作为指令调用成功的情况, 将错误信息发送给用户.
|
||||
@ -79,7 +78,7 @@ public interface CommandArgumentParser<out T : Any> {
|
||||
*/
|
||||
@Throws(CommandArgumentParserException::class)
|
||||
@JvmDefault
|
||||
public fun parse(raw: SingleMessage, sender: CommandSender): T = parse(raw.content, sender)
|
||||
public fun parse(raw: MessageContent, sender: CommandSender): T = parse(raw.content, sender)
|
||||
}
|
||||
|
||||
/**
|
||||
@ -129,32 +128,4 @@ public inline fun CommandArgumentParser<*>.checkArgument(
|
||||
callsInPlace(message, InvocationKind.AT_MOST_ONCE)
|
||||
}
|
||||
if (!condition) illegalArgument(message())
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
/**
|
||||
* 创建匿名 [CommandArgumentParser]
|
||||
*/
|
||||
@Suppress("FunctionName")
|
||||
@JvmSynthetic
|
||||
public inline fun <T : Any> CommandArgumentParser(
|
||||
crossinline stringParser: CommandArgumentParser<T>.(s: String, sender: CommandSender) -> T
|
||||
): CommandArgumentParser<T> = object : CommandArgumentParser<T> {
|
||||
override fun parse(raw: String, sender: CommandSender): T = stringParser(raw, sender)
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建匿名 [CommandArgumentParser]
|
||||
*/
|
||||
@Suppress("FunctionName")
|
||||
@JvmSynthetic
|
||||
public inline fun <T : Any> CommandArgumentParser(
|
||||
crossinline stringParser: CommandArgumentParser<T>.(s: String, sender: CommandSender) -> T,
|
||||
crossinline messageParser: CommandArgumentParser<T>.(m: SingleMessage, sender: CommandSender) -> T
|
||||
): CommandArgumentParser<T> = object : CommandArgumentParser<T> {
|
||||
override fun parse(raw: String, sender: CommandSender): T = stringParser(raw, sender)
|
||||
override fun parse(raw: SingleMessage, sender: CommandSender): T = messageParser(raw, sender)
|
||||
}
|
||||
|
||||
*/
|
||||
}
|
@ -16,6 +16,7 @@ import net.mamoe.mirai.contact.*
|
||||
import net.mamoe.mirai.getFriendOrNull
|
||||
import net.mamoe.mirai.getGroupOrNull
|
||||
import net.mamoe.mirai.message.data.At
|
||||
import net.mamoe.mirai.message.data.MessageContent
|
||||
import net.mamoe.mirai.message.data.SingleMessage
|
||||
import net.mamoe.mirai.message.data.content
|
||||
|
||||
@ -95,7 +96,7 @@ public object ExistingBotArgumentParser : InternalCommandArgumentParserExtension
|
||||
if (raw == "~") sender.inferBotOrFail()
|
||||
else raw.findBotOrFail()
|
||||
|
||||
public override fun parse(raw: SingleMessage, sender: CommandSender): Bot =
|
||||
public override fun parse(raw: MessageContent, sender: CommandSender): Bot =
|
||||
if (raw is At) {
|
||||
Bot.getInstanceOrNull(raw.target)
|
||||
?: illegalArgument("@ 的对象不是一个 Bot")
|
||||
@ -130,7 +131,7 @@ public object ExistingFriendArgumentParser : InternalCommandArgumentParserExtens
|
||||
}
|
||||
}
|
||||
|
||||
public override fun parse(raw: SingleMessage, sender: CommandSender): Friend {
|
||||
public override fun parse(raw: MessageContent, sender: CommandSender): Friend {
|
||||
if (raw is At) {
|
||||
checkArgument(sender is MemberCommandSender)
|
||||
return sender.inferBotOrFail().getFriendOrNull(raw.target)
|
||||
@ -187,7 +188,7 @@ public object ExistingUserArgumentParser : InternalCommandArgumentParserExtensio
|
||||
return parseImpl(sender, raw, ExistingMemberArgumentParser::parse, ExistingFriendArgumentParser::parse)
|
||||
}
|
||||
|
||||
override fun parse(raw: SingleMessage, sender: CommandSender): User {
|
||||
override fun parse(raw: MessageContent, sender: CommandSender): User {
|
||||
return parseImpl(sender, raw, ExistingMemberArgumentParser::parse, ExistingFriendArgumentParser::parse)
|
||||
}
|
||||
|
||||
@ -231,7 +232,7 @@ public object ExistingContactArgumentParser : InternalCommandArgumentParserExten
|
||||
return parseImpl(sender, raw, ExistingUserArgumentParser::parse, ExistingGroupArgumentParser::parse)
|
||||
}
|
||||
|
||||
override fun parse(raw: SingleMessage, sender: CommandSender): Contact {
|
||||
override fun parse(raw: MessageContent, sender: CommandSender): Contact {
|
||||
return parseImpl(sender, raw, ExistingUserArgumentParser::parse, ExistingGroupArgumentParser::parse)
|
||||
}
|
||||
|
||||
@ -287,7 +288,7 @@ public object ExistingMemberArgumentParser : InternalCommandArgumentParserExtens
|
||||
}
|
||||
}
|
||||
|
||||
public override fun parse(raw: SingleMessage, sender: CommandSender): Member {
|
||||
public override fun parse(raw: MessageContent, sender: CommandSender): Member {
|
||||
return if (raw is At) {
|
||||
checkArgument(sender is MemberCommandSender)
|
||||
val bot = sender.inferBotOrFail()
|
||||
|
@ -15,10 +15,8 @@ import net.mamoe.mirai.console.command.*
|
||||
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.message.data.MessageChain
|
||||
import net.mamoe.mirai.message.data.PlainText
|
||||
import net.mamoe.mirai.message.data.SingleMessage
|
||||
import net.mamoe.mirai.message.data.buildMessageChain
|
||||
import net.mamoe.mirai.console.internal.data.kClassQualifiedNameOrTip
|
||||
import net.mamoe.mirai.message.data.*
|
||||
import kotlin.reflect.KAnnotatedElement
|
||||
import kotlin.reflect.KClass
|
||||
import kotlin.reflect.KFunction
|
||||
@ -157,7 +155,8 @@ internal abstract class AbstractReflectionCommand @JvmOverloads constructor(
|
||||
val rawArg = rawArgs[offset + index]
|
||||
when (rawArg) {
|
||||
is PlainText -> context[param.type]?.parse(rawArg.content, sender)
|
||||
else -> context[param.type]?.parse(rawArg, sender)
|
||||
is MessageContent -> context[param.type]?.parse(rawArg, sender)
|
||||
else -> throw IllegalArgumentException("Illegal Message kind: ${rawArg.kClassQualifiedNameOrTip}")
|
||||
} ?: error("Cannot find a parser for $rawArg")
|
||||
}
|
||||
}
|
||||
|
@ -196,7 +196,7 @@ internal class TestCommand {
|
||||
return MyClass(raw.toInt())
|
||||
}
|
||||
|
||||
override fun parse(raw: SingleMessage, sender: CommandSender): MyClass {
|
||||
override fun parse(raw: MessageContent, sender: CommandSender): MyClass {
|
||||
assertSame(image, raw)
|
||||
return MyClass(2)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user