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.
		
		
		
		
		
			
		
			
				
	
	
		
			130 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			130 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Swift
		
	
// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
 | 
						|
 | 
						|
import Foundation
 | 
						|
import SessionUtilitiesKit
 | 
						|
 | 
						|
// MARK: - VisibleMessage.VMProfile
 | 
						|
 | 
						|
public extension VisibleMessage {
 | 
						|
    struct VMProfile: Codable {
 | 
						|
        public let displayName: String?
 | 
						|
        public let profileKey: Data?
 | 
						|
        public let profilePictureUrl: String?
 | 
						|
        
 | 
						|
        // MARK: - Initialization
 | 
						|
 | 
						|
        internal init(displayName: String, profileKey: Data? = nil, profilePictureUrl: String? = nil) {
 | 
						|
            let hasUrlAndKey: Bool = (profileKey != nil && profilePictureUrl != nil)
 | 
						|
            
 | 
						|
            self.displayName = displayName
 | 
						|
            self.profileKey = (hasUrlAndKey ? profileKey : nil)
 | 
						|
            self.profilePictureUrl = (hasUrlAndKey ? profilePictureUrl : nil)
 | 
						|
        }
 | 
						|
 | 
						|
        // MARK: - Proto Conversion
 | 
						|
 | 
						|
        public static func fromProto(_ proto: SNProtoDataMessage) -> VMProfile? {
 | 
						|
            guard
 | 
						|
                let profileProto = proto.profile,
 | 
						|
                let displayName = profileProto.displayName
 | 
						|
            else { return nil }
 | 
						|
            
 | 
						|
            return VMProfile(
 | 
						|
                displayName: displayName,
 | 
						|
                profileKey: proto.profileKey,
 | 
						|
                profilePictureUrl: profileProto.profilePicture
 | 
						|
            )
 | 
						|
        }
 | 
						|
 | 
						|
        public func toProto() -> SNProtoDataMessage? {
 | 
						|
            guard let displayName = displayName else {
 | 
						|
                SNLog("Couldn't construct profile proto from: \(self).")
 | 
						|
                return nil
 | 
						|
            }
 | 
						|
            let dataMessageProto = SNProtoDataMessage.builder()
 | 
						|
            let profileProto = SNProtoLokiProfile.builder()
 | 
						|
            profileProto.setDisplayName(displayName)
 | 
						|
            
 | 
						|
            if let profileKey = profileKey, let profilePictureUrl = profilePictureUrl {
 | 
						|
                dataMessageProto.setProfileKey(profileKey)
 | 
						|
                profileProto.setProfilePicture(profilePictureUrl)
 | 
						|
            }
 | 
						|
            do {
 | 
						|
                dataMessageProto.setProfile(try profileProto.build())
 | 
						|
                return try dataMessageProto.build()
 | 
						|
            } catch {
 | 
						|
                SNLog("Couldn't construct profile proto from: \(self).")
 | 
						|
                return nil
 | 
						|
            }
 | 
						|
        }
 | 
						|
        
 | 
						|
        public static func fromProto(_ proto: SNProtoMessageRequestResponse) -> VMProfile? {
 | 
						|
            guard
 | 
						|
                let profileProto = proto.profile,
 | 
						|
                let displayName = profileProto.displayName
 | 
						|
            else { return nil }
 | 
						|
            
 | 
						|
            return VMProfile(
 | 
						|
                displayName: displayName,
 | 
						|
                profileKey: proto.profileKey,
 | 
						|
                profilePictureUrl: profileProto.profilePicture
 | 
						|
            )
 | 
						|
        }
 | 
						|
        
 | 
						|
        public func toProto(isApproved: Bool) -> SNProtoMessageRequestResponse? {
 | 
						|
            guard let displayName = displayName else {
 | 
						|
                SNLog("Couldn't construct profile proto from: \(self).")
 | 
						|
                return nil
 | 
						|
            }
 | 
						|
            let messageRequestResponseProto = SNProtoMessageRequestResponse.builder(
 | 
						|
                isApproved: isApproved
 | 
						|
            )
 | 
						|
            let profileProto = SNProtoLokiProfile.builder()
 | 
						|
            profileProto.setDisplayName(displayName)
 | 
						|
            
 | 
						|
            if let profileKey = profileKey, let profilePictureUrl = profilePictureUrl {
 | 
						|
                messageRequestResponseProto.setProfileKey(profileKey)
 | 
						|
                profileProto.setProfilePicture(profilePictureUrl)
 | 
						|
            }
 | 
						|
            do {
 | 
						|
                messageRequestResponseProto.setProfile(try profileProto.build())
 | 
						|
                return try messageRequestResponseProto.build()
 | 
						|
            } catch {
 | 
						|
                SNLog("Couldn't construct profile proto from: \(self).")
 | 
						|
                return nil
 | 
						|
            }
 | 
						|
        }
 | 
						|
        
 | 
						|
        // MARK: Description
 | 
						|
        
 | 
						|
        public var description: String {
 | 
						|
            """
 | 
						|
            Profile(
 | 
						|
                displayName: \(displayName ?? "null"),
 | 
						|
                profileKey: \(profileKey?.description ?? "null"),
 | 
						|
                profilePictureUrl: \(profilePictureUrl ?? "null")
 | 
						|
            )
 | 
						|
            """
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
// MARK: - Conversion
 | 
						|
 | 
						|
extension VisibleMessage.VMProfile {
 | 
						|
    init(profile: Profile) {
 | 
						|
        self.displayName = profile.name
 | 
						|
        self.profileKey = profile.profileEncryptionKey?.keyData
 | 
						|
        self.profilePictureUrl = profile.profilePictureUrl
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
// MARK: - MessageWithProfile
 | 
						|
 | 
						|
public protocol MessageWithProfile {
 | 
						|
    var profile: VisibleMessage.VMProfile? { get set }
 | 
						|
}
 | 
						|
 | 
						|
extension VisibleMessage: MessageWithProfile {}
 | 
						|
extension MessageRequestResponse: MessageWithProfile {}
 |