mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			86 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			86 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Swift
		
	
| // Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
 | |
| 
 | |
| import Foundation
 | |
| import GRDB
 | |
| import SessionUtilitiesKit
 | |
| 
 | |
| extension ConfigurationMessage {
 | |
|     public static func getCurrent(_ db: Database) throws -> ConfigurationMessage {
 | |
|         let currentUserProfile: Profile = Profile.fetchOrCreateCurrentUser(db)
 | |
|         let displayName: String = currentUserProfile.name
 | |
|         let profilePictureUrl: String? = currentUserProfile.profilePictureUrl
 | |
|         let profileKey: Data? = currentUserProfile.profileEncryptionKey
 | |
|         let closedGroups: Set<CMClosedGroup> = try ClosedGroup.fetchAll(db)
 | |
|             .compactMap { closedGroup -> CMClosedGroup? in
 | |
|                 guard let latestKeyPair: ClosedGroupKeyPair = try closedGroup.fetchLatestKeyPair(db) else {
 | |
|                     return nil
 | |
|                 }
 | |
|                 
 | |
|                 return CMClosedGroup(
 | |
|                     publicKey: closedGroup.publicKey,
 | |
|                     name: closedGroup.name,
 | |
|                     encryptionKeyPublicKey: latestKeyPair.publicKey,
 | |
|                     encryptionKeySecretKey: latestKeyPair.secretKey,
 | |
|                     members: try closedGroup.members
 | |
|                         .select(GroupMember.Columns.profileId)
 | |
|                         .asRequest(of: String.self)
 | |
|                         .fetchSet(db),
 | |
|                     admins: try closedGroup.admins
 | |
|                         .select(GroupMember.Columns.profileId)
 | |
|                         .asRequest(of: String.self)
 | |
|                         .fetchSet(db),
 | |
|                     expirationTimer: (try? DisappearingMessagesConfiguration
 | |
|                         .fetchOne(db, id: closedGroup.threadId)
 | |
|                         .map { ($0.isEnabled ? UInt32($0.durationSeconds) : 0) })
 | |
|                         .defaulting(to: 0)
 | |
|                 )
 | |
|             }
 | |
|             .asSet()
 | |
|         // The default room promise creates an OpenGroup with an empty `roomToken` value,
 | |
|         // we don't want to start a poller for this as the user hasn't actually joined a room
 | |
|         let openGroups: Set<String> = try OpenGroup
 | |
|             .filter(OpenGroup.Columns.roomToken != "")
 | |
|             .filter(OpenGroup.Columns.isActive)
 | |
|             .fetchAll(db)
 | |
|             .compactMap { openGroup in
 | |
|                 SessionUtil.communityUrlFor(
 | |
|                     server: openGroup.server,
 | |
|                     roomToken: openGroup.roomToken,
 | |
|                     publicKey: openGroup.publicKey
 | |
|                 )
 | |
|             }
 | |
|             .asSet()
 | |
|         let contacts: Set<CMContact> = try Contact
 | |
|             .filter(Contact.Columns.id != currentUserProfile.id)
 | |
|             .fetchAll(db)
 | |
|             .map { contact -> CMContact in
 | |
|                 // Can just default the 'hasX' values to true as they will be set to this
 | |
|                 // when converting to proto anyway
 | |
|                 let profile: Profile? = try? Profile.fetchOne(db, id: contact.id)
 | |
|                 
 | |
|                 return CMContact(
 | |
|                     publicKey: contact.id,
 | |
|                     displayName: (profile?.name ?? contact.id),
 | |
|                     profilePictureUrl: profile?.profilePictureUrl,
 | |
|                     profileKey: profile?.profileEncryptionKey,
 | |
|                     hasIsApproved: true,
 | |
|                     isApproved: contact.isApproved,
 | |
|                     hasIsBlocked: true,
 | |
|                     isBlocked: contact.isBlocked,
 | |
|                     hasDidApproveMe: true,
 | |
|                     didApproveMe: contact.didApproveMe
 | |
|                 )
 | |
|             }
 | |
|             .asSet()
 | |
|         
 | |
|         return ConfigurationMessage(
 | |
|             displayName: displayName,
 | |
|             profilePictureUrl: profilePictureUrl,
 | |
|             profileKey: profileKey,
 | |
|             closedGroups: closedGroups,
 | |
|             openGroups: openGroups,
 | |
|             contacts: contacts
 | |
|         )
 | |
|     }
 | |
| }
 |