diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/QQAndroidBot.common.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/QQAndroidBot.common.kt index 4ca95833a..668dbcbbd 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/QQAndroidBot.common.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/QQAndroidBot.common.kt @@ -188,7 +188,7 @@ internal class QQAndroidBot constructor( } } - group.checkBotPermissionOperator() + group.checkBotPermission(MemberPermission.ADMINISTRATOR) } override suspend fun ignoreMemberJoinRequest(event: MemberJoinRequestEvent, blackList: Boolean) { @@ -369,7 +369,7 @@ internal abstract class QQAndroidBotBase constructor( else -> error("stub") } if (this.id != source.fromId) { - group.checkBotPermissionOperator() + group.checkBotPermission(MemberPermission.ADMINISTRATOR) } MessageRecallEvent.GroupRecall( this, diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/GroupImpl.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/GroupImpl.kt index 8a720b51d..912985d75 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/GroupImpl.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/GroupImpl.kt @@ -109,7 +109,8 @@ internal class GroupImpl( override var name: String get() = _name set(newValue) { - checkBotPermissionOperator() + + checkBotPermission(MemberPermission.ADMINISTRATOR) if (_name != newValue) { val oldValue = _name _name = newValue @@ -131,7 +132,7 @@ internal class GroupImpl( override var entranceAnnouncement: String get() = _announcement set(newValue) { - checkBotPermissionOperator() + checkBotPermission(MemberPermission.ADMINISTRATOR) if (_announcement != newValue) { val oldValue = _announcement _announcement = newValue @@ -152,7 +153,7 @@ internal class GroupImpl( override var isAllowMemberInvite: Boolean get() = _allowMemberInvite set(newValue) { - checkBotPermissionOperator() + checkBotPermission(MemberPermission.ADMINISTRATOR) if (_allowMemberInvite != newValue) { val oldValue = _allowMemberInvite _allowMemberInvite = newValue @@ -186,7 +187,8 @@ internal class GroupImpl( override var isConfessTalkEnabled: Boolean get() = _confessTalk set(newValue) { - checkBotPermissionOperator() + + checkBotPermission(MemberPermission.ADMINISTRATOR) if (_confessTalk != newValue) { val oldValue = _confessTalk _confessTalk = newValue @@ -207,7 +209,8 @@ internal class GroupImpl( override var isMuteAll: Boolean get() = _muteAll set(newValue) { - checkBotPermissionOperator() + + checkBotPermission(MemberPermission.ADMINISTRATOR) if (_muteAll != newValue) { val oldValue = _muteAll _muteAll = newValue diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/MemberImpl.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/MemberImpl.kt index 85fbec086..495bb45e1 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/MemberImpl.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/MemberImpl.kt @@ -105,7 +105,7 @@ internal class MemberImpl constructor( get() = _nameCard set(newValue) { if (id != bot.id) { - group.checkBotPermissionOperator() + group.checkBotPermission(MemberPermission.ADMINISTRATOR) } if (_nameCard != newValue) { val oldValue = _nameCard diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/MemberPermission.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/MemberPermission.kt index 80b4d3527..cabefb3b0 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/MemberPermission.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/MemberPermission.kt @@ -7,17 +7,25 @@ * https://github.com/mamoe/mirai/blob/master/LICENSE */ -@file:Suppress("NOTHING_TO_INLINE") +@file:Suppress("NOTHING_TO_INLINE", "INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") package net.mamoe.mirai.contact import net.mamoe.mirai.Bot import net.mamoe.mirai.utils.SinceMirai +import kotlin.internal.InlineOnly /** * 群成员的权限. * * 可通过 [compareTo] 判断是否有更高的权限. + * + * @see isOwner 判断权限是否为群主 + * @see isOperator 判断权限是否为管理员或群主 + * + * @see Member.isOwner 对 [Member] 的扩展函数, 判断此成员是否为群主 + * @see Member.isOperator 对 [Member] 的扩展函数, 判断此成员是否为管理员或群主 + * @see Member.isAdministrator 对 [Member] 的扩展函数, 判断此成员是否为管理员 */ enum class MemberPermission : Comparable { /** @@ -46,16 +54,19 @@ enum class MemberPermission : Comparable { /** * 判断权限是否为群主 */ +@InlineOnly inline fun MemberPermission.isOwner(): Boolean = this == MemberPermission.OWNER /** * 判断权限是否为管理员 */ +@InlineOnly inline fun MemberPermission.isAdministrator(): Boolean = this == MemberPermission.ADMINISTRATOR /** * 判断权限是否为管理员或群主 */ +@InlineOnly inline fun MemberPermission.isOperator(): Boolean = isAdministrator() || isOwner() @@ -85,7 +96,7 @@ class PermissionDeniedException : IllegalStateException { } /** - * 要求 [Bot] 在这个群里的权限为 [required], 否则抛出异常 [PermissionDeniedException] + * 要求 [Bot] 在这个群里的权限至少为 [required], 否则抛出异常 [PermissionDeniedException] * * @throws PermissionDeniedException */ @@ -95,7 +106,7 @@ inline fun Group.checkBotPermission( "Permission denied: required $required, got actual $botPermission for $bot in group $id" } ) { - if (botPermission != required) { + if (botPermission < required) { throw PermissionDeniedException(lazyMessage()) } } @@ -105,12 +116,9 @@ inline fun Group.checkBotPermission( * * @throws PermissionDeniedException */ +@Deprecated("use checkBotPermission", ReplaceWith("checkBotPermission(MemberPermission.ADMINISTRATOR)")) inline fun Group.checkBotPermissionOperator( crossinline lazyMessage: () -> String = { "Permission denied: required ${MemberPermission.ADMINISTRATOR} or ${MemberPermission.OWNER}, got actual $botPermission for $bot in group $id" } -) { - if (!botPermission.isOperator()) { - throw PermissionDeniedException(lazyMessage()) - } -} \ No newline at end of file +) = checkBotPermission(MemberPermission.ADMINISTRATOR, lazyMessage) \ No newline at end of file