// // XMPPController.swift // Chat // // Created by Sergey Tarasov on 25.07.2022. // import Foundation import XMPPFramework import XMPPFrameworkSwift /* final class XMPPController: NSObject { static let shared = XMPPController() var xmppStream: XMPPStream var xmppReconnect: XMPPReconnect var xmppRoster: XMPPRoster var xmppRosterStorage: XMPPRosterMemoryStorage var xmppMUC: XMPPMUCLight var xmppMAM: XMPPMessageArchiveManagement var xmppCapabilities: XMPPCapabilities var xmppCapabilitiesStorage: XMPPCapabilitiesStorage var xmppPing: XMPPPing var xmppTime: XMPPTime var users: [XMPPJID] = [] var rooms: [XMPPRoom] = [] var messages: [String] = [] var password: String? override init() { self.xmppStream = XMPPStream() self.xmppReconnect = XMPPReconnect() self.xmppRosterStorage = XMPPRosterMemoryStorage() self.xmppRoster = XMPPRoster(rosterStorage: self.xmppRosterStorage, dispatchQueue: DispatchQueue.main) self.xmppMUC = XMPPMUCLight(dispatchQueue: DispatchQueue.main) self.xmppMAM = XMPPMessageArchiveManagement(dispatchQueue: DispatchQueue.main) self.xmppCapabilitiesStorage = XMPPCapabilitiesCoreDataStorage.sharedInstance() self.xmppCapabilities = XMPPCapabilities(capabilitiesStorage: self.xmppCapabilitiesStorage) self.xmppCapabilities.autoFetchHashedCapabilities = true self.xmppCapabilities.autoFetchNonHashedCapabilities = false self.xmppPing = XMPPPing() self.xmppTime = XMPPTime() self.xmppReconnect.activate(self.xmppStream) self.xmppRoster.activate(self.xmppStream) self.xmppMUC.activate(self.xmppStream) self.xmppMAM.activate(self.xmppStream) self.xmppCapabilities.activate(self.xmppStream) self.xmppPing.activate(self.xmppStream) self.xmppTime.activate(self.xmppStream) super.init() self.xmppStream.addDelegate(self, delegateQueue: DispatchQueue.main) self.xmppReconnect.addDelegate(self, delegateQueue: DispatchQueue.main) self.xmppMUC.addDelegate(self, delegateQueue: DispatchQueue.main) self.xmppMAM.addDelegate(self, delegateQueue: DispatchQueue.main) self.xmppCapabilities.addDelegate(self, delegateQueue: DispatchQueue.main) } func setupStream(with login: String?, password: String?) { self.password = password ?? "" self.xmppStream.hostName = "msg.sharix-app.org" self.xmppStream.hostPort = 5222 self.xmppStream.myJID = XMPPJID(string: login ?? "test11@msg.sharix-app.org") self.xmppStream.startTLSPolicy = XMPPStreamStartTLSPolicy.allowed } func connect() { if !self.xmppStream.isDisconnected { return } try! self.xmppStream.connect(withTimeout: XMPPStreamTimeoutNone) } func getUserList() { self.users = self.xmppRosterStorage.jids(for: self.xmppStream) } func getRoomList() { self.xmppMUC.discoverRooms(forServiceNamed: "chat.msg.sharix-app.org") } func getMessages(from jid: XMPPJID) { self.messages.removeAll() let field = DDXMLElement(name: "field") field.addAttribute(withName: "var", stringValue: "with") let fieldValue = DDXMLElement(name: "value", stringValue: jid.bare) field.addChild(fieldValue) self.xmppMAM.retrieveMessageArchive(withFields: nil, with: nil) } } extension XMPPController: XMPPMessageArchiveManagementDelegate { func xmppMessageArchiveManagement( _ xmppMessageArchiveManagement: XMPPMessageArchiveManagement, didReceiveFormFields iq: XMPPIQ ) { print(iq.debugDescription) } func xmppMessageArchiveManagement( _ xmppMessageArchiveManagement: XMPPMessageArchiveManagement, didReceiveMAMMessage message: XMPPMessage ) { print(message.debugDescription) guard let messageText = message.body else { return } self.messages.append(messageText) } func xmppMessageArchiveManagement( _ xmppMessageArchiveManagement: XMPPMessageArchiveManagement, didFinishReceivingMessagesWith resultSet: XMPPResultSet ) { print(resultSet.debugDescription) } } extension XMPPController: XMPPReconnectDelegate { func xmppReconnect( _ sender: XMPPReconnect, shouldAttemptAutoReconnect connectionFlags: SCNetworkConnectionFlags ) -> Bool { return true } } extension XMPPController: XMPPStreamDelegate { func xmppStreamDidConnect(_ stream: XMPPStream) { print("Stream: Connected") try! stream.authenticate(withPassword: self.password ?? "test11_-") } func xmppStreamDidAuthenticate(_ sender: XMPPStream) { self.xmppStream.send(XMPPPresence()) print("Stream: Authenticated") } func xmppStream(_ sender: XMPPStream, willReceive message: XMPPMessage) -> XMPPMessage? { guard let body = message.body else { return nil } debugPrint(body) return message } } extension XMPPController: XMPPMUCLightDelegate { // func xmppMUC(_ sender: XMPPMUC, didDiscoverRooms rooms: [Any], forServiceNamed serviceName: String) { // let elements = rooms.map({ try! DDXMLElement(xmlString: String(describing: $0)) }) // let jids = elements.compactMap({ XMPPJID(string: $0.attributeStringValue(forName: "jid") ?? "") }) // self.rooms = jids // print(self.rooms) // } func xmppMUCLight( _ sender: XMPPMUCLight, didDiscoverRooms rooms: [DDXMLElement], forServiceNamed serviceName: String ) { let jids = rooms.compactMap({ XMPPJID(string: $0.attributeStringValue(forName: "jid") ?? "") }) let rooms = jids.map { XMPPRoom(roomStorage: XMPPRoomMemoryStorage(), jid: $0) } self.rooms = rooms print(self.rooms) } } */