MessageOrigin.kt 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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:Suppress("MemberVisibilityCanBePrivate", "unused")
  10. package net.mamoe.mirai.message.data
  11. import kotlinx.serialization.Polymorphic
  12. import kotlinx.serialization.SerialName
  13. import kotlinx.serialization.Serializable
  14. import net.mamoe.mirai.IMirai
  15. import net.mamoe.mirai.message.data.visitor.MessageVisitor
  16. import net.mamoe.mirai.utils.MiraiExperimentalApi
  17. import net.mamoe.mirai.utils.MiraiInternalApi
  18. import net.mamoe.mirai.utils.isSameClass
  19. import net.mamoe.mirai.utils.safeCast
  20. /**
  21. * 标识来源 [RichMessage], 存在于接收的 [MessageChain] 中. 在发送消息时会被忽略.
  22. *
  23. * 一些 [RichMessage] 会被 mirai 解析成特定的更易使用的类型, 如:
  24. * - 长消息会被协议内部转化为 [ServiceMessage] `serviceId=35` 通过独立通道上传和下载并获得一个 [resourceId]. mirai 会自动下载长消息并把他们解析为 [MessageChain].
  25. * - 合并转发也使用长消息通道传输, 拥有 [resourceId], mirai 解析为 [ForwardMessage]
  26. * - [MusicShare] 也有特殊通道上传, 但会作为 [LightApp] 接收.
  27. *
  28. * 这些经过转换的类型的来源 [RichMessage] 会被包装为 [MessageOrigin] 并加入消息链中.
  29. *
  30. * 如一条被 mirai 解析的长消息的消息链组成为, 第一个元素为 [MessageSource], 第二个元素为 [MessageOrigin], 随后为长消息内容.
  31. *
  32. * 又如一条被 mirai 解析的 [MusicShare] 的消息链组成为, 第一个元素为 [MessageSource], 第二个元素为 [MessageOrigin], 第三个元素为 [MusicShare].
  33. *
  34. * @suppress **注意**: 这是实验性 API: 可能会在未来任意时刻变更.
  35. *
  36. * @since 2.6
  37. */
  38. @Serializable
  39. @SerialName(MessageOrigin.SERIAL_NAME)
  40. @MiraiExperimentalApi
  41. public class MessageOrigin(
  42. // [2.3, 2.6-M1) 类名为 RichMessageOrigin
  43. /**
  44. * 原 [SingleMessage].
  45. */
  46. public val origin: @Polymorphic SingleMessage,
  47. /**
  48. * 如果来自长消息或转发消息, 则会有 [resourceId], 否则为 `null`.
  49. *
  50. * - 下载长消息 [IMirai.downloadLongMessage]
  51. * - 下载合并转发消息 [IMirai.downloadForwardMessage]
  52. */
  53. public val resourceId: String?,
  54. /**
  55. * 来源类型
  56. */
  57. public val kind: MessageOriginKind,
  58. ) : MessageMetadata, ConstrainSingle {
  59. override val key: Key get() = Key
  60. override fun toString(): String {
  61. val resourceId = resourceId
  62. return if (resourceId == null) "[mirai:origin:$kind]"
  63. else "[mirai:origin:$kind,$resourceId]"
  64. }
  65. override fun contentToString(): String = ""
  66. override fun equals(other: Any?): Boolean {
  67. if (this === other) return true
  68. if (other !is MessageOrigin || !isSameClass(this, other)) return false
  69. if (origin != other.origin) return false
  70. if (resourceId != other.resourceId) return false
  71. if (kind != other.kind) return false
  72. return true
  73. }
  74. override fun hashCode(): Int {
  75. var result = origin.hashCode()
  76. result = 31 * result + (resourceId?.hashCode() ?: 0)
  77. result = 31 * result + kind.hashCode()
  78. return result
  79. }
  80. @MiraiInternalApi
  81. override fun <D, R> accept(visitor: MessageVisitor<D, R>, data: D): R = visitor.visitMessageOrigin(this, data)
  82. public companion object Key : AbstractMessageKey<MessageOrigin>({ it.safeCast() }) {
  83. public const val SERIAL_NAME: String = "MessageOrigin"
  84. }
  85. }
  86. /**
  87. * [MessageOrigin] 来源
  88. * @see MessageOrigin.kind
  89. * @since 2.6
  90. */
  91. @Serializable
  92. public enum class MessageOriginKind { // [2.3, 2.6-M1) 类名为 RichMessageKind
  93. /**
  94. * 长消息
  95. */
  96. LONG,
  97. /**
  98. * 合并转发
  99. * @see ForwardMessage
  100. */
  101. FORWARD,
  102. /**
  103. * 音乐分享
  104. * @see MusicShare
  105. */
  106. MUSIC_SHARE,
  107. }