MessageSourceInternal.kt 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. package net.mamoe.mirai.internal.message
  10. import kotlinx.serialization.Transient
  11. import net.mamoe.mirai.contact.Contact
  12. import net.mamoe.mirai.internal.contact.SendMessageHandler
  13. import net.mamoe.mirai.internal.message.LightMessageRefiner.dropMiraiInternalFlags
  14. import net.mamoe.mirai.internal.message.LightMessageRefiner.refineLight
  15. import net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody
  16. import net.mamoe.mirai.message.MessageReceipt
  17. import net.mamoe.mirai.message.data.*
  18. import java.util.concurrent.atomic.AtomicBoolean
  19. /**
  20. * All [MessageSource] should implement this interface.
  21. */
  22. internal interface MessageSourceInternal {
  23. @Transient
  24. val sequenceIds: IntArray // ids
  25. @Transient
  26. val internalIds: IntArray // randomId
  27. @Deprecated("don't use this internally. Use sequenceId or random instead.", level = DeprecationLevel.ERROR)
  28. @Transient
  29. val ids: IntArray
  30. @Transient
  31. val isRecalledOrPlanned: AtomicBoolean
  32. fun toJceData(): ImMsgBody.SourceMsg
  33. }
  34. /**
  35. * All [OnlineMessageSource.Outgoing] should implement this interface.
  36. */
  37. internal interface OutgoingMessageSourceInternal : MessageSourceInternal {
  38. // #1371:
  39. // 问题是 `build` 得到的 `ForwardMessage` 会在 `transformSpecialMessages`
  40. // 时上传并变成 `ForwardMessageInternal` 再传递给 factory 发送, 并以这个 internal 结果构造了 receipt.
  41. // 于是构造 receipt 后会进行 light refine 并更新这个属性.
  42. /**
  43. * This 'overrides' [MessageSource.originalMessage].
  44. *
  45. * @see SendMessageHandler.sendMessagePacket
  46. */
  47. var originalMessage: MessageChain
  48. }
  49. /**
  50. * All [OnlineMessageSource.Incoming] should implement this interface.
  51. *
  52. */
  53. internal interface IncomingMessageSourceInternal : MessageSourceInternal {
  54. // #1532, #1289
  55. // 问题描述: 解析 Incoming 时存在中间元素 (如 ForwardMessageInternal) 等,
  56. // MessageChain.source.originMessage 中可能因为各种原因而存在这些中间元素
  57. // 于是在广播 MessageEvent 前将 originalMessage 改成 refined 后的 MessageChain
  58. var originalMessageLazy: Lazy<MessageChain>
  59. }
  60. @Suppress("DEPRECATION_ERROR")
  61. internal fun <C : Contact> OnlineMessageSource.Outgoing.createMessageReceipt(
  62. target: C,
  63. doLightRefine: Boolean,
  64. ): MessageReceipt<C> {
  65. if (doLightRefine) {
  66. check(this is OutgoingMessageSourceInternal) { "Internal error: source !is OutgoingMessageSourceInternal" }
  67. this.originalMessage = this.originalMessage
  68. .dropMiraiInternalFlags()
  69. .refineLight(bot)
  70. }
  71. return MessageReceipt(this, target)
  72. }
  73. @Suppress("RedundantSuspendModifier", "unused")
  74. internal suspend fun MessageSource.ensureSequenceIdAvailable() {
  75. if (this is OnlineMessageSourceToGroupImpl) {
  76. ensureSequenceIdAvailable()
  77. }
  78. }
  79. @Suppress("RedundantSuspendModifier", "unused")
  80. internal suspend inline fun Message.ensureSequenceIdAvailable() {
  81. (this as? MessageChain)?.sourceOrNull?.ensureSequenceIdAvailable()
  82. }