RoomManager.swift 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. //
  2. // RoomManager.swift
  3. // Chat (iOS)
  4. //
  5. // Created by Sergey Tarasov on 17.08.2022.
  6. //
  7. import Foundation
  8. import XMPPFramework
  9. import XMPPFrameworkSwift
  10. final class RoomManager: NSObject {
  11. var room: XMPPRoom
  12. var storage: XMPPRoomMemoryStorage
  13. var mam: XMPPMessageArchiveManagement
  14. var jid: XMPPJID?
  15. var messages: [XMPPMessage] = []
  16. init(with jidString: String) {
  17. self.storage = XMPPRoomMemoryStorage()
  18. self.room = XMPPRoom(roomStorage: self.storage, jid: XMPPJID(string: jidString)!)
  19. self.mam = XMPPMessageArchiveManagement()
  20. super.init()
  21. self.room.activate(StreamManager.shared.stream)
  22. self.mam.activate(StreamManager.shared.stream)
  23. self.room.join(usingNickname: StreamManager.shared.stream.myJID?.user ?? "Test", history: nil)
  24. self.room.addDelegate(self, delegateQueue: DispatchQueue.main)
  25. self.mam.addDelegate(self, delegateQueue: DispatchQueue.main)
  26. }
  27. func fetchMessages() {
  28. self.messages.removeAll()
  29. if self.room.isJoined {
  30. self.mam.retrieveMessageArchive(at: self.room.roomJID.bareJID, withFields: nil, with: nil)
  31. } else {
  32. let field = DDXMLElement(name: "field")
  33. field.addAttribute(withName: "var", stringValue: "with")
  34. field.addChild(DDXMLElement(name: "value", stringValue: self.room.roomJID.bare))
  35. self.mam.retrieveMessageArchive(at: nil, withFields: [field], with: nil)
  36. }
  37. }
  38. func sendMessage(_ text: String) {
  39. let xmppMessage = XMPPMessage(messageType: room.isJoined ? .chat : .normal, to: self.room.roomJID.bareJID)
  40. xmppMessage.addBody(text)
  41. if self.room.isJoined {
  42. self.room.send(xmppMessage)
  43. } else {
  44. StreamManager.shared.stream.send(xmppMessage)
  45. }
  46. }
  47. }
  48. extension RoomManager: XMPPRoomMemoryStorageDelegate {
  49. func xmppRoomMemoryStorage(
  50. _ sender: XMPPRoomMemoryStorage!,
  51. didReceiveMessage message: XMPPRoomMessageMemoryStorageObject!,
  52. fromOccupant occupant: XMPPRoomOccupantMemoryStorageObject!,
  53. at index: UInt,
  54. in allMessages: [Any]!
  55. ) {
  56. debugPrint(message.debugDescription)
  57. }
  58. }
  59. extension RoomManager: XMPPRoomDelegate {
  60. func xmppRoomDidJoin(_ sender: XMPPRoom) {
  61. }
  62. }
  63. extension RoomManager: XMPPMessageArchiveManagementDelegate {
  64. func xmppMessageArchiveManagement(
  65. _ xmppMessageArchiveManagement: XMPPMessageArchiveManagement,
  66. didReceiveMAMMessage message: XMPPMessage
  67. ) {
  68. if let result = message.children?.first,
  69. let forwarded = result.children?.first,
  70. let msg = forwarded.children?.first as? DDXMLElement {
  71. let xmppmsg = XMPPMessage(from: msg)
  72. if xmppmsg.isMessageWithBody {
  73. self.messages.append(xmppmsg)
  74. }
  75. }
  76. }
  77. func xmppMessageArchiveManagement(_ xmppMessageArchiveManagement: XMPPMessageArchiveManagement, didFinishReceivingMessagesWith resultSet: XMPPResultSet) {
  78. debugPrint("FINISH MAM")
  79. }
  80. }