diff --git a/Session.xcodeproj/project.pbxproj b/Session.xcodeproj/project.pbxproj index e9b5ae82d..fd0f37594 100644 --- a/Session.xcodeproj/project.pbxproj +++ b/Session.xcodeproj/project.pbxproj @@ -783,6 +783,7 @@ C3DB6695260AC923001EFC55 /* OpenGroupV2.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3DB6694260AC923001EFC55 /* OpenGroupV2.swift */; }; C3DB66AC260ACA42001EFC55 /* OpenGroupManagerV2.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3DB66AB260ACA42001EFC55 /* OpenGroupManagerV2.swift */; }; C3DB66C3260ACCE6001EFC55 /* OpenGroupPollerV2.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3DB66C2260ACCE6001EFC55 /* OpenGroupPollerV2.swift */; }; + C3DB66CC260AF1F3001EFC55 /* OpenGroupAPIV2+ObjC.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3DB66CB260AF1F3001EFC55 /* OpenGroupAPIV2+ObjC.swift */; }; C3DFFAC623E96F0D0058DAF8 /* Sheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3DFFAC523E96F0D0058DAF8 /* Sheet.swift */; }; C3E5C2FA251DBABB0040DFFC /* EditClosedGroupVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3E5C2F9251DBABB0040DFFC /* EditClosedGroupVC.swift */; }; C3ECBF7B257056B700EA7FCE /* Threading.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3ECBF7A257056B700EA7FCE /* Threading.swift */; }; @@ -1783,6 +1784,7 @@ C3DB6694260AC923001EFC55 /* OpenGroupV2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenGroupV2.swift; sourceTree = ""; }; C3DB66AB260ACA42001EFC55 /* OpenGroupManagerV2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenGroupManagerV2.swift; sourceTree = ""; }; C3DB66C2260ACCE6001EFC55 /* OpenGroupPollerV2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenGroupPollerV2.swift; sourceTree = ""; }; + C3DB66CB260AF1F3001EFC55 /* OpenGroupAPIV2+ObjC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OpenGroupAPIV2+ObjC.swift"; sourceTree = ""; }; C3DFFAC523E96F0D0058DAF8 /* Sheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sheet.swift; sourceTree = ""; }; C3E5C2F9251DBABB0040DFFC /* EditClosedGroupVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditClosedGroupVC.swift; sourceTree = ""; }; C3E7134E251C867C009649BB /* Sodium+Conversion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Sodium+Conversion.swift"; sourceTree = ""; }; @@ -2510,6 +2512,7 @@ children = ( C3DB6694260AC923001EFC55 /* OpenGroupV2.swift */, B88FA7B726045D100049422F /* OpenGroupAPIV2.swift */, + C3DB66CB260AF1F3001EFC55 /* OpenGroupAPIV2+ObjC.swift */, C3DB66AB260ACA42001EFC55 /* OpenGroupManagerV2.swift */, C3227FF5260AAD66006EA627 /* OpenGroupMessageV2.swift */, ); @@ -4831,6 +4834,7 @@ B8D0A25925E367AC00C1835E /* Notification+MessageReceiver.swift in Sources */, C32C5D2E256DD4EA003C73A2 /* TSUnreadIndicatorInteraction.m in Sources */, C32C599E256DB02B003C73A2 /* TypingIndicators.swift in Sources */, + C3DB66CC260AF1F3001EFC55 /* OpenGroupAPIV2+ObjC.swift in Sources */, C32C5BEF256DC8EE003C73A2 /* OWSDisappearingMessagesJob.m in Sources */, C3A7222A2558C1E40043A11F /* DotNetAPI.swift in Sources */, C34A977425A3E34A00852C71 /* ClosedGroupControlMessage.swift in Sources */, diff --git a/Session/Conversations/ConversationViewItem.m b/Session/Conversations/ConversationViewItem.m index 1c8713ae5..633e94916 100644 --- a/Session/Conversations/ConversationViewItem.m +++ b/Session/Conversations/ConversationViewItem.m @@ -1010,7 +1010,7 @@ NSString *NSStringForOWSMessageCellType(OWSMessageCellType cellType) // Delete the message BOOL wasSentByUser = (interationType == OWSInteractionType_OutgoingMessage); if (openGroupV2 != nil) { - [[SNOpenGroupAPIV2 deleteMessageWithID:message.openGroupServerMessageID forRoom:openGroupV2.room onServer:openGroupV2.server isSentByUser:wasSentByUser].catch(^(NSError *error) { + [[SNOpenGroupAPIV2 deleteMessageWithServerID:message.openGroupServerMessageID fromRoom:openGroupV2.room onServer:openGroupV2.server].catch(^(NSError *error) { // Roll back [self.interaction save]; }) retainUntilComplete]; diff --git a/Session/Conversations/Views & Modals/ConversationTitleView.swift b/Session/Conversations/Views & Modals/ConversationTitleView.swift index e7820d90a..94fcb9242 100644 --- a/Session/Conversations/Views & Modals/ConversationTitleView.swift +++ b/Session/Conversations/Views & Modals/ConversationTitleView.swift @@ -96,14 +96,14 @@ final class ConversationTitleView : UIView { result.append(NSAttributedString(string: "Muted until " + formatter.string(from: muteEndDate))) return result } else if let thread = self.thread as? TSGroupThread { - var userCount: Int? + var userCount: UInt64? switch thread.groupModel.groupType { - case .closedGroup: userCount = thread.groupModel.groupMemberIds.count + case .closedGroup: userCount = UInt64(thread.groupModel.groupMemberIds.count) case .openGroup: if let openGroupV2 = Storage.shared.getV2OpenGroup(for: self.thread.uniqueId!) { - userCount = Storage.shared.getUserCount(forV2OpenGroupWithID: openGroup.id) + userCount = Storage.shared.getUserCount(forV2OpenGroupWithID: openGroupV2.id) } else if let openGroup = Storage.shared.getOpenGroup(for: self.thread.uniqueId!) { - userCount = Storage.shared.getUserCount(forOpenGroupWithID: openGroup.id) + userCount = given(Storage.shared.getUserCount(forOpenGroupWithID: openGroup.id)) { UInt64($0) } } default: break } diff --git a/SessionMessagingKit/Database/Storage+OpenGroups.swift b/SessionMessagingKit/Database/Storage+OpenGroups.swift index f75a090a4..16aa72ccd 100644 --- a/SessionMessagingKit/Database/Storage+OpenGroups.swift +++ b/SessionMessagingKit/Database/Storage+OpenGroups.swift @@ -177,19 +177,19 @@ extension Storage { // MARK: - Metadata - private static let openGroupUserCountCollection = "LokiPublicChatUserCountCollection" + private static let openGroupUserCountCollection = "SNOpenGroupUserCountCollection" private static let openGroupMessageIDCollection = "LKMessageIDCollection" private static let openGroupProfilePictureURLCollection = "LokiPublicChatAvatarURLCollection" - public func getUserCount(forOpenGroupWithID openGroupID: String) -> Int? { - var result: Int? + public func getUserCount(forV2OpenGroupWithID openGroupID: String) -> UInt64? { + var result: UInt64? Storage.read { transaction in - result = transaction.object(forKey: openGroupID, inCollection: Storage.openGroupUserCountCollection) as? Int + result = transaction.object(forKey: openGroupID, inCollection: Storage.openGroupUserCountCollection) as? UInt64 } return result } - public func setUserCount(to newValue: Int, forOpenGroupWithID openGroupID: String, using transaction: Any) { + public func setUserCount(to newValue: UInt64, forV2OpenGroupWithID openGroupID: String, using transaction: Any) { (transaction as! YapDatabaseReadWriteTransaction).setObject(newValue, forKey: openGroupID, inCollection: Storage.openGroupUserCountCollection) } @@ -230,6 +230,20 @@ extension Storage { // MARK: - Deprecated + private static let oldOpenGroupUserCountCollection = "LokiPublicChatUserCountCollection" + + public func getUserCount(forOpenGroupWithID openGroupID: String) -> Int? { + var result: Int? + Storage.read { transaction in + result = transaction.object(forKey: openGroupID, inCollection: Storage.oldOpenGroupUserCountCollection) as? Int + } + return result + } + + public func setUserCount(to newValue: Int, forOpenGroupWithID openGroupID: String, using transaction: Any) { + (transaction as! YapDatabaseReadWriteTransaction).setObject(newValue, forKey: openGroupID, inCollection: Storage.oldOpenGroupUserCountCollection) + } + private static let oldOpenGroupCollection = "LokiPublicChatCollection" @objc public func getAllUserOpenGroups() -> [String:OpenGroup] { diff --git a/SessionMessagingKit/Open Groups/V2/OpenGroupAPIV2+ObjC.swift b/SessionMessagingKit/Open Groups/V2/OpenGroupAPIV2+ObjC.swift new file mode 100644 index 000000000..466db6303 --- /dev/null +++ b/SessionMessagingKit/Open Groups/V2/OpenGroupAPIV2+ObjC.swift @@ -0,0 +1,14 @@ +import PromiseKit + +extension OpenGroupAPIV2 { + + @objc(deleteMessageWithServerID:fromRoom:onServer:) + public static func objc_deleteMessage(with serverID: Int64, from room: String, on server: String) -> AnyPromise { + return AnyPromise.from(deleteMessage(with: serverID, from: room, on: server)) + } + + @objc(isUserModerator:forRoom:onServer:) + public static func objc_isUserModerator(_ publicKey: String, for room: String, on server: String) -> Bool { + return isUserModerator(publicKey, for: room, on: server) + } +} diff --git a/SessionMessagingKit/Open Groups/V2/OpenGroupAPIV2.swift b/SessionMessagingKit/Open Groups/V2/OpenGroupAPIV2.swift index f9bcca9d5..074e038f9 100644 --- a/SessionMessagingKit/Open Groups/V2/OpenGroupAPIV2.swift +++ b/SessionMessagingKit/Open Groups/V2/OpenGroupAPIV2.swift @@ -5,7 +5,9 @@ import SessionSnodeKit // TODO: Keeping track of moderators // TODO: Token expiration -public enum OpenGroupAPIV2 { +@objc(SNOpenGroupAPIV2) +public final class OpenGroupAPIV2 : NSObject { + private static var moderators: [String:[String:Set]] = [:] // Server URL to room ID to set of moderator IDs // MARK: Error public enum Error : LocalizedError { @@ -259,6 +261,10 @@ public enum OpenGroupAPIV2 { let request = Request(verb: .delete, room: room, server: server, endpoint: "block_list/\(publicKey)") return send(request).map(on: DispatchQueue.global(qos: .userInitiated)) { _ in } } + + public static func isUserModerator(_ publicKey: String, for room: String, on server: String) -> Bool { + return moderators[server]?[room]?.contains(publicKey) ?? false + } // MARK: General public static func getMemberCount(for room: String, on server: String) -> Promise { diff --git a/SessionMessagingKit/Open Groups/V2/OpenGroupV2.swift b/SessionMessagingKit/Open Groups/V2/OpenGroupV2.swift index b9ef33b66..5463fb820 100644 --- a/SessionMessagingKit/Open Groups/V2/OpenGroupV2.swift +++ b/SessionMessagingKit/Open Groups/V2/OpenGroupV2.swift @@ -1,8 +1,8 @@ @objc(SNOpenGroupV2) public final class OpenGroupV2 : NSObject, NSCoding { // NSObject/NSCoding conformance is needed for YapDatabase compatibility - public let server: String - public let room: String + @objc public let server: String + @objc public let room: String public let id: String public let name: String