LNRoomInfo.swift 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. //
  2. // LNRoomInfo.swift
  3. // Gami
  4. //
  5. // Created by OneeChan on 2026/3/13.
  6. //
  7. import Foundation
  8. import AtomicXCore
  9. private let seatApplyCountKey = "mic_apply_num"
  10. private let state_mic_mute = "state_mic_mute"
  11. extension LiveInfo {
  12. var roomType: LNRoomType {
  13. guard let value = categoryList.first?.intValue else {
  14. return .unknown
  15. }
  16. return LNRoomType(rawValue: value)
  17. }
  18. var applySeatCount: Int {
  19. guard let value = metaData[seatApplyCountKey],
  20. let count = Int(value) else {
  21. return 0
  22. }
  23. return count
  24. }
  25. var forbidAudio: Bool {
  26. metaData[state_mic_mute] == "1"
  27. }
  28. }
  29. class LNRoomInfo {
  30. private var info: LiveInfo?
  31. var liveID: String = ""
  32. var liveName: String = ""
  33. var coverURL: String = ""
  34. var forbidAudio: Bool = false
  35. var owner: String = ""
  36. var roomType: LNRoomType = .unknown
  37. @discardableResult
  38. func update(_ info: LiveInfo) -> Bool {
  39. if info.liveID != liveID
  40. || info.liveName != liveName
  41. || info.coverURL != coverURL
  42. || info.liveOwner.userID != owner
  43. || info.forbidAudio != forbidAudio
  44. || info.roomType != roomType {
  45. let shouldFetch = liveID.isEmpty
  46. liveID = info.liveID
  47. liveName = info.liveName
  48. coverURL = info.coverURL
  49. owner = info.liveOwner.userID
  50. roomType = info.roomType
  51. forbidAudio = info.forbidAudio
  52. self.info = info
  53. if shouldFetch, info.metaData.isEmpty {
  54. // 退房冲进,会导致 metaData 丢失,需要主动拉取一次
  55. fetchMetaData()
  56. }
  57. return true
  58. }
  59. return false
  60. }
  61. private func fetchMetaData() {
  62. LNRoomManager.shared.liveListStore.queryMetaData(keys: [
  63. state_mic_mute
  64. ]) { [weak self] result in
  65. guard let self else { return }
  66. guard case .success(let info) = result,
  67. let value = info[state_mic_mute]
  68. else {
  69. return
  70. }
  71. if self.info?.metaData.isEmpty == false {
  72. // 此时可能已经推送了新的数据
  73. return
  74. }
  75. forbidAudio = value == "1"
  76. }
  77. }
  78. }