Fix CommandSender extensions (#2105)

This commit is contained in:
微莹·纤绫 2022-07-20 15:09:48 +08:00 committed by GitHub
parent e5cad1d0ba
commit f256926821
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 36 additions and 25 deletions

View File

@ -374,6 +374,7 @@ public final class net/mamoe/mirai/console/command/CommandSenderKt {
public static final fun isConsole (Lnet/mamoe/mirai/console/command/CommandSender;)Z
public static final fun isNotConsole (Lnet/mamoe/mirai/console/command/CommandSender;)Z
public static final fun isNotUser (Lnet/mamoe/mirai/console/command/CommandSender;)Z
public static final fun isSystem (Lnet/mamoe/mirai/console/command/CommandSender;)Z
public static final fun isUser (Lnet/mamoe/mirai/console/command/CommandSender;)Z
}

View File

@ -431,6 +431,21 @@ public interface UserCommandSender : CommandSender {
public override val bot: Bot // override nullability
}
/**
* 代表一个真实 [用户][User] 主动私聊机器人或在群内发送消息而执行指令
*
* @see MemberCommandSenderOnMessage 代表一个真实的 [群员][Member] 主动在群内发送消息执行指令.
* @see FriendCommandSenderOnMessage 代表一个真实的 [好友][Friend] 主动在私聊消息执行指令
* @see TempCommandSenderOnMessage 代表一个 [群员][Member] 主动在临时会话发送消息执行指令
*/
public interface CommandSenderOnMessage<T : MessageEvent> : CommandSender {
/**
* 消息源 [MessageEvent]
*/
public val fromEvent: T
}
/**
* 所有 [CommandSender] 都必须继承自此对象.
* @see CommandSender 查看更多信息
@ -455,6 +470,16 @@ public fun CommandSender.isConsole(): Boolean {
return this is ConsoleCommandSender
}
/**
* [this] [SystemCommandSender] 时返回 `true`
*/
public fun CommandSender.isSystem(): Boolean {
contract {
returns(true) implies (this@isSystem is SystemCommandSender)
}
return this is SystemCommandSender
}
/**
* [this] 不为 [ConsoleCommandSender] 时返回 `true`
*/
@ -476,19 +501,19 @@ public fun CommandSender.isUser(): Boolean {
}
/**
* [this] 不为 [UserCommandSender], 即为 [ConsoleCommandSender] 时返回 `true`
* [this] 不为 [UserCommandSender], 即为 [SystemCommandSender] 时返回 `true`
*/
public fun CommandSender.isNotUser(): Boolean {
contract {
returns(true) implies (this@isNotUser is ConsoleCommandSender)
returns(true) implies (this@isNotUser is SystemCommandSender)
}
return this !is UserCommandSender
}
/**
* 折叠 [AbstractCommandSender] 的可能性.
* 折叠 [CommandSender] 的可能性.
*
* - [this] [ConsoleCommandSender] 时执行 [ifIsConsole]
* - [this] [SystemCommandSender] 时执行 [ifIsSystem]
* - [this] [UserCommandSender] 时执行 [ifIsUser]
* - 否则执行 [otherwise]
*
@ -498,7 +523,7 @@ public fun CommandSender.isNotUser(): Boolean {
* val exception: Exception = ...
*
* sender.fold(
* ifIsConsole = { // this: ConsoleCommandSender
* ifIsSystem = { // this: SystemCommandSender
* sendMessage(exception.stackTraceToString()) // 展示整个 stacktrace
* },
* ifIsUser = { // this: UserCommandSender
@ -507,28 +532,28 @@ public fun CommandSender.isNotUser(): Boolean {
* )
* ```
*
* @return [ifIsConsole], [ifIsUser] [otherwise] 执行结果.
* @return [ifIsSystem], [ifIsUser] [otherwise] 执行结果.
*/
@JvmSynthetic
public inline fun <R> CommandSender.fold(
ifIsConsole: ConsoleCommandSender.() -> R,
ifIsSystem: SystemCommandSender.() -> R,
ifIsUser: UserCommandSender.() -> R,
otherwise: CommandSender.() -> R = { error("CommandSender ${this::class.qualifiedName} is not supported") },
): R {
contract {
callsInPlace(ifIsConsole, InvocationKind.AT_MOST_ONCE)
callsInPlace(ifIsSystem, InvocationKind.AT_MOST_ONCE)
callsInPlace(ifIsUser, InvocationKind.AT_MOST_ONCE)
callsInPlace(otherwise, InvocationKind.AT_MOST_ONCE)
}
return when (val sender = this) {
is ConsoleCommandSender -> ifIsConsole(sender)
is SystemCommandSender -> ifIsSystem(sender)
is UserCommandSender -> ifIsUser(sender)
else -> otherwise(sender)
}
}
/**
* 折叠 [AbstractCommandSender] 的两种可能性, 即在群内发送或在私聊环境发送.
* 折叠 [UserCommandSender] 的两种可能性, 即在群内发送或在私聊环境发送.
*
* - [this] [MemberCommandSender] 时执行 [inGroup]
* - [this] [TempCommandSender] [FriendCommandSender] 时执行 [inPrivate]
@ -735,21 +760,6 @@ public open class OtherClientCommandSender internal constructor(
// CommandSenderOnMessage
///////////////////////////////////////////////////////////////////////////
/**
* 代表一个真实 [用户][User] 主动私聊机器人或在群内发送消息而执行指令
*
* @see MemberCommandSenderOnMessage 代表一个真实的 [群员][Member] 主动在群内发送消息执行指令.
* @see FriendCommandSenderOnMessage 代表一个真实的 [好友][Friend] 主动在私聊消息执行指令
* @see TempCommandSenderOnMessage 代表一个 [群员][Member] 主动在临时会话发送消息执行指令
*/
public interface CommandSenderOnMessage<T : MessageEvent> : CommandSender {
/**
* 消息源 [MessageEvent]
*/
public val fromEvent: T
}
/**
* 代表一个真实的 [好友][Friend] 主动在私聊消息执行指令
* @see FriendCommandSender 代表一个 [好友][Friend] 执行指令, 但不一定是通过私聊方式