| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- //
- // RoomObserver.swift
- // TUIRoomKit
- //
- // Created by janejntang on 2023/7/3.
- import Foundation
- import RTCRoomEngine
- import TUICore
- @objc public protocol RoomObserverListener {
- @objc optional func onRoomEnter(messageId: String, code: Int, message: String) -> Void
- @objc optional func onRoomExit(messageId: String) -> Void
- }
- class RoomObserver: NSObject {
- var messageModel = RoomMessageModel()
- private let messageManager = RoomMessageManager.shared
- var engineManager: EngineManager {
- EngineManager.shared
- }
- var roomEngine: TUIRoomEngine {
- engineManager.roomEngine
- }
- lazy var userList: [[String: Any]] = {
- return messageModel.userList
- }()
- private lazy var userId: String = {
- return TUILogin.getUserID() ?? EngineManager.shared.store.currentUser.userId
- }()
- typealias Weak<T> = () -> T?
- private var listenerArray: [Weak<RoomObserverListener>] = []
- override init() {
- super.init()
- EngineEventCenter.shared.subscribeUIEvent(key: .TUIRoomKitService_RoomOwnerChanged, responder: self)
- EngineEventCenter.shared.subscribeEngine(event: .onExitedRoom, observer: self)
- EngineEventCenter.shared.subscribeEngine(event: .onDestroyedRoom, observer: self)
- }
-
- func registerObserver() {
- roomEngine.addObserver(self)
- }
-
- func unregisterObserver() {
- roomEngine.removeObserver(self)
- }
-
- func addListener(listener: RoomObserverListener) {
- let weakObserver = { [weak listener] in return listener }
- self.listenerArray.append(weakObserver)
- }
-
- func removeListener(listener: RoomObserverListener) {
- listenerArray.removeAll(where: {$0() === listener})
- }
-
- private func refreshSource() {
- RoomManager.shared.roomId = nil
- TUILogin.setCurrentBusinessScene(.None)
- engineManager.roomEngine.removeObserver(self)
- userList = []
- unregisterObserver()
- }
-
- func createdRoom() {
- TUILogin.setCurrentBusinessScene(.InMeetingRoom)
- messageModel.roomState = .created
- let userInfo = TUIUserInfo()
- userInfo.userId = userId
- userInfo.avatarUrl = TUILogin.getFaceUrl() ?? ""
- userInfo.userName = TUILogin.getNickName() ?? ""
- addUserList(userInfo: userInfo)
- let prefixUserList = Array(userList.prefix(5))
- messageManager.resendRoomMessage(message: messageModel, dic: ["userList":prefixUserList,
- "memberCount":userList.count,
- "roomState":RoomMessageModel.RoomState.created.rawValue,])
- }
-
- func enteredRoom() {
- TUILogin.setCurrentBusinessScene(.InMeetingRoom)
- getUserList(nextSequence: 0)
- }
-
- func exitedRoom() {
- RoomVideoFloatView.dismiss()
- userList = userList.filter { [weak self] userDic in
- guard let self = self, let userId = userDic["userId"] as? String else { return false }
- return userId != self.userId
- }
- if messageModel.owner == userId {
- let prefixUserList = Array(userList.prefix(5))
- messageManager.resendRoomMessage(message: messageModel, dic: ["userList":prefixUserList, "memberCount":userList.count])
- }
- for weakObserver in listenerArray {
- if let listener = weakObserver() {
- listener.onRoomExit?(messageId: self.messageModel.messageId)
- }
- }
- messageManager.isReadyToSendMessage = true
- refreshSource()
- }
-
- func destroyedRoom() {
- RoomVideoFloatView.dismiss()
- messageModel.roomState = .destroyed
- if messageModel.owner == userId {
- messageManager.resendRoomMessage(message: messageModel, dic: ["roomState":RoomMessageModel.RoomState.destroyed.rawValue])
- }
- messageManager.isReadyToSendMessage = true
- refreshSource()
- }
-
- deinit {
- EngineEventCenter.shared.unsubscribeUIEvent(key: .TUIRoomKitService_RoomOwnerChanged, responder: self)
- EngineEventCenter.shared.unsubscribeEngine(event: .onExitedRoom, observer: self)
- EngineEventCenter.shared.unsubscribeEngine(event: .onDestroyedRoom, observer: self)
- debugPrint("deinit \(self)")
- }
- }
- extension RoomObserver: TUIRoomObserver {
- func onRemoteUserEnterRoom(roomId: String, userInfo: TUIUserInfo) {
- addUserList(userInfo: userInfo)
- guard userList.count > 1 else { return }
- if messageModel.owner == userId {
- let prefixUserList = Array(userList.prefix(5))
- messageManager.resendRoomMessage(message: messageModel, dic: ["userList":prefixUserList,"memberCount":userList.count])
- }
- }
-
- func onRemoteUserLeaveRoom(roomId: String, userInfo: TUIUserInfo) {
- userList = userList.filter { userDic in
- if let userId = userDic["userId"] as? String, userId != userInfo.userId {
- return true
- }
- return false
- }
- if messageModel.owner == userId {
- let prefixUserList = Array(userList.prefix(5))
- messageManager.resendRoomMessage(message: messageModel, dic: ["memberCount":userList.count,"userList":prefixUserList])
- }
- }
-
- func onRoomDismissed(roomId: String, reason: TUIRoomDismissedReason) {
- RoomVideoFloatView.dismiss()
- messageManager.isReadyToSendMessage = true
- refreshSource()
- }
-
- func onKickedOutOfRoom(roomId: String, reason: TUIKickedOutOfRoomReason, message: String) {
- RoomVideoFloatView.dismiss()
- messageManager.isReadyToSendMessage = true
- refreshSource()
- }
- }
- extension RoomObserver {
- private func getUserList(nextSequence: Int) {
- engineManager.roomEngine.getUserList(nextSequence: nextSequence) { [weak self] list, nextSequence in
- guard let self = self else { return }
- list.forEach { userInfo in
- self.addUserList(userInfo: userInfo)
- }
- if nextSequence != 0 {
- self.getUserList(nextSequence: nextSequence)
- }
- } onError: { code, message in
- debugPrint("getUserList:code:\(code),message:\(message)")
- }
- }
-
- private func addUserList(userInfo: TUIUserInfo) {
- if getUserItem(userInfo.userId) == nil {
- let userDic: [String: Any] = ["userId":userInfo.userId,"userName":userInfo.userName,"faceUrl": userInfo.avatarUrl]
- userList.append(userDic)
- }
- }
-
- private func getUserItem(_ userId: String) -> String? {
- for userDic in userList {
- if let userIdString = userDic["userId"] as? String, userIdString == userId {
- return userIdString
- }
- }
- return nil
- }
- }
- extension RoomObserver: RoomKitUIEventResponder {
- func onNotifyUIEvent(key: EngineEventCenter.RoomUIEvent, Object: Any?, info: [AnyHashable : Any]?) {
- switch key {
- case .TUIRoomKitService_RoomOwnerChanged:
- guard let userId = info?["owner"] as? String else { return }
- messageManager.resendRoomMessage(message: messageModel, dic: ["owner": userId])
- default: break
- }
- }
- }
- extension RoomObserver: RoomEngineEventResponder {
- func onEngineEvent(name: EngineEventCenter.RoomEngineEvent, param: [String : Any]?) {
- switch name {
- case .onExitedRoom:
- exitedRoom()
- case .onDestroyedRoom:
- destroyedRoom()
- default: break
- }
- }
- }
|