Statistics
| Branch: | Tag: | Revision:

chatsecureios / ChatSecure / Classes / Controllers / XMPP / RoomManager.swift @ a4bb25f6

History | View | Annotate | Download (3.31 KB)

1
//
2
//  RoomManager.swift
3
//  ChatSecureCore
4
//
5
//  Created by Chris Ballinger on 11/17/17.
6
//  Copyright © 2017 Chris Ballinger. All rights reserved.
7
//
8

    
9
import Foundation
10

    
11
public extension OTRXMPPRoomManager {
12
    
13
    @objc public func join(room: OTRXMPPRoom) {
14
        guard let roomJID = room.roomJID else { return }
15
        joinRoom(roomJID, withNickname: nil, subject: room.subject, password: room.roomPassword)
16
    }
17
    
18
    private func roomForBookmark(_ bookmark: XMPPBookmark) -> OTRXMPPRoom? {
19
        guard let conference = bookmark as? XMPPConferenceBookmark,
20
            let jidString = conference.jid?.bare,
21
            let accountId = self.accountId else {
22
                return nil
23
        }
24
        let room = OTRXMPPRoom()!
25
        room.accountUniqueId = accountId
26
        room.jid = jidString
27
        room.subject = conference.bookmarkName
28
        room.roomPassword = conference.password
29
        return room
30
    }
31
    
32
    private var accountId: String? {
33
        return xmppStream?.tag as? String
34
    }
35
    
36
    private func handleIncomingBookmarks(_ bookmarks: [XMPPBookmark]) {
37
        var incomingRooms: [OTRXMPPRoom] = []
38
        
39
        bookmarks.forEach({ (bookmark) in
40
            if let room = self.roomForBookmark(bookmark) {
41
                incomingRooms.append(room)
42
            }
43
        })
44
        guard incomingRooms.count > 0 else {
45
            return
46
        }
47
        var rooms: [OTRXMPPRoom] = []
48
        self.databaseConnection.asyncReadWrite({ (transaction) in
49
            incomingRooms.forEach({ (room) in
50
                // Don't overwrite existing rooms with incoming rooms
51
                if let existingRoom = OTRXMPPRoom.fetchObject(withUniqueID: room.uniqueId, transaction: transaction) {
52
                    rooms.append(existingRoom)
53
                } else {
54
                    rooms.append(room)
55
                    room.save(with: transaction)
56
                }
57
            })
58
        }, completionBlock: {
59
            rooms.forEach({ (room) in
60
                self.join(room: room)
61
            })
62
        })
63
    }
64
    
65
    @objc public func addRoomsToBookmarks(_ rooms: [OTRXMPPRoom]) {
66
        var bookmarks: [XMPPConferenceBookmark] = []
67
        rooms.forEach { (room) in
68
            if let bookmark = room.bookmark {
69
                bookmarks.append(bookmark)
70
            }
71
        }
72
        bookmarksModule.fetchAndPublish(bookmarksToAdd: bookmarks, completion: { (newBookmarks, responseIq) in
73
            guard let outBookmarks = newBookmarks else {
74
                DDLogError("Failed to add bookmarks \(bookmarks)")
75
                return
76
            }
77
            DDLogInfo("New bookmarks \(outBookmarks)")
78
            self.handleIncomingBookmarks(outBookmarks)
79
        })
80
    }
81
    
82
    @objc public func removeRoomsFromBookmarks(_ rooms: [OTRXMPPRoom]) {
83
        var bookmarks: [XMPPConferenceBookmark] = []
84
        rooms.forEach { (room) in
85
            if let bookmark = room.bookmark {
86
                bookmarks.append(bookmark)
87
            }
88
        }
89
        bookmarksModule.fetchAndPublish(bookmarksToAdd: [], bookmarksToRemove: bookmarks, completion: { (newBookmarks, responseIq) in
90
            if let newBookmarks = newBookmarks {
91
                DDLogInfo("New bookmarks \(newBookmarks)")
92
            } else {
93
                DDLogWarn("Failed to remove bookmarks \(bookmarks)")
94
            }
95
        })
96
    }
97
}
98