MemberPermission.kt 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /*
  2. * Copyright 2019-2020 Mamoe Technologies and contributors.
  3. *
  4. * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
  5. * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
  6. *
  7. * https://github.com/mamoe/mirai/blob/master/LICENSE
  8. */
  9. @file:Suppress("NOTHING_TO_INLINE", "INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
  10. package net.mamoe.mirai.contact
  11. import net.mamoe.mirai.Bot
  12. import kotlin.internal.InlineOnly
  13. /**
  14. * 群成员的权限.
  15. *
  16. * 可通过 [compareTo] 判断是否有更高的权限.
  17. *
  18. * @see isOwner 判断权限是否为群主
  19. * @see isOperator 判断权限是否为管理员或群主
  20. *
  21. * @see Member.isOwner 对 [Member] 的扩展函数, 判断此成员是否为群主
  22. * @see Member.isOperator 对 [Member] 的扩展函数, 判断此成员是否为管理员或群主
  23. * @see Member.isAdministrator 对 [Member] 的扩展函数, 判断此成员是否为管理员
  24. */
  25. public enum class MemberPermission : Comparable<MemberPermission> {
  26. /**
  27. * 一般群成员
  28. */
  29. MEMBER, // ordinal = 0
  30. /**
  31. * 管理员
  32. */
  33. ADMINISTRATOR, // ordinal = 1
  34. /**
  35. * 群主
  36. */
  37. OWNER; // ordinal = 2
  38. /**
  39. * 权限等级. [OWNER] 为 2, [ADMINISTRATOR] 为 1, [MEMBER] 为 0
  40. */
  41. public val level: Int
  42. get() = ordinal
  43. }
  44. /**
  45. * 判断权限是否为群主
  46. */
  47. @InlineOnly
  48. public inline fun MemberPermission.isOwner(): Boolean = this == MemberPermission.OWNER
  49. /**
  50. * 判断权限是否为管理员
  51. */
  52. @InlineOnly
  53. public inline fun MemberPermission.isAdministrator(): Boolean = this == MemberPermission.ADMINISTRATOR
  54. /**
  55. * 判断权限是否为管理员或群主
  56. */
  57. @InlineOnly
  58. public inline fun MemberPermission.isOperator(): Boolean = isAdministrator() || isOwner()
  59. /**
  60. * 判断权限是否为群主
  61. */
  62. public inline fun Member.isOwner(): Boolean = this.permission.isOwner()
  63. /**
  64. * 判断权限是否为管理员
  65. */
  66. public inline fun Member.isAdministrator(): Boolean = this.permission.isAdministrator()
  67. /**
  68. * 判断权限是否为管理员或群主
  69. */
  70. public inline fun Member.isOperator(): Boolean = this.permission.isOperator()
  71. /**
  72. * 权限不足
  73. */
  74. @Suppress("unused")
  75. public class PermissionDeniedException : IllegalStateException {
  76. public constructor() : super("Permission denied")
  77. public constructor(message: String?) : super(message)
  78. }
  79. /**
  80. * 要求 [Bot] 在这个群里的权限至少为 [required], 否则抛出异常 [PermissionDeniedException]
  81. *
  82. * @throws PermissionDeniedException
  83. */
  84. public inline fun Group.checkBotPermission(
  85. required: MemberPermission,
  86. crossinline lazyMessage: () -> String = {
  87. "Permission denied: required $required, got actual $botPermission for $bot in group $id"
  88. }
  89. ) {
  90. if (botPermission < required) {
  91. throw PermissionDeniedException(lazyMessage())
  92. }
  93. }
  94. /**
  95. * 要求 [Bot] 在这个群里的权限为 [管理员或群主][MemberPermission.isOperator], 否则抛出异常 [PermissionDeniedException]
  96. *
  97. * @throws PermissionDeniedException
  98. */
  99. @Deprecated("use checkBotPermission", ReplaceWith("checkBotPermission(MemberPermission.ADMINISTRATOR)"))
  100. public inline fun Group.checkBotPermissionOperator(
  101. crossinline lazyMessage: () -> String = {
  102. "Permission denied: required ${MemberPermission.ADMINISTRATOR} or ${MemberPermission.OWNER}, got actual $botPermission for $bot in group $id"
  103. }
  104. ): Unit = checkBotPermission(MemberPermission.ADMINISTRATOR, lazyMessage)