From 6a8c717d7b1269a2794b1b1541bf5136c9d6a048 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Thu, 25 Mar 2021 14:17:49 +1100 Subject: [PATCH] Add get room info endpoint --- .../Open Groups/V2/OpenGroupAPIV2.swift | 14 ++++++ .../Open Groups/V2/OpenGroupManagerV2.swift | 45 +++++++++++-------- .../Open Groups/V2/OpenGroupV2.swift | 8 +++- 3 files changed, 46 insertions(+), 21 deletions(-) diff --git a/SessionMessagingKit/Open Groups/V2/OpenGroupAPIV2.swift b/SessionMessagingKit/Open Groups/V2/OpenGroupAPIV2.swift index 074e038f9..45fa48ae9 100644 --- a/SessionMessagingKit/Open Groups/V2/OpenGroupAPIV2.swift +++ b/SessionMessagingKit/Open Groups/V2/OpenGroupAPIV2.swift @@ -57,6 +57,12 @@ public final class OpenGroupAPIV2 : NSObject { self.useOnionRouting = useOnionRouting } } + + // MARK: Info + public struct Info { + public let name: String + public let imageID: String + } // MARK: Convenience private static func send(_ request: Request) -> Promise { @@ -267,6 +273,14 @@ public final class OpenGroupAPIV2 : NSObject { } // MARK: General + public static func getInfo(for room: String, on server: String) -> Promise { + let request = Request(verb: .get, room: room, server: server, endpoint: "rooms/\(room)") + return send(request).map(on: DispatchQueue.global(qos: .userInitiated)) { json in + guard let name = json["name"] as? String, let imageID = json["image_id"] as? String else { throw Error.parsingFailed } + return Info(name: name, imageID: imageID) + } + } + public static func getMemberCount(for room: String, on server: String) -> Promise { let request = Request(verb: .get, room: room, server: server, endpoint: "member_count") return send(request).map(on: DispatchQueue.global(qos: .userInitiated)) { json in diff --git a/SessionMessagingKit/Open Groups/V2/OpenGroupManagerV2.swift b/SessionMessagingKit/Open Groups/V2/OpenGroupManagerV2.swift index e004dc646..c1bde7da2 100644 --- a/SessionMessagingKit/Open Groups/V2/OpenGroupManagerV2.swift +++ b/SessionMessagingKit/Open Groups/V2/OpenGroupManagerV2.swift @@ -29,28 +29,35 @@ public final class OpenGroupManagerV2 : NSObject { } // MARK: Adding & Removing - public func add(room: String, server: String, name: String, using transaction: Any) { + public func add(room: String, server: String, publicKey: String, using transaction: Any) -> Promise { let storage = Storage.shared storage.removeLastMessageServerID(for: room, on: server, using: transaction) storage.removeLastDeletionServerID(for: room, on: server, using: transaction) - let openGroup = OpenGroupV2(server: server, room: room, name: name) - let groupID = LKGroupUtilities.getEncodedOpenGroupIDAsData(openGroup.id) - let model = TSGroupModel(title: openGroup.name, memberIds: [ getUserHexEncodedPublicKey() ], image: nil, groupId: groupID, groupType: .openGroup, adminIds: []) - storage.write(with: { transaction in - let transaction = transaction as! YapDatabaseReadWriteTransaction - let thread = TSGroupThread.getOrCreateThread(with: model, transaction: transaction) - thread.shouldThreadBeVisible = true - thread.save(with: transaction) - storage.setV2OpenGroup(openGroup, for: thread.uniqueId!, using: transaction) - }, completion: { - if let poller = OpenGroupManagerV2.shared.pollers[openGroup.id] { - poller.stop() - OpenGroupManagerV2.shared.pollers[openGroup.id] = nil - } - let poller = OpenGroupPollerV2(for: openGroup) - poller.startIfNeeded() - OpenGroupManagerV2.shared.pollers[openGroup.id] = poller - }) + let (promise, seal) = Promise.pending() + OpenGroupAPIV2.getInfo(for: room, on: server).done(on: DispatchQueue.global(qos: .default)) { info in + let openGroup = OpenGroupV2(server: server, room: room, name: info.name, imageID: info.imageID) + let groupID = LKGroupUtilities.getEncodedOpenGroupIDAsData(openGroup.id) + let model = TSGroupModel(title: openGroup.name, memberIds: [ getUserHexEncodedPublicKey() ], image: nil, groupId: groupID, groupType: .openGroup, adminIds: []) + storage.write(with: { transaction in + let transaction = transaction as! YapDatabaseReadWriteTransaction + let thread = TSGroupThread.getOrCreateThread(with: model, transaction: transaction) + thread.shouldThreadBeVisible = true + thread.save(with: transaction) + storage.setV2OpenGroup(openGroup, for: thread.uniqueId!, using: transaction) + }, completion: { + if let poller = OpenGroupManagerV2.shared.pollers[openGroup.id] { + poller.stop() + OpenGroupManagerV2.shared.pollers[openGroup.id] = nil + } + let poller = OpenGroupPollerV2(for: openGroup) + poller.startIfNeeded() + OpenGroupManagerV2.shared.pollers[openGroup.id] = poller + seal.fulfill(()) + }) + }.catch(on: DispatchQueue.global(qos: .default)) { error in + seal.reject(error) + } + return promise } public func delete(_ openGroup: OpenGroupV2, associatedWith thread: TSThread, using transaction: YapDatabaseReadWriteTransaction) { diff --git a/SessionMessagingKit/Open Groups/V2/OpenGroupV2.swift b/SessionMessagingKit/Open Groups/V2/OpenGroupV2.swift index 5463fb820..d5d3390d9 100644 --- a/SessionMessagingKit/Open Groups/V2/OpenGroupV2.swift +++ b/SessionMessagingKit/Open Groups/V2/OpenGroupV2.swift @@ -5,12 +5,14 @@ public final class OpenGroupV2 : NSObject, NSCoding { // NSObject/NSCoding confo @objc public let room: String public let id: String public let name: String + public let imageID: String - public init(server: String, room: String, name: String) { + public init(server: String, room: String, name: String, imageID: String) { self.server = server.lowercased() self.room = room self.id = "\(server).\(room)" self.name = name + self.imageID = imageID } // MARK: Coding @@ -19,6 +21,7 @@ public final class OpenGroupV2 : NSObject, NSCoding { // NSObject/NSCoding confo room = coder.decodeObject(forKey: "room") as! String self.id = "\(server).\(room)" name = coder.decodeObject(forKey: "name") as! String + imageID = coder.decodeObject(forKey: "imageID") as! String super.init() } @@ -26,7 +29,8 @@ public final class OpenGroupV2 : NSObject, NSCoding { // NSObject/NSCoding confo coder.encode(server, forKey: "server") coder.encode(room, forKey: "room") coder.encode(name, forKey: "name") + coder.encode(imageID, forKey: "imageID") } - override public var description: String { "\(name) (\(server) → \(room)" } + override public var description: String { "\(name) (Server: \(server), Room: \(room)" } }