// 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 self.profilePictureUrl = profile.profilePictureUrl } } // MARK: - MessageWithProfile public protocol MessageWithProfile { var profile: VisibleMessage.VMProfile? { get set } } extension VisibleMessage: MessageWithProfile {} extension MessageRequestResponse: MessageWithProfile {}