From 0b957d64759a99f80d80671c466f0df2204ffe4b Mon Sep 17 00:00:00 2001 From: Him188 Date: Tue, 12 Jan 2021 17:31:10 +0800 Subject: [PATCH] Update permitteeIds to new temp user structure --- .../src/command/CommandSender.kt | 4 +- .../permission/parseFromStringImpl.kt | 10 +- .../src/permission/PermitteeId.kt | 103 +++++++++--------- docs/Permissions.md | 38 ++++--- .../src/ConsoleThread.kt | 4 +- tools/gradle-plugin/src/VersionConstants.kt | 4 +- 6 files changed, 88 insertions(+), 75 deletions(-) diff --git a/backend/mirai-console/src/command/CommandSender.kt b/backend/mirai-console/src/command/CommandSender.kt index 47974e371..d159a62c3 100644 --- a/backend/mirai-console/src/command/CommandSender.kt +++ b/backend/mirai-console/src/command/CommandSender.kt @@ -605,7 +605,7 @@ public open class GroupTempCommandSender internal constructor( public override fun toString(): String = "GroupTempCommandSender($user)" public override val permitteeId: PermitteeId = - AbstractPermitteeId.ExactTemp(user.group.id, user.id) + AbstractPermitteeId.ExactGroupTemp(user.group.id, user.id) @JvmBlockingBridge public override suspend fun sendMessage(message: String): MessageReceipt = sendMessage(PlainText(message)) @@ -646,7 +646,7 @@ public open class OtherClientCommandSender internal constructor( public override val subject: Friend get() = user public override fun toString(): String = "OtherClientCommandSender($user)" - public override val permitteeId: PermitteeId = AbstractPermitteeId.ExactStranger(user.id) + public override val permitteeId: PermitteeId = AbstractPermitteeId.AnyOtherClient @JvmBlockingBridge public override suspend fun sendMessage(message: String): MessageReceipt = sendMessage(PlainText(message)) diff --git a/backend/mirai-console/src/internal/permission/parseFromStringImpl.kt b/backend/mirai-console/src/internal/permission/parseFromStringImpl.kt index fd1fb8a2e..d1748d6e5 100644 --- a/backend/mirai-console/src/internal/permission/parseFromStringImpl.kt +++ b/backend/mirai-console/src/internal/permission/parseFromStringImpl.kt @@ -18,6 +18,7 @@ internal fun parseFromStringImpl(string: String): AbstractPermitteeId { val str = string.trim { it.isWhitespace() }.toLowerCase() if (str == "*") return AnyContact if (str == "console") return Console + if (str == "client*") return AnyOtherClient if (str.isNotEmpty()) { when (str[0]) { 'g' -> { @@ -35,6 +36,11 @@ internal fun parseFromStringImpl(string: String): AbstractPermitteeId { if (arg == "*") return AnyUser else arg.toLongOrNull()?.let(::ExactUser)?.let { return it } } + 's' -> { + val arg = str.substring(1) + if (arg == "*") return AnyStranger + else arg.toLongOrNull()?.let(::ExactStranger)?.let { return it } + } 'c' -> { val arg = str.substring(1) if (arg == "*") return AnyContact @@ -65,10 +71,10 @@ internal fun parseFromStringImpl(string: String): AbstractPermitteeId { if (components.size == 2) { val groupId = components[0].toLongOrNull() ?: return@run - if (components[1] == "*") return AnyTemp(groupId) + if (components[1] == "*") return AnyGroupTemp(groupId) else { val memberId = components[1].toLongOrNull() ?: return@run - return ExactTemp(groupId, memberId) + return ExactGroupTemp(groupId, memberId) } } } diff --git a/backend/mirai-console/src/permission/PermitteeId.kt b/backend/mirai-console/src/permission/PermitteeId.kt index 7659ee0f5..6112494d6 100644 --- a/backend/mirai-console/src/permission/PermitteeId.kt +++ b/backend/mirai-console/src/permission/PermitteeId.kt @@ -20,6 +20,7 @@ import net.mamoe.mirai.console.internal.permission.parseFromStringImpl import net.mamoe.mirai.console.permission.AbstractPermitteeId.* import net.mamoe.mirai.console.util.ConsoleExperimentalApi import net.mamoe.mirai.contact.* +import net.mamoe.mirai.utils.MiraiExperimentalApi /** * [被许可人][Permittee] 的标识符 @@ -92,11 +93,26 @@ public interface PermitteeId { get() = ExactGroup(id) /** - * 创建 [AbstractPermitteeId.ExactTemp] + * 创建 [AbstractPermitteeId.ExactGroupTemp] */ @get:JvmSynthetic - public val Member.permitteeIdOnTemp: ExactTemp - get() = ExactTemp(group.id, id) + public val Member.permitteeIdOnTemp: ExactGroupTemp + get() = ExactGroupTemp(group.id, id) + + /** + * 创建 [AbstractPermitteeId.ExactStranger] + */ + @get:JvmSynthetic + public val Stranger.permitteeId: ExactStranger + get() = ExactStranger(id) + + /** + * 创建 [AbstractPermitteeId.ExactStranger] + */ + @MiraiExperimentalApi + @get:JvmSynthetic + public inline val OtherClient.permitteeId: AnyOtherClient + get() = AnyOtherClient } } @@ -111,24 +127,7 @@ public interface PermitteeId { * * (不区分大小写. 不区分 Bot). * - * - * | 被许可人类型 | 字符串表示示例 | 备注 | - * |:----------------:|:-----------:|:-------------------------------------| - * | 控制台 | console | | - * | 精确群 | g123456 | 表示群, 而不表示群成员 | - * | 精确好友 | f123456 | 必须通过好友消息 | - * | 精确临时会话 | t123456.789 | 群 123456 内的成员 789. 必须通过临时会话 | - * | 精确群成员 | m123456.789 | 群 123456 内的成员 789. 同时包含临时会话. | - * | 精确用户 | u123456 | 同时包含群成员, 好友, 临时会话 | - * | 任意群 | g* | | - * | 任意群的任意群员 | m* | | - * | 精确群的任意群员 | m123456.* | 群 123456 内的任意成员. 同时包含临时会话. | - * | 任意群的任意临时会话 | t* | 必须通过临时会话 | - * | 精确群的任意临时会话 | t123456.* | 群 123456 内的任意成员. 必须通过临时会话 | - * | 任意好友 | f* | | - * | 任意用户 | u* | 任何人在任何环境 | - * | 任意对象 | * | 即任何人, 任何群, 控制台 | - * + * [查看字符串表示列表](https://github.com/mamoe/mirai-console/docs/Permissions.md#字符串表示) * * #### 关系图 * @@ -273,6 +272,15 @@ public sealed class AbstractPermitteeId( override fun asString(): String = "f$id" } + @Deprecated( + "use AnyGroupTemp", + ReplaceWith("AnyGroupTemp", "net.mamoe.mirai.console.permission.AbstractPermitteeId.AnyGroupTemp"), + DeprecationLevel.ERROR + ) + public abstract class AnyTemp( + groupId: Long, + ) : AbstractPermitteeId(AnyMember(groupId), AnyTempFromAnyGroup) + /** * 表示任何一个通过一个群 *在临时会话发送消息的* [群成员][Member] * @@ -280,9 +288,9 @@ public sealed class AbstractPermitteeId( * - **间接父标识符**: [AnyMemberFromAnyGroup], [AnyUser], [AnyContact] * - 字符串表示: "t$groupId.*" */ - public data class AnyTemp( + public data class AnyGroupTemp( public val groupId: Long, - ) : AbstractPermitteeId(AnyMember(groupId), AnyTempFromAnyGroup) { + ) : @Suppress("DEPRECATION_ERROR") AnyTemp(groupId) { override fun asString(): String = "t$groupId.*" } @@ -297,6 +305,16 @@ public sealed class AbstractPermitteeId( override fun asString(): String = "t*" } + @Deprecated( + "use ExactGroupTemp", + ReplaceWith("ExactGroupTemp", "net.mamoe.mirai.console.permission.AbstractPermitteeId.ExactGroupTemp"), + DeprecationLevel.ERROR + ) + public abstract class ExactTemp internal constructor( + groupId: Long, + memberId: Long, + ) : AbstractPermitteeId(ExactMember(groupId, memberId)) + /** * 表示唯一的一个 *在临时会话发送消息的* [群成员][Member] * @@ -304,10 +322,10 @@ public sealed class AbstractPermitteeId( * - **间接父标识符**: [AnyUser], [AnyMember], [ExactUser], [AnyContact], [AnyMemberFromAnyGroup] * - 字符串表示: "t$groupId.$memberId" */ - public data class ExactTemp( + public data class ExactGroupTemp( public val groupId: Long, public val memberId: Long, - ) : AbstractPermitteeId(ExactMember(groupId, memberId)) { + ) : @Suppress("DEPRECATION_ERROR") ExactTemp(groupId, memberId) { override fun asString(): String = "t$groupId.$memberId" } @@ -324,19 +342,6 @@ public sealed class AbstractPermitteeId( override fun asString(): String = "s$id" } - /** - * 表示唯一的一个 [其他客户端][OtherClient] - * - * - **直接父标识符**: [AnyOtherClient] - * - **间接父标识符**: [AnyContact] - * - 字符串表示: "o$id" - */ - public data class ExactOtherClient( - public val id: Long, - ) : AbstractPermitteeId(AnyOtherClient) { - override fun asString(): String = "o$id" - } - /** * 表示任何 [用户][User] @@ -360,17 +365,6 @@ public sealed class AbstractPermitteeId( override fun asString(): String = "s*" } - /** - * 表示任何 [其他客户端][OtherClient] - * - * - **直接父标识符**: [AnyContact] - * - **间接父标识符**: 无 - * - 字符串表示: "o*" - */ - public object AnyOtherClient : AbstractPermitteeId(AnyContact) { - override fun asString(): String = "o*" - } - /** * 表示精确 [用户][User] * @@ -405,4 +399,15 @@ public sealed class AbstractPermitteeId( public object Console : AbstractPermitteeId() { override fun asString(): String = "console" } + + /** + * 表示任何其他客户端 + * + * - **直接父标识符**: [AnyContact] + * - **间接父标识符**: 无 + * - 字符串表示: "client*" + */ + public object AnyOtherClient : AbstractPermitteeId(AnyContact) { + override fun asString(): String = "client*" + } } \ No newline at end of file diff --git a/docs/Permissions.md b/docs/Permissions.md index 170dfe3a9..3b4e375e3 100644 --- a/docs/Permissions.md +++ b/docs/Permissions.md @@ -113,27 +113,29 @@ interface PermitteeId { 当使用 `PermitteeId.asString` 时, 不同的类型的返回值如下表所示. 这些格式也适用于 [权限指令](#使用内置权限服务指令). (不区分大小写. 不区分 Bot). -| 被许可人类型 | 字符串表示示例 | 备注 | -|:----------------:|:-----------:|:-------------------------------------| -| 控制台 | console | | -| 精确群 | g123456 | 表示群, 而不表示群成员 | -| 精确好友 | f123456 | 必须通过好友消息 | -| 精确临时会话 | t123456.789 | 群 123456 内的成员 789. 必须通过临时会话 | -| 精确群成员 | m123456.789 | 群 123456 内的成员 789. 同时包含临时会话. | -| 精确用户 | u123456 | 同时包含群成员, 好友, 临时会话 | -| 任意群 | g\* | g 意为 group | -| 任意群的任意群员 | m\* | m 意为 member | -| 精确群的任意群员 | m123456.\* | 群 123456 内的任意成员. 同时包含临时会话. | -| 任意群的任意临时会话 | t\* | t 意为 temp. 必须通过临时会话 | -| 精确群的任意临时会话 | t123456.\* | 群 123456 内的任意成员. 必须通过临时会话 | -| 任意好友 | f\* | f 意为 friend | -| 任意用户 | u\* | u 意为 user. 任何人在任何环境 | -| 任意对象 | \* | 即任何人, 任何群, 控制台 | +| 被许可人类型 | 字符串表示示例 | 备注 | +|:----------------:|:-----------:|:------------------------------------| +| 控制台 | console | | +| 任意其他客户端 | client* | 即 Bot 自己发消息给自己 | +| 精确群 | g123456 | 表示群, 而不表示群成员 | +| 精确好友 | f123456 | 必须通过好友消息 | +| 精确群临时会话 | t123456.789 | 群 123456 内的成员 789. 必须通过临时会话 | +| 精确群成员 | m123456.789 | 群 123456 内的成员 789. 同时包含临时会话 | +| 精确用户 | u123456 | 同时包含群成员, 好友, 临时会话 | +| 任意群 | g\* | g 意为 group | +| 任意群的任意群员 | m\* | m 意为 member | +| 精确群的任意群员 | m123456.\* | 群 123456 内的任意成员. 同时包含临时会话 | +| 任意临时会话 | t\* | t 意为 temp. 必须通过临时会话 | +| 精确群的任意临时会话 | t123456.\* | 群 123456 内的任意成员. 必须通过临时会话 | +| 任意好友 | f\* | f 意为 friend | +| 任意用户 | u\* | u 意为 user. 任何人在任何环境 | +| 任意陌生人 | s\* | s 意为 stranger. 任何人在任何环境 | +| 任意联系对象 | \* | 即任何人, 任何群. 不包括控制台 | ### 获取被许可人 -通常使用 `CommandSender.permitteeId`。 -也可以直接构造 [`AbstractPermitteeId`] 的子类。或者在 Kotlin 使用扩展 `User.permitteeId` +在 Kotlin 通常使用 `CommandSender.permitteeId`,在 Java 使用 `CommandSender.getPermitteeId( )`。 +也可以直接构造 [`AbstractPermitteeId`] 的子类。或者在 Kotlin 使用扩展 `User.permitteeId`。 ## 权限服务 diff --git a/frontend/mirai-console-terminal/src/ConsoleThread.kt b/frontend/mirai-console-terminal/src/ConsoleThread.kt index 76040ce96..3d82ac5cb 100644 --- a/frontend/mirai-console-terminal/src/ConsoleThread.kt +++ b/frontend/mirai-console-terminal/src/ConsoleThread.kt @@ -171,8 +171,8 @@ internal fun CommandReceiverParameter<*>.renderAsName(): String { classifier.isSubclassOf(FriendCommandSender::class) -> "好友" classifier.isSubclassOf(MemberCommandSenderOnMessage::class) -> "群内发言" classifier.isSubclassOf(MemberCommandSender::class) -> "群成员" - classifier.isSubclassOf(TempCommandSenderOnMessage::class) -> "临时会话" - classifier.isSubclassOf(TempCommandSender::class) -> "临时好友" + classifier.isSubclassOf(GroupTempCommandSenderOnMessage::class) -> "群临时会话" + classifier.isSubclassOf(GroupTempCommandSender::class) -> "群临时好友" classifier.isSubclassOf(UserCommandSender::class) -> "用户" else -> classifier.simpleName ?: classifier.toString() } diff --git a/tools/gradle-plugin/src/VersionConstants.kt b/tools/gradle-plugin/src/VersionConstants.kt index 502bc67b3..7139ec724 100644 --- a/tools/gradle-plugin/src/VersionConstants.kt +++ b/tools/gradle-plugin/src/VersionConstants.kt @@ -10,6 +10,6 @@ package net.mamoe.mirai.console.gradle internal object VersionConstants { - const val CONSOLE_VERSION = "2.0-RC-dev-1" // value is written here automatically during build - const val CORE_VERSION = "2.0-RC-dev-8" // value is written here automatically during build + const val CONSOLE_VERSION = "2.0-RC-dev-2" // value is written here automatically during build + const val CORE_VERSION = "2.0-RC-dev-9" // value is written here automatically during build } \ No newline at end of file