IMirai.kt 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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("INTERFACE_NOT_SUPPORTED")
  10. @file:JvmName("Mirai")
  11. @file:OptIn(LowLevelApi::class, MiraiExperimentalApi::class, MiraiInternalApi::class)
  12. package net.mamoe.mirai
  13. import net.mamoe.kjbb.JvmBlockingBridge
  14. import net.mamoe.mirai.contact.Contact
  15. import net.mamoe.mirai.contact.Friend
  16. import net.mamoe.mirai.contact.PermissionDeniedException
  17. import net.mamoe.mirai.event.events.BotInvitedJoinGroupRequestEvent
  18. import net.mamoe.mirai.event.events.MemberJoinRequestEvent
  19. import net.mamoe.mirai.event.events.NewFriendRequestEvent
  20. import net.mamoe.mirai.message.MessageReceipt
  21. import net.mamoe.mirai.message.action.Nudge
  22. import net.mamoe.mirai.message.data.*
  23. import net.mamoe.mirai.message.data.Image.Key.queryUrl
  24. import net.mamoe.mirai.message.data.MessageSource.Key.recall
  25. import net.mamoe.mirai.utils.MiraiExperimentalApi
  26. import net.mamoe.mirai.utils.MiraiInternalApi
  27. /**
  28. * [IMirai] 实例
  29. */
  30. @get:JvmName("getInstance") // Java 调用: Mirai.getInstance()
  31. public val Mirai: IMirai by lazy { findMiraiInstance() }
  32. /**
  33. * Mirai API 接口.
  34. *
  35. * @see Mirai
  36. */
  37. public interface IMirai : LowLevelApiAccessor {
  38. @Suppress("PropertyName")
  39. @MiraiExperimentalApi
  40. public val BotFactory: BotFactory
  41. /**
  42. * 使用 groupCode 计算 groupUin. 这两个值仅在 mirai 内部协议区分, 一般人使用时无需在意.
  43. */
  44. public fun calculateGroupUinByGroupCode(groupCode: Long): Long {
  45. var left: Long = groupCode / 1000000L
  46. when (left) {
  47. in 0..10 -> left += 202
  48. in 11..19 -> left += 480 - 11
  49. in 20..66 -> left += 2100 - 20
  50. in 67..156 -> left += 2010 - 67
  51. in 157..209 -> left += 2147 - 157
  52. in 210..309 -> left += 4100 - 210
  53. in 310..499 -> left += 3800 - 310
  54. }
  55. return left * 1000000L + groupCode % 1000000L
  56. }
  57. /**
  58. * 使用 groupUin 计算 groupCode. 这两个值仅在 mirai 内部协议区分, 一般人使用时无需在意.
  59. */
  60. public fun calculateGroupCodeByGroupUin(groupUin: Long): Long {
  61. var left: Long = groupUin / 1000000L
  62. when (left) {
  63. in 0 + 202..10 + 202 -> left -= 202
  64. in 11 + 480 - 11..19 + 480 - 11 -> left -= 480 - 11
  65. in 20 + 2100 - 20..66 + 2100 - 20 -> left -= 2100 - 20
  66. in 67 + 2010 - 67..156 + 2010 - 67 -> left -= 2010 - 67
  67. in 157 + 2147 - 157..209 + 2147 - 157 -> left -= 2147 - 157
  68. in 210 + 4100 - 210..309 + 4100 - 210 -> left -= 4100 - 210
  69. in 310 + 3800 - 310..499 + 3800 - 310 -> left -= 3800 - 310
  70. }
  71. return left * 1000000L + groupUin % 1000000L
  72. }
  73. /**
  74. * 撤回这条消息. 可撤回自己 2 分钟内发出的消息, 和任意时间的群成员的消息.
  75. *
  76. * [Bot] 撤回自己的消息不需要权限.
  77. * [Bot] 撤回群员的消息需要管理员权限.
  78. *
  79. * @param source 消息源. 可从 [MessageReceipt.source] 获得, 或从消息事件中的 [MessageChain] 获得, 或通过 [buildMessageSource] 构建.
  80. *
  81. * @throws PermissionDeniedException 当 [Bot] 无权限操作时抛出
  82. * @throws IllegalStateException 当这条消息已经被撤回时抛出 (仅同步主动操作)
  83. *
  84. * @see IMirai.recallMessage (扩展函数) 接受参数 [MessageChain]
  85. * @see MessageSource.recall 撤回消息扩展
  86. */
  87. @JvmBlockingBridge
  88. public suspend fun recallMessage(bot: Bot, source: MessageSource)
  89. @JvmBlockingBridge
  90. public suspend fun sendNudge(bot: Bot, nudge: Nudge, receiver: Contact): Boolean
  91. public fun createImage(imageId: String): Image
  92. /**
  93. * 获取图片下载链接
  94. *
  95. * @see Image.queryUrl [Image] 的扩展函数
  96. */
  97. @JvmBlockingBridge
  98. public suspend fun queryImageUrl(bot: Bot, image: Image): String
  99. /**
  100. * 构造一个 [OfflineMessageSource]
  101. *
  102. * @param ids 即 [MessageSource.ids]
  103. * @param internalIds 即 [MessageSource.internalIds]
  104. *
  105. * @param fromUin 为用户时为 [Friend.id], 为群时需使用 [IMirai.calculateGroupUinByGroupCode] 计算
  106. * @param targetUin 为用户时为 [Friend.id], 为群时需使用 [IMirai.calculateGroupUinByGroupCode] 计算
  107. */
  108. @MiraiExperimentalApi("This is very experimental and is subject to change.")
  109. public fun constructMessageSource(
  110. botId: Long,
  111. kind: MessageSourceKind,
  112. fromUin: Long, targetUin: Long,
  113. ids: IntArray, time: Int, internalIds: IntArray,
  114. originalMessage: MessageChain
  115. ): OfflineMessageSource
  116. /**
  117. * 通过好友验证
  118. *
  119. * @param event 好友验证的事件对象
  120. */
  121. @JvmBlockingBridge
  122. public suspend fun acceptNewFriendRequest(event: NewFriendRequestEvent)
  123. /**
  124. * 拒绝好友验证
  125. *
  126. * @param event 好友验证的事件对象
  127. * @param blackList 拒绝后是否拉入黑名单
  128. */
  129. @JvmBlockingBridge
  130. public suspend fun rejectNewFriendRequest(event: NewFriendRequestEvent, blackList: Boolean = false)
  131. /**
  132. * 通过加群验证(需管理员权限)
  133. *
  134. * @param event 加群验证的事件对象
  135. */
  136. @JvmBlockingBridge
  137. public suspend fun acceptMemberJoinRequest(event: MemberJoinRequestEvent)
  138. /**
  139. * 拒绝加群验证(需管理员权限)
  140. *
  141. * @param event 加群验证的事件对象
  142. * @param blackList 拒绝后是否拉入黑名单
  143. */
  144. @JvmBlockingBridge
  145. public suspend fun rejectMemberJoinRequest(
  146. event: MemberJoinRequestEvent,
  147. blackList: Boolean = false,
  148. message: String = ""
  149. )
  150. /**
  151. * 忽略加群验证(需管理员权限)
  152. *
  153. * @param event 加群验证的事件对象
  154. * @param blackList 忽略后是否拉入黑名单
  155. */
  156. @JvmBlockingBridge
  157. public suspend fun ignoreMemberJoinRequest(event: MemberJoinRequestEvent, blackList: Boolean = false)
  158. /**
  159. * 接收邀请入群(需管理员权限)
  160. *
  161. * @param event 邀请入群的事件对象
  162. */
  163. @JvmBlockingBridge
  164. public suspend fun acceptInvitedJoinGroupRequest(event: BotInvitedJoinGroupRequestEvent)
  165. /**
  166. * 忽略邀请入群(需管理员权限)
  167. *
  168. * @param event 邀请入群的事件对象
  169. */
  170. @JvmBlockingBridge
  171. public suspend fun ignoreInvitedJoinGroupRequest(event: BotInvitedJoinGroupRequestEvent)
  172. }
  173. /**
  174. * 撤回这条消息.
  175. *
  176. * [Bot] 撤回自己的消息不需要权限, 但需要在发出后 2 分钟内撤回.
  177. * [Bot] 撤回群员的消息需要管理员权限, 可在任意时间撤回.
  178. *
  179. * @throws PermissionDeniedException 当 [Bot] 无权限操作时
  180. * @see IMirai.recallMessage
  181. */
  182. @JvmSynthetic
  183. public suspend inline fun IMirai.recallMessage(bot: Bot, message: MessageChain): Unit =
  184. this.recallMessage(bot, message.source)
  185. @JvmSynthetic
  186. internal expect fun findMiraiInstance(): IMirai