LNRoomPushMessage.swift 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. //
  2. // LNRoomPushMessage.swift
  3. // Gami
  4. //
  5. // Created by OneeChan on 2026/3/20.
  6. //
  7. import Foundation
  8. import AtomicXCore
  9. import AutoCodable
  10. enum LNRoomSystemMessageType: String, CaseIterable {
  11. case welcome = "local.welcome"
  12. case MicClear = "mic.clear"
  13. case RoomGift = "room.gift"
  14. }
  15. @AutoCodable
  16. class LNRoomMicClearMessage: Decodable {
  17. var type: LNApplyingSeatType = .none
  18. var time: Int64 = 0
  19. }
  20. @AutoCodable
  21. class LNRoomGiftUserInfo: Decodable {
  22. var nickname: String = ""
  23. }
  24. @AutoCodable
  25. class LNRoomGiftMessage: Decodable {
  26. var quantity: Int = 0
  27. var sender: String = ""
  28. var receivers: [String] = []
  29. var resId: String = ""
  30. var users: [String: LNRoomGiftUserInfo] = [:]
  31. }
  32. class LNRoomPushMessage {
  33. let innerMessage: Barrage
  34. let cmd: LNRoomSystemMessageType
  35. private var cmdMessage: (any Decodable)?
  36. var messageItems: [LNRoomMessageItem]? {
  37. var list: [LNRoomMessageItem] = []
  38. switch cmd {
  39. case .welcome:
  40. let item = LNRoomWelcomeMessageItem()
  41. item.userNo = innerMessage.sender.userID
  42. item.nickname = innerMessage.sender.userName
  43. list.append(item)
  44. case .RoomGift:
  45. if let messages: [LNRoomGiftMessage] = decodeCmdMessage() {
  46. var needUpdate = false
  47. for message in messages {
  48. for user in message.receivers {
  49. let item = LNRoomGiftMessageItem()
  50. item.sender = message.sender
  51. item.senderName = message.users[message.sender]?.nickname ?? ""
  52. if let giftRes = LNGiftManager.shared.resource(for: message.resId) {
  53. item.giftName = giftRes.curName
  54. item.giftIcon = giftRes.icon
  55. } else {
  56. needUpdate = true
  57. }
  58. item.giftCount = message.quantity
  59. item.receiver = user
  60. item.receiverName = message.users[user]?.nickname ?? ""
  61. list.append(item)
  62. }
  63. }
  64. if needUpdate {
  65. LNGiftManager.shared.updateGiftResource()
  66. }
  67. }
  68. case .MicClear:
  69. break
  70. }
  71. return list
  72. }
  73. init?(info: Barrage) {
  74. guard info.messageType == .custom,
  75. let type = LNRoomSystemMessageType(rawValue: info.businessID)
  76. else { return nil }
  77. innerMessage = info
  78. cmd = type
  79. }
  80. func decodeCmdMessage<T: Decodable>() -> T? {
  81. if let cached = cmdMessage as? T {
  82. return cached
  83. }
  84. guard let data = innerMessage.data.data(using: .utf8) else { return nil }
  85. let decoder = JSONDecoder()
  86. decoder.keyDecodingStrategy = .useDefaultKeys
  87. let result = try? decoder.decode(T.self, from: data)
  88. if let result {
  89. cmdMessage = result
  90. }
  91. return result
  92. }
  93. }