Files
featherVoice/TUIKit/TUIRoomKit/RoomExtension/Model/Manager/RoomMessageManager.swift
2025-08-08 10:49:36 +08:00

139 lines
5.8 KiB
Swift

//
// RoomMessageManager.swift
// TUIRoomKit
//
// Created by janejntang on 2023/5/8.
// Copyright © 2023 Tencent. All rights reserved.
// Manage messages, including sending messages and modifying messages
//
import Foundation
import TUICore
import RTCRoomEngine
class RoomMessageManager: NSObject {
static let shared = RoomMessageManager()
private var engineManager: EngineManager {
EngineManager.shared
}
private lazy var userId: String = {
return TUILogin.getUserID() ?? engineManager.store.currentUser.userId
}()
weak var navigateController: UINavigationController?
var isReadyToSendMessage: Bool = true
var groupId: String = ""
private override init() {
super.init()
TUICore.registerEvent(TUICore_TUIChatNotify, subKey: TUICore_TUIChatNotify_SendMessageSubKey, object: self)
}
func sendRoomMessageToGroup() {
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
guard BusinessSceneUtil.canJoinRoom() else { return }
if self.engineManager.store.isEnteredRoom {
RoomManager.shared.exitOrDestroyPreviousRoom() { [weak self] in
guard let self = self else { return }
self.sendMessage()
} onError: { [weak self] code, message in
guard let self = self else { return }
self.sendMessage()
debugPrint("exitRoom,code:\(code),message:\(message)")
}
} else {
self.sendMessage()
}
}
}
private func sendMessage() {
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
guard self.isReadyToSendMessage else {
self.changeReadyToSendMessage()
return
}
self.isReadyToSendMessage = false
FetchRoomId.getRoomId { [weak self] roomId in
guard let self = self else { return }
let messageModel = RoomMessageModel()
messageModel.groupId = self.groupId
messageModel.roomId = roomId
messageModel.ownerName = TUILogin.getNickName() ?? ""
messageModel.owner = self.userId
let messageDic = messageModel.getDictFromMessageModel()
guard let jsonString = messageDic.convertToString() else { return }
let jsonData = jsonString.data(using: String.Encoding.utf8)
let message = V2TIMManager.sharedInstance().createCustomMessage(jsonData)
message?.supportMessageExtension = true
let param = [TUICore_TUIChatService_SendMessageMethod_MsgKey: message]
TUICore.callService(TUICore_TUIChatService, method: TUICore_TUIChatService_SendMessageMethod, param: param as [AnyHashable : Any])
RoomManager.shared.roomId = roomId
}
}
}
func resendRoomMessage(message: RoomMessageModel,dic:[String: Any]) {
if message.messageId == "" {
self.modifyMessage(message: message, dic: dic)
return
}
V2TIMManager.sharedInstance().findMessages([message.messageId]) { [weak self] messageArray in
guard let self = self else { return }
guard let array = messageArray else { return }
for previousMessage in array where previousMessage.msgID == message.messageId {
self.modifyMessage(message: message, dic: dic)
}
} fail: { [weak self] code, messageString in
guard let self = self else { return }
self.modifyMessage(message: message, dic: dic)
}
}
private func modifyMessage(message: RoomMessageModel, dic:[String: Any]) {
guard let message = message.getMessage() else { return }
guard var customElemDic = TUITool.jsonData2Dictionary(message.customElem.data) as? [String: Any] else { return }
for (key, value) in dic {
customElemDic[key] = value
}
guard let jsonString = customElemDic.convertToString() else { return }
let jsonData = jsonString.data(using: String.Encoding.utf8)
message.customElem.data = jsonData
V2TIMManager.sharedInstance().modifyMessage(message) { code, desc, msg in
if code == 0 {
debugPrint("modifyMessage,success")
} else {
debugPrint("modifyMessage,code:\(code),message:\(String(describing: desc))")
}
}
}
deinit {
debugPrint("deinit \(self)")
}
}
extension RoomMessageManager {
private func changeReadyToSendMessage() {
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 20) { [weak self] in
guard let self = self else { return }
self.isReadyToSendMessage = true
}
}
}
extension RoomMessageManager: TUINotificationProtocol {
func onNotifyEvent(_ key: String, subKey: String, object anObject: Any?, param: [AnyHashable : Any]?) {
guard key == TUICore_TUIChatNotify, subKey == TUICore_TUIChatNotify_SendMessageSubKey else { return }
guard let code = param?[TUICore_TUIChatNotify_SendMessageSubKey_Code] as? Int, code == 0 else { return }
guard let message = param?[TUICore_TUIChatNotify_SendMessageSubKey_Message] as? V2TIMMessage else { return }
let messageModel = RoomMessageModel()
messageModel.updateMessage(message: message)
guard messageModel.messageId.count > 0, messageModel.roomState == .creating, messageModel.roomId == RoomManager.shared.roomId else { return }
let roomInfo = TUIRoomInfo()
roomInfo.roomId = messageModel.roomId
RoomManager.shared.createRoom(roomInfo: roomInfo)
}
}