session-ios/SessionMessagingKit/Messages/Visible Messages/VisibleMessage+Profile.swift

146 lines
5.2 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?
public let blocksCommunityMessageRequests: Bool?
// MARK: - Initialization
internal init(
displayName: String,
profileKey: Data? = nil,
profilePictureUrl: String? = nil,
blocksCommunityMessageRequests: Bool? = nil
) {
let hasUrlAndKey: Bool = (profileKey != nil && profilePictureUrl != nil)
self.displayName = displayName
self.profileKey = (hasUrlAndKey ? profileKey : nil)
self.profilePictureUrl = (hasUrlAndKey ? profilePictureUrl : nil)
self.blocksCommunityMessageRequests = blocksCommunityMessageRequests
}
// 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,
blocksCommunityMessageRequests: (proto.hasBlocksCommunityMessageRequests ? proto.blocksCommunityMessageRequests : nil)
)
}
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 blocksCommunityMessageRequests: Bool = self.blocksCommunityMessageRequests {
dataMessageProto.setBlocksCommunityMessageRequests(blocksCommunityMessageRequests)
}
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,
blocksCommunityMessageRequests: Bool?
) {
self.displayName = profile.name
self.profileKey = profile.profileEncryptionKey
self.profilePictureUrl = profile.profilePictureUrl
self.blocksCommunityMessageRequests = blocksCommunityMessageRequests
}
}
// MARK: - MessageWithProfile
public protocol MessageWithProfile {
var profile: VisibleMessage.VMProfile? { get set }
}
extension VisibleMessage: MessageWithProfile {}
extension MessageRequestResponse: MessageWithProfile {}