UserState.swift 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. //
  2. // UserState.swift
  3. // TUIRoomKit
  4. //
  5. // Created by CY zhao on 2024/6/5.
  6. //
  7. import Foundation
  8. import RTCRoomEngine
  9. struct UserState {
  10. var selfInfo: UserInfo = UserInfo()
  11. var allUsers: [UserInfo] = []
  12. var hasAudioStreamUsers = Set<String>()
  13. var hasCameraStreamUsers = Set<String>()
  14. var hasScreenStreamUsers = Set<String>()
  15. var disableMessageUsers = Set<String>()
  16. }
  17. struct UserInfo: Codable {
  18. var userId: String = ""
  19. var userName: String = ""
  20. var avatarUrl: String = ""
  21. var userRole: TUIRole? = .generalUser
  22. var userVoiceVolume: Int = 0
  23. var hasAudioStream: Bool = false
  24. var hasVideoStream: Bool = false
  25. var videoStreamType: TUIVideoStreamType = .cameraStream
  26. var isOnSeat: Bool = false
  27. var disableSendingMessage: Bool = false
  28. var hasScreenStream: Bool = false
  29. enum CodingKeys: String, CodingKey {
  30. case userId
  31. case userName
  32. case avatarUrl
  33. }
  34. init() {}
  35. init(loginUserInfo: TUILoginUserInfo) {
  36. self.userId = loginUserInfo.userId
  37. self.userName = loginUserInfo.userName
  38. self.avatarUrl = loginUserInfo.avatarUrl
  39. }
  40. init(userInfo: TUIUserInfo) {
  41. self.userId = userInfo.userId
  42. let userName = userInfo.nameCard.isEmpty ? userInfo.userName : userInfo.nameCard
  43. self.userName = userName.isEmpty ? userInfo.userId: userName
  44. self.avatarUrl = userInfo.avatarUrl
  45. self.userRole = userInfo.userRole
  46. self.hasAudioStream = userInfo.hasAudioStream
  47. self.hasVideoStream = userInfo.hasVideoStream
  48. self.hasScreenStream = userInfo.hasScreenStream
  49. }
  50. init(userEntity: UserEntity) {
  51. self.userId = userEntity.userId
  52. self.userName = userEntity.userName
  53. self.avatarUrl = userEntity.avatarUrl
  54. self.userRole = userEntity.userRole
  55. self.hasAudioStream = userEntity.hasAudioStream
  56. self.hasVideoStream = userEntity.hasVideoStream
  57. self.videoStreamType = userEntity.videoStreamType
  58. self.isOnSeat = userEntity.isOnSeat
  59. self.hasScreenStream = userEntity.hasScreenStream
  60. }
  61. init(from decoder: Decoder) throws {
  62. let container = try decoder.container(keyedBy: CodingKeys.self)
  63. self.userId = try container.decode(String.self, forKey: .userId)
  64. self.userName = try container.decode(String.self, forKey: .userName)
  65. self.avatarUrl = try container.decode(String.self, forKey: .avatarUrl)
  66. }
  67. }
  68. extension UserInfo: Hashable {
  69. static func == (lhs: UserInfo, rhs: UserInfo) -> Bool {
  70. return lhs.userId == rhs.userId &&
  71. lhs.userName == rhs.userName &&
  72. lhs.avatarUrl == rhs.avatarUrl &&
  73. lhs.userRole == rhs.userRole &&
  74. lhs.hasAudioStream == rhs.hasAudioStream &&
  75. lhs.hasVideoStream == rhs.hasVideoStream &&
  76. lhs.videoStreamType == rhs.videoStreamType &&
  77. lhs.isOnSeat == rhs.isOnSeat &&
  78. lhs.hasScreenStream == rhs.hasScreenStream
  79. }
  80. func hash(into hasher: inout Hasher) {
  81. hasher.combine(userId)
  82. hasher.combine(userName)
  83. hasher.combine(avatarUrl)
  84. hasher.combine(userRole)
  85. hasher.combine(hasAudioStream)
  86. hasher.combine(hasVideoStream)
  87. hasher.combine(videoStreamType)
  88. hasher.combine(isOnSeat)
  89. hasher.combine(hasScreenStream)
  90. }
  91. }
  92. extension TUIRole: Codable {
  93. public init(from decoder: Decoder) throws {
  94. let container = try decoder.singleValueContainer()
  95. let rawValue = try container.decode(UInt.self)
  96. self = TUIRole(rawValue: rawValue) ?? .generalUser
  97. }
  98. public func encode(to encoder: Encoder) throws {
  99. var container = encoder.singleValueContainer()
  100. try container.encode(self.rawValue)
  101. }
  102. }
  103. extension TUIVideoStreamType: Codable {
  104. public init(from decoder: Decoder) throws {
  105. let container = try decoder.singleValueContainer()
  106. let rawValue = try container.decode(UInt.self)
  107. self = TUIVideoStreamType(rawValue: rawValue) ?? .cameraStream
  108. }
  109. public func encode(to encoder: Encoder) throws {
  110. var container = encoder.singleValueContainer()
  111. try container.encode(self.rawValue)
  112. }
  113. }
  114. extension UserInfo {
  115. func convertToUser() -> User {
  116. return User(self)
  117. }
  118. }
  119. @objc public class User: NSObject, Codable {
  120. private(set) var userInfo: UserInfo
  121. @objc public var userId: String {
  122. get { return userInfo.userId}
  123. }
  124. @objc public var userName: String {
  125. get { return userInfo.userName}
  126. }
  127. @objc public var avatarUrl: String {
  128. get { return userInfo.avatarUrl}
  129. }
  130. @objc public init(userId: String, userName: String, avatarUrl: String) {
  131. var info = UserInfo()
  132. info.userId = userId
  133. info.userName = userName
  134. info.avatarUrl = avatarUrl
  135. self.userInfo = info
  136. super.init()
  137. }
  138. init(_ userInfo: UserInfo) {
  139. self.userInfo = userInfo
  140. super.init()
  141. }
  142. public required init(from decoder: Decoder) throws {
  143. let container = try decoder.singleValueContainer()
  144. self.userInfo = try container.decode(UserInfo.self)
  145. }
  146. public func encode(to encoder: Encoder) throws {
  147. var container = encoder.singleValueContainer()
  148. try container.encode(userInfo)
  149. }
  150. @objc public func setUserId(_ userId: String) {
  151. userInfo.userId = userId
  152. }
  153. @objc public func setUserName(_ userName: String) {
  154. userInfo.userName = userName
  155. }
  156. @objc public func setAvatarUrl(_ avatarUrl: String) {
  157. userInfo.avatarUrl = avatarUrl
  158. }
  159. }
  160. @objc public class ConferenceParticipants: NSObject {
  161. @objc public var selectedList: [User] = []
  162. @objc public var unSelectableList : [User] = []
  163. @objc public init(selectedList: [User] = [], unSelectableList: [User] = []) {
  164. self.selectedList = selectedList
  165. self.unSelectableList = unSelectableList
  166. super.init()
  167. }
  168. }