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.
63 lines
2.9 KiB
Swift
63 lines
2.9 KiB
Swift
|
|
extension Storage {
|
|
|
|
private static let contactCollection = "LokiContactCollection"
|
|
|
|
@objc(getContactWithSessionID:)
|
|
public func getContact(with sessionID: String) -> Contact? {
|
|
var result: Contact?
|
|
Storage.read { transaction in
|
|
result = transaction.object(forKey: sessionID, inCollection: Storage.contactCollection) as? Contact
|
|
}
|
|
if let result = result, result.sessionID == getUserHexEncodedPublicKey() {
|
|
result.isTrusted = true // Always trust ourselves
|
|
}
|
|
return result
|
|
}
|
|
|
|
@objc(setContact:usingTransaction:)
|
|
public func setContact(_ contact: Contact, using transaction: Any) {
|
|
let oldContact = getContact(with: contact.sessionID)
|
|
let transaction = transaction as! YapDatabaseReadWriteTransaction
|
|
if contact.sessionID == getUserHexEncodedPublicKey() {
|
|
contact.isTrusted = true // Always trust ourselves
|
|
}
|
|
transaction.setObject(contact, forKey: contact.sessionID, inCollection: Storage.contactCollection)
|
|
transaction.addCompletionQueue(DispatchQueue.main) {
|
|
// Delete old profile picture if needed
|
|
if let oldProfilePictureFileName = oldContact?.profilePictureFileName,
|
|
oldProfilePictureFileName != contact.profilePictureFileName {
|
|
let path = OWSUserProfile.profileAvatarFilepath(withFilename: oldProfilePictureFileName)
|
|
DispatchQueue.global(qos: .default).async {
|
|
OWSFileSystem.deleteFileIfExists(path)
|
|
}
|
|
}
|
|
// Download new profile picture if needed
|
|
if contact.profilePictureURL != nil && contact.profilePictureURL != oldContact?.profilePictureURL {
|
|
let profileManager = SSKEnvironment.shared.profileManager
|
|
profileManager.downloadAvatar(forUserProfile: contact)
|
|
}
|
|
// Post notification
|
|
let notificationCenter = NotificationCenter.default
|
|
notificationCenter.post(name: .contactUpdated, object: contact.sessionID)
|
|
if contact.sessionID == getUserHexEncodedPublicKey() {
|
|
notificationCenter.post(name: Notification.Name(kNSNotificationName_LocalProfileDidChange), object: nil)
|
|
} else {
|
|
let userInfo = [ kNSNotificationKey_ProfileRecipientId : contact.sessionID ]
|
|
notificationCenter.post(name: Notification.Name(kNSNotificationName_OtherUsersProfileDidChange), object: nil, userInfo: userInfo)
|
|
}
|
|
}
|
|
}
|
|
|
|
@objc public func getAllContacts() -> Set<Contact> {
|
|
var result: Set<Contact> = []
|
|
Storage.read { transaction in
|
|
transaction.enumerateRows(inCollection: Storage.contactCollection) { _, object, _, _ in
|
|
guard let contact = object as? Contact else { return }
|
|
result.insert(contact)
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
}
|