139 lines
5.8 KiB
Swift
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)
|
|
}
|
|
}
|
|
|