RoomObserver.swift 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. //
  2. // RoomObserver.swift
  3. // TUIRoomKit
  4. //
  5. // Created by janejntang on 2023/7/3.
  6. import Foundation
  7. import RTCRoomEngine
  8. import TUICore
  9. @objc public protocol RoomObserverListener {
  10. @objc optional func onRoomEnter(messageId: String, code: Int, message: String) -> Void
  11. @objc optional func onRoomExit(messageId: String) -> Void
  12. }
  13. class RoomObserver: NSObject {
  14. var messageModel = RoomMessageModel()
  15. private let messageManager = RoomMessageManager.shared
  16. var engineManager: EngineManager {
  17. EngineManager.shared
  18. }
  19. var roomEngine: TUIRoomEngine {
  20. engineManager.roomEngine
  21. }
  22. lazy var userList: [[String: Any]] = {
  23. return messageModel.userList
  24. }()
  25. private lazy var userId: String = {
  26. return TUILogin.getUserID() ?? EngineManager.shared.store.currentUser.userId
  27. }()
  28. typealias Weak<T> = () -> T?
  29. private var listenerArray: [Weak<RoomObserverListener>] = []
  30. override init() {
  31. super.init()
  32. EngineEventCenter.shared.subscribeUIEvent(key: .TUIRoomKitService_RoomOwnerChanged, responder: self)
  33. EngineEventCenter.shared.subscribeEngine(event: .onExitedRoom, observer: self)
  34. EngineEventCenter.shared.subscribeEngine(event: .onDestroyedRoom, observer: self)
  35. }
  36. func registerObserver() {
  37. roomEngine.addObserver(self)
  38. }
  39. func unregisterObserver() {
  40. roomEngine.removeObserver(self)
  41. }
  42. func addListener(listener: RoomObserverListener) {
  43. let weakObserver = { [weak listener] in return listener }
  44. self.listenerArray.append(weakObserver)
  45. }
  46. func removeListener(listener: RoomObserverListener) {
  47. listenerArray.removeAll(where: {$0() === listener})
  48. }
  49. private func refreshSource() {
  50. RoomManager.shared.roomId = nil
  51. TUILogin.setCurrentBusinessScene(.None)
  52. engineManager.roomEngine.removeObserver(self)
  53. userList = []
  54. unregisterObserver()
  55. }
  56. func createdRoom() {
  57. TUILogin.setCurrentBusinessScene(.InMeetingRoom)
  58. messageModel.roomState = .created
  59. let userInfo = TUIUserInfo()
  60. userInfo.userId = userId
  61. userInfo.avatarUrl = TUILogin.getFaceUrl() ?? ""
  62. userInfo.userName = TUILogin.getNickName() ?? ""
  63. addUserList(userInfo: userInfo)
  64. let prefixUserList = Array(userList.prefix(5))
  65. messageManager.resendRoomMessage(message: messageModel, dic: ["userList":prefixUserList,
  66. "memberCount":userList.count,
  67. "roomState":RoomMessageModel.RoomState.created.rawValue,])
  68. }
  69. func enteredRoom() {
  70. TUILogin.setCurrentBusinessScene(.InMeetingRoom)
  71. getUserList(nextSequence: 0)
  72. }
  73. func exitedRoom() {
  74. RoomVideoFloatView.dismiss()
  75. userList = userList.filter { [weak self] userDic in
  76. guard let self = self, let userId = userDic["userId"] as? String else { return false }
  77. return userId != self.userId
  78. }
  79. if messageModel.owner == userId {
  80. let prefixUserList = Array(userList.prefix(5))
  81. messageManager.resendRoomMessage(message: messageModel, dic: ["userList":prefixUserList, "memberCount":userList.count])
  82. }
  83. for weakObserver in listenerArray {
  84. if let listener = weakObserver() {
  85. listener.onRoomExit?(messageId: self.messageModel.messageId)
  86. }
  87. }
  88. messageManager.isReadyToSendMessage = true
  89. refreshSource()
  90. }
  91. func destroyedRoom() {
  92. RoomVideoFloatView.dismiss()
  93. messageModel.roomState = .destroyed
  94. if messageModel.owner == userId {
  95. messageManager.resendRoomMessage(message: messageModel, dic: ["roomState":RoomMessageModel.RoomState.destroyed.rawValue])
  96. }
  97. messageManager.isReadyToSendMessage = true
  98. refreshSource()
  99. }
  100. deinit {
  101. EngineEventCenter.shared.unsubscribeUIEvent(key: .TUIRoomKitService_RoomOwnerChanged, responder: self)
  102. EngineEventCenter.shared.unsubscribeEngine(event: .onExitedRoom, observer: self)
  103. EngineEventCenter.shared.unsubscribeEngine(event: .onDestroyedRoom, observer: self)
  104. debugPrint("deinit \(self)")
  105. }
  106. }
  107. extension RoomObserver: TUIRoomObserver {
  108. func onRemoteUserEnterRoom(roomId: String, userInfo: TUIUserInfo) {
  109. addUserList(userInfo: userInfo)
  110. guard userList.count > 1 else { return }
  111. if messageModel.owner == userId {
  112. let prefixUserList = Array(userList.prefix(5))
  113. messageManager.resendRoomMessage(message: messageModel, dic: ["userList":prefixUserList,"memberCount":userList.count])
  114. }
  115. }
  116. func onRemoteUserLeaveRoom(roomId: String, userInfo: TUIUserInfo) {
  117. userList = userList.filter { userDic in
  118. if let userId = userDic["userId"] as? String, userId != userInfo.userId {
  119. return true
  120. }
  121. return false
  122. }
  123. if messageModel.owner == userId {
  124. let prefixUserList = Array(userList.prefix(5))
  125. messageManager.resendRoomMessage(message: messageModel, dic: ["memberCount":userList.count,"userList":prefixUserList])
  126. }
  127. }
  128. func onRoomDismissed(roomId: String, reason: TUIRoomDismissedReason) {
  129. RoomVideoFloatView.dismiss()
  130. messageManager.isReadyToSendMessage = true
  131. refreshSource()
  132. }
  133. func onKickedOutOfRoom(roomId: String, reason: TUIKickedOutOfRoomReason, message: String) {
  134. RoomVideoFloatView.dismiss()
  135. messageManager.isReadyToSendMessage = true
  136. refreshSource()
  137. }
  138. }
  139. extension RoomObserver {
  140. private func getUserList(nextSequence: Int) {
  141. engineManager.roomEngine.getUserList(nextSequence: nextSequence) { [weak self] list, nextSequence in
  142. guard let self = self else { return }
  143. list.forEach { userInfo in
  144. self.addUserList(userInfo: userInfo)
  145. }
  146. if nextSequence != 0 {
  147. self.getUserList(nextSequence: nextSequence)
  148. }
  149. } onError: { code, message in
  150. debugPrint("getUserList:code:\(code),message:\(message)")
  151. }
  152. }
  153. private func addUserList(userInfo: TUIUserInfo) {
  154. if getUserItem(userInfo.userId) == nil {
  155. let userDic: [String: Any] = ["userId":userInfo.userId,"userName":userInfo.userName,"faceUrl": userInfo.avatarUrl]
  156. userList.append(userDic)
  157. }
  158. }
  159. private func getUserItem(_ userId: String) -> String? {
  160. for userDic in userList {
  161. if let userIdString = userDic["userId"] as? String, userIdString == userId {
  162. return userIdString
  163. }
  164. }
  165. return nil
  166. }
  167. }
  168. extension RoomObserver: RoomKitUIEventResponder {
  169. func onNotifyUIEvent(key: EngineEventCenter.RoomUIEvent, Object: Any?, info: [AnyHashable : Any]?) {
  170. switch key {
  171. case .TUIRoomKitService_RoomOwnerChanged:
  172. guard let userId = info?["owner"] as? String else { return }
  173. messageManager.resendRoomMessage(message: messageModel, dic: ["owner": userId])
  174. default: break
  175. }
  176. }
  177. }
  178. extension RoomObserver: RoomEngineEventResponder {
  179. func onEngineEvent(name: EngineEventCenter.RoomEngineEvent, param: [String : Any]?) {
  180. switch name {
  181. case .onExitedRoom:
  182. exitedRoom()
  183. case .onDestroyedRoom:
  184. destroyedRoom()
  185. default: break
  186. }
  187. }
  188. }