StrangerImpl.kt 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. * Copyright 2019-2021 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:OptIn(LowLevelApi::class)
  10. @file:Suppress(
  11. "EXPERIMENTAL_API_USAGE",
  12. "DEPRECATION_ERROR",
  13. "NOTHING_TO_INLINE",
  14. "INVISIBLE_MEMBER",
  15. "INVISIBLE_REFERENCE"
  16. )
  17. package net.mamoe.mirai.internal.contact
  18. import kotlinx.atomicfu.AtomicInt
  19. import kotlinx.atomicfu.atomic
  20. import net.mamoe.mirai.LowLevelApi
  21. import net.mamoe.mirai.contact.Stranger
  22. import net.mamoe.mirai.contact.User
  23. import net.mamoe.mirai.contact.asFriendOrNull
  24. import net.mamoe.mirai.data.StrangerInfo
  25. import net.mamoe.mirai.event.events.StrangerMessagePostSendEvent
  26. import net.mamoe.mirai.event.events.StrangerMessagePreSendEvent
  27. import net.mamoe.mirai.internal.QQAndroidBot
  28. import net.mamoe.mirai.internal.message.OnlineMessageSourceToStrangerImpl
  29. import net.mamoe.mirai.internal.message.createMessageReceipt
  30. import net.mamoe.mirai.internal.network.protocol.packet.list.StrangerList
  31. import net.mamoe.mirai.message.MessageReceipt
  32. import net.mamoe.mirai.message.data.Message
  33. import net.mamoe.mirai.utils.cast
  34. import kotlin.contracts.ExperimentalContracts
  35. import kotlin.contracts.contract
  36. import kotlin.coroutines.CoroutineContext
  37. @OptIn(ExperimentalContracts::class)
  38. internal inline fun Stranger.checkIsImpl(): StrangerImpl {
  39. contract {
  40. returns() implies (this@checkIsImpl is StrangerImpl)
  41. }
  42. check(this is StrangerImpl) { "A Stranger instance is not instance of StrangerImpl. Your instance: ${this::class.qualifiedName}" }
  43. return this
  44. }
  45. internal class StrangerImpl(
  46. bot: QQAndroidBot,
  47. coroutineContext: CoroutineContext,
  48. internal val strangerInfo: StrangerInfo,
  49. ) : Stranger, AbstractUser(bot, coroutineContext, strangerInfo) {
  50. @Suppress("unused") // bug
  51. val lastMessageSequence: AtomicInt = atomic(-1)
  52. override suspend fun delete() {
  53. check(bot.strangers[this.id] != null) {
  54. "Stranger ${this.id} had already been deleted"
  55. }
  56. bot.network.run {
  57. StrangerList.DelStranger(bot.client, this@StrangerImpl)
  58. .sendAndExpect<StrangerList.DelStranger.Response>().also {
  59. check(it.isSuccess) { "delete Stranger failed: ${it.result}" }
  60. }
  61. }
  62. }
  63. private val handler by lazy { StrangerSendMessageHandler(this) }
  64. @Suppress("DuplicatedCode")
  65. override suspend fun sendMessage(message: Message): MessageReceipt<Stranger> {
  66. return asFriendOrNull()?.sendMessage(message)?.convert()
  67. ?: handler.sendMessageImpl<Stranger>(
  68. message = message,
  69. preSendEventConstructor = ::StrangerMessagePreSendEvent,
  70. postSendEventConstructor = ::StrangerMessagePostSendEvent.cast()
  71. )
  72. }
  73. private fun MessageReceipt<User>.convert(): MessageReceipt<StrangerImpl> {
  74. return OnlineMessageSourceToStrangerImpl(source, this@StrangerImpl).createMessageReceipt(
  75. this@StrangerImpl,
  76. doLightRefine = false //we've already did
  77. )
  78. }
  79. override fun toString(): String = "Stranger($id)"
  80. }