MessageEvent.kt 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. /*
  2. * Copyright 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:JvmMultifileClass
  10. @file:JvmName("BotEventsKt")
  11. package net.mamoe.mirai.event.events
  12. import net.mamoe.mirai.Bot
  13. import net.mamoe.mirai.contact.*
  14. import net.mamoe.mirai.event.AbstractEvent
  15. import net.mamoe.mirai.event.Event
  16. import net.mamoe.mirai.internal.network.Packet
  17. import net.mamoe.mirai.message.data.MessageChain
  18. import net.mamoe.mirai.message.data.MessageSource
  19. import net.mamoe.mirai.message.data.OnlineMessageSource
  20. import net.mamoe.mirai.message.data.source
  21. import net.mamoe.mirai.message.isContextIdenticalWith
  22. import net.mamoe.mirai.utils.DeprecatedSinceMirai
  23. import net.mamoe.mirai.utils.MiraiInternalApi
  24. import kotlin.jvm.JvmMultifileClass
  25. import kotlin.jvm.JvmName
  26. /**
  27. * 一个消息事件.
  28. *
  29. * @see isContextIdenticalWith 判断语境相同
  30. */
  31. public sealed interface MessageEvent : Event, Packet, BotPassiveEvent {
  32. /**
  33. * 与这个消息事件相关的 [Bot]
  34. */
  35. public override val bot: Bot
  36. /**
  37. * 消息事件主体.
  38. *
  39. * - 对于私聊会话, 这个属性与 [sender] 相同;
  40. * - 对于群消息, 这个属性为 [Group] 的实例, 与 [GroupMessageEvent.group] 相同.
  41. *
  42. * 如果在 [GroupMessageEvent] 对 [sender] 发送消息, 将会通过私聊发送给群员, 而不会发送在群内.
  43. * 使用 [subject] 作为消息目标则可以确保消息发送到用户所在的场景.
  44. *
  45. * 在回复消息时, 可通过 [subject] 作为回复对象.
  46. */
  47. public val subject: Contact
  48. /**
  49. * 发送人.
  50. *
  51. * 在私聊消息时为相关 [User] 的实例, 在群消息时为 [Member] 的实例, 在其他客户端消息时为 [Bot.asFriend]
  52. */
  53. public val sender: User
  54. /**
  55. * 发送人名称. 由群员发送时为群员名片, 由好友发送时为好友昵称. 使用 [User.nameCardOrNick] 也能得到相同的结果.
  56. */
  57. public val senderName: String
  58. /**
  59. * 消息内容.
  60. *
  61. * 返回的消息链中一定包含 [MessageSource], 存储此消息的发送人, 发送时间, 收信人, 消息 ids 等数据. 随后的元素为拥有顺序的真实消息内容.
  62. *
  63. * 详细查看 [MessageChain]
  64. */
  65. public val message: MessageChain
  66. /** 消息发送时间戳, 单位为秒. 由服务器提供, 可能与本地有时差. */
  67. public val time: Int
  68. /**
  69. * 消息源. 来自 [message]. 相当于对 [message] 以 [MessageSource] 参数调用 [MessageChain.get].
  70. */
  71. public val source: OnlineMessageSource.Incoming get() = message.source as OnlineMessageSource.Incoming
  72. }
  73. /**
  74. * 来自 [User] 的消息
  75. *
  76. * @see FriendMessageEvent
  77. * @see GroupTempMessageEvent
  78. */
  79. public sealed interface UserMessageEvent : MessageEvent {
  80. public override val subject: User
  81. }
  82. /**
  83. * 机器人收到的好友消息的事件
  84. *
  85. * @see MessageEvent
  86. */
  87. public class FriendMessageEvent constructor(
  88. public override val sender: Friend,
  89. public override val message: MessageChain,
  90. public override val time: Int
  91. ) : AbstractMessageEvent(), UserMessageEvent, FriendEvent {
  92. init {
  93. val source =
  94. message[MessageSource] ?: throw IllegalArgumentException("Cannot find MessageSource from message")
  95. check(source is OnlineMessageSource.Incoming.FromFriend) { "source provided to a FriendMessageEvent must be an instance of OnlineMessageSource.Incoming.FromFriend" }
  96. }
  97. public override val friend: Friend get() = sender
  98. public override val bot: Bot get() = super.bot
  99. public override val subject: Friend get() = sender
  100. public override val senderName: String get() = sender.nick
  101. public override val source: OnlineMessageSource.Incoming.FromFriend get() = message.source as OnlineMessageSource.Incoming.FromFriend
  102. public override fun toString(): String = "FriendMessageEvent(sender=${sender.id}, message=$message)"
  103. }
  104. /**
  105. * 机器人收到的其他客户端消息的事件
  106. *
  107. * @see MessageEvent
  108. */
  109. public class OtherClientMessageEvent constructor(
  110. public override val client: OtherClient,
  111. public override val message: MessageChain,
  112. public override val time: Int
  113. ) : AbstractMessageEvent(), MessageEvent, OtherClientEvent {
  114. init {
  115. val source =
  116. message[MessageSource] ?: throw IllegalArgumentException("Cannot find MessageSource from message")
  117. check(source is OnlineMessageSource.Incoming.FromFriend) { "source provided to a OtherClientMessageEvent must be an instance of OnlineMessageSource.Incoming.FromFriend" }
  118. }
  119. public override val sender: User get() = client.bot.asFriend
  120. public override val bot: Bot get() = super.bot
  121. public override val subject: OtherClient get() = client
  122. public override val senderName: String get() = sender.nick
  123. /**
  124. * 为简化处理, 其他客户端消息的 [MessageSource] 被作为 [OnlineMessageSource.Incoming.FromFriend].
  125. */
  126. public override val source: OnlineMessageSource.Incoming.FromFriend get() = message.source as OnlineMessageSource.Incoming.FromFriend
  127. public override fun toString(): String = "OtherClientMessageEvent(client=${client.platform}, message=$message)"
  128. }
  129. /**
  130. * 来自一个可以知道其 [Group] 的用户消息
  131. *
  132. * @see FriendMessageEvent
  133. * @see GroupTempMessageEvent
  134. */
  135. public sealed interface GroupAwareMessageEvent : MessageEvent {
  136. public val group: Group
  137. }
  138. /**
  139. * 机器人收到的群消息的事件
  140. *
  141. * @see MessageEvent
  142. */
  143. public class GroupMessageEvent(
  144. public override val senderName: String,
  145. /**
  146. * 发送方权限.
  147. */
  148. public val permission: MemberPermission,
  149. /**
  150. * 发送人. 可能是 [NormalMember] 或 [AnonymousMember]
  151. */
  152. public override val sender: Member,
  153. public override val message: MessageChain,
  154. public override val time: Int
  155. ) : AbstractMessageEvent(), GroupAwareMessageEvent, MessageEvent, GroupEvent {
  156. init {
  157. val source = message[MessageSource] ?: error("Cannot find MessageSource from message")
  158. check(source is OnlineMessageSource.Incoming.FromGroup) { "source provided to a GroupMessageEvent must be an instance of OnlineMessageSource.Incoming.FromGroup" }
  159. }
  160. public override val group: Group get() = sender.group
  161. public override val bot: Bot get() = sender.bot
  162. public override val subject: Group get() = group
  163. public override val source: OnlineMessageSource.Incoming.FromGroup get() = message.source as OnlineMessageSource.Incoming.FromGroup
  164. public override fun toString(): String =
  165. "GroupMessageEvent(group=${group.id}, senderName=$senderName, sender=${sender.id}, permission=${permission.name}, message=$message)"
  166. }
  167. /**
  168. * 机器人收到的群临时会话消息的事件
  169. *
  170. * @see MessageEvent
  171. */
  172. @Deprecated(
  173. "mirai 正计划支持其他渠道发起的临时会话, 届时此事件会变动. 原 TempMessageEvent 已更改为 GroupTempMessageEvent",
  174. replaceWith = ReplaceWith("GroupTempMessageEvent", "net.mamoe.mirai.event.events.GroupTempMessageEvent"),
  175. DeprecationLevel.HIDDEN
  176. )
  177. @DeprecatedSinceMirai(hiddenSince = "2.0") // maybe 2.0
  178. public sealed class TempMessageEvent constructor(
  179. public override val sender: NormalMember,
  180. public override val message: MessageChain,
  181. public override val time: Int
  182. ) : AbstractMessageEvent(), GroupAwareMessageEvent, UserMessageEvent
  183. // support by mirai 2.1
  184. //
  185. //public class UserTempMessageEvent(
  186. // sender: TempUser,
  187. // message: MessageChain,
  188. // time: Int
  189. //) : @Suppress("DEPRECATION_ERROR") TempMessageEvent(sender, message, time), GroupAwareMessageEvent, UserMessageEvent {
  190. //}
  191. /**
  192. * 群临时会话消息
  193. */
  194. public class GroupTempMessageEvent(
  195. public override val sender: NormalMember,
  196. public override val message: MessageChain,
  197. public override val time: Int
  198. ) : @Suppress("DEPRECATION_ERROR") TempMessageEvent(sender, message, time), GroupAwareMessageEvent, UserMessageEvent {
  199. init {
  200. val source = message[MessageSource] ?: error("Cannot find MessageSource from message")
  201. check(source is OnlineMessageSource.Incoming.FromTemp) { "source provided to a GroupTempMessageEvent must be an instance of OnlineMessageSource.Incoming.FromTemp" }
  202. }
  203. public override val bot: Bot get() = sender.bot
  204. public override val subject: NormalMember get() = sender
  205. public override val group: Group get() = sender.group
  206. public override val senderName: String get() = sender.nameCardOrNick
  207. public override val source: OnlineMessageSource.Incoming.FromTemp get() = message.source as OnlineMessageSource.Incoming.FromTemp
  208. public override fun toString(): String =
  209. "GroupTempMessageEvent(sender=${sender.id} from group(${sender.group.id}), message=$message)"
  210. }
  211. /**
  212. * 机器人收到的陌生人消息的事件
  213. *
  214. * @see MessageEvent
  215. */
  216. public class StrangerMessageEvent constructor(
  217. public override val sender: Stranger,
  218. public override val message: MessageChain,
  219. public override val time: Int
  220. ) : AbstractMessageEvent(), UserMessageEvent, StrangerEvent {
  221. init {
  222. val source =
  223. message[MessageSource] ?: throw IllegalArgumentException("Cannot find MessageSource from message")
  224. check(source is OnlineMessageSource.Incoming.FromStranger) { "source provided to a StrangerMessageEvent must be an instance of OnlineMessageSource.Incoming.FromStranger" }
  225. }
  226. public override val stranger: Stranger get() = sender
  227. public override val bot: Bot get() = super.bot
  228. public override val subject: Stranger get() = sender
  229. public override val senderName: String get() = sender.nick
  230. public override val source: OnlineMessageSource.Incoming.FromStranger get() = message.source as OnlineMessageSource.Incoming.FromStranger
  231. public override fun toString(): String = "StrangerMessageEvent(sender=${sender.id}, message=$message)"
  232. }
  233. /**
  234. * 消息事件的公共抽象父类, 保留将来使用. 这是内部 API, 请不要使用.
  235. */
  236. @MiraiInternalApi
  237. public abstract class AbstractMessageEvent : MessageEvent, AbstractEvent()