extension ConfigurationMessage { public static func getCurrent() -> ConfigurationMessage? { let storage = Storage.shared guard let user = storage.getUser() else { return nil } let displayName = user.name let profilePictureURL = user.profilePictureURL let profileKey = user.profileEncryptionKey?.keyData var closedGroups: Set = [] var openGroups: Set = [] var contacts: Set = [] var contactCount = 0 Storage.read { transaction in TSGroupThread.enumerateCollectionObjects(with: transaction) { object, _ in guard let thread = object as? TSGroupThread else { return } switch thread.groupModel.groupType { case .closedGroup: guard thread.isCurrentUserMemberInGroup() else { return } let groupID = thread.groupModel.groupId let groupPublicKey = LKGroupUtilities.getDecodedGroupID(groupID) guard storage.isClosedGroup(groupPublicKey), let encryptionKeyPair = storage.getLatestClosedGroupEncryptionKeyPair(for: groupPublicKey) else { return } let closedGroup = ClosedGroup(publicKey: groupPublicKey, name: thread.groupModel.groupName!, encryptionKeyPair: encryptionKeyPair, members: Set(thread.groupModel.groupMemberIds), admins: Set(thread.groupModel.groupAdminIds), expirationTimer: thread.disappearingMessagesDuration(with: transaction)) closedGroups.insert(closedGroup) case .openGroup: if let v2OpenGroup = storage.getV2OpenGroup(for: thread.uniqueId!) { openGroups.insert("\(v2OpenGroup.server)/\(v2OpenGroup.room)?public_key=\(v2OpenGroup.publicKey)") } default: break } } var truncatedContacts = storage.getAllContacts() if truncatedContacts.count > 200 { truncatedContacts = Set(Array(truncatedContacts)[0..<200]) } truncatedContacts.forEach { contact in let publicKey = contact.sessionID let threadID = TSContactThread.threadID(fromContactSessionID: publicKey) guard let thread = TSContactThread.fetch(uniqueId: threadID, transaction: transaction), thread.shouldBeVisible && !SSKEnvironment.shared.blockingManager.isRecipientIdBlocked(publicKey) else { return } let profilePictureURL = contact.profilePictureURL let profileKey = contact.profileEncryptionKey?.keyData let contact = ConfigurationMessage.Contact(publicKey: publicKey, displayName: contact.name ?? publicKey, profilePictureURL: profilePictureURL, profileKey: profileKey) contacts.insert(contact) contactCount += 1 } } return ConfigurationMessage(displayName: displayName, profilePictureURL: profilePictureURL, profileKey: profileKey, closedGroups: closedGroups, openGroups: openGroups, contacts: contacts) } }