RoomMessageManager.swift 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. //
  2. // RoomMessageManager.swift
  3. // TUIRoomKit
  4. //
  5. // Created by janejntang on 2023/5/8.
  6. // Copyright © 2023 Tencent. All rights reserved.
  7. // Manage messages, including sending messages and modifying messages
  8. //
  9. import Foundation
  10. import TUICore
  11. import RTCRoomEngine
  12. class RoomMessageManager: NSObject {
  13. static let shared = RoomMessageManager()
  14. private var engineManager: EngineManager {
  15. EngineManager.shared
  16. }
  17. private lazy var userId: String = {
  18. return TUILogin.getUserID() ?? engineManager.store.currentUser.userId
  19. }()
  20. weak var navigateController: UINavigationController?
  21. var isReadyToSendMessage: Bool = true
  22. var groupId: String = ""
  23. private override init() {
  24. super.init()
  25. TUICore.registerEvent(TUICore_TUIChatNotify, subKey: TUICore_TUIChatNotify_SendMessageSubKey, object: self)
  26. }
  27. func sendRoomMessageToGroup() {
  28. DispatchQueue.main.async { [weak self] in
  29. guard let self = self else { return }
  30. guard BusinessSceneUtil.canJoinRoom() else { return }
  31. if self.engineManager.store.isEnteredRoom {
  32. RoomManager.shared.exitOrDestroyPreviousRoom() { [weak self] in
  33. guard let self = self else { return }
  34. self.sendMessage()
  35. } onError: { [weak self] code, message in
  36. guard let self = self else { return }
  37. self.sendMessage()
  38. debugPrint("exitRoom,code:\(code),message:\(message)")
  39. }
  40. } else {
  41. self.sendMessage()
  42. }
  43. }
  44. }
  45. private func sendMessage() {
  46. DispatchQueue.main.async { [weak self] in
  47. guard let self = self else { return }
  48. guard self.isReadyToSendMessage else {
  49. self.changeReadyToSendMessage()
  50. return
  51. }
  52. self.isReadyToSendMessage = false
  53. FetchRoomId.getRoomId { [weak self] roomId in
  54. guard let self = self else { return }
  55. let messageModel = RoomMessageModel()
  56. messageModel.groupId = self.groupId
  57. messageModel.roomId = roomId
  58. messageModel.ownerName = TUILogin.getNickName() ?? self.userId
  59. messageModel.owner = self.userId
  60. let messageDic = messageModel.getDictFromMessageModel()
  61. guard let jsonString = messageDic.convertToString() else { return }
  62. let jsonData = jsonString.data(using: String.Encoding.utf8)
  63. let message = V2TIMManager.sharedInstance().createCustomMessage(data: jsonData)
  64. message?.supportMessageExtension = true
  65. let param = [TUICore_TUIChatService_SendMessageMethod_MsgKey: message]
  66. TUICore.callService(TUICore_TUIChatService, method: TUICore_TUIChatService_SendMessageMethod, param: param as [AnyHashable : Any])
  67. RoomManager.shared.roomId = roomId
  68. }
  69. }
  70. }
  71. func resendRoomMessage(message: RoomMessageModel,dic:[String: Any]) {
  72. if message.messageId == "" {
  73. self.modifyMessage(message: message, dic: dic)
  74. return
  75. }
  76. V2TIMManager.sharedInstance().findMessages(messageIDList: [message.messageId]) { [weak self] messageArray in
  77. guard let self = self else { return }
  78. guard let array = messageArray else { return }
  79. for previousMessage in array where previousMessage.msgID == message.messageId {
  80. self.modifyMessage(message: message, dic: dic)
  81. }
  82. } fail: { [weak self] code, messageString in
  83. guard let self = self else { return }
  84. self.modifyMessage(message: message, dic: dic)
  85. }
  86. }
  87. private func modifyMessage(message: RoomMessageModel, dic:[String: Any]) {
  88. guard let message = message.getMessage() else { return }
  89. guard var customElemDic = TUITool.jsonData2Dictionary(message.customElem?.data) as? [String: Any] else { return }
  90. for (key, value) in dic {
  91. customElemDic[key] = value
  92. }
  93. guard let jsonString = customElemDic.convertToString() else { return }
  94. let jsonData = jsonString.data(using: String.Encoding.utf8)
  95. message.customElem?.data = jsonData
  96. V2TIMManager.sharedInstance().modifyMessage(msg: message) { code, desc, msg in
  97. if code == 0 {
  98. debugPrint("modifyMessage,success")
  99. } else {
  100. debugPrint("modifyMessage,code:\(code),message:\(String(describing: desc))")
  101. }
  102. }
  103. }
  104. deinit {
  105. debugPrint("deinit \(self)")
  106. }
  107. }
  108. extension RoomMessageManager {
  109. private func changeReadyToSendMessage() {
  110. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 20) { [weak self] in
  111. guard let self = self else { return }
  112. self.isReadyToSendMessage = true
  113. }
  114. }
  115. }
  116. extension RoomMessageManager: TUINotificationProtocol {
  117. func onNotifyEvent(_ key: String, subKey: String, object anObject: Any?, param: [AnyHashable : Any]?) {
  118. guard key == TUICore_TUIChatNotify, subKey == TUICore_TUIChatNotify_SendMessageSubKey else { return }
  119. guard let code = param?[TUICore_TUIChatNotify_SendMessageSubKey_Code] as? Int, code == 0 else { return }
  120. guard let message = param?[TUICore_TUIChatNotify_SendMessageSubKey_Message] as? V2TIMMessage else { return }
  121. let messageModel = RoomMessageModel()
  122. messageModel.updateMessage(message: message)
  123. guard messageModel.messageId.count > 0, messageModel.roomState == .creating, messageModel.roomId == RoomManager.shared.roomId else { return }
  124. let roomInfo = TUIRoomInfo()
  125. roomInfo.roomId = messageModel.roomId
  126. RoomManager.shared.createRoom(roomInfo: roomInfo)
  127. }
  128. }