|  |  |  | // Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import Foundation | 
					
						
							|  |  |  | import GRDB | 
					
						
							|  |  |  | import SessionSnodeKit | 
					
						
							|  |  |  | import SessionUtilitiesKit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extension MessageReceiver { | 
					
						
							|  |  |  |     internal static func handleDataExtractionNotification( | 
					
						
							|  |  |  |         _ db: Database, | 
					
						
							|  |  |  |         threadId: String, | 
					
						
							|  |  |  |         threadVariant: SessionThread.Variant, | 
					
						
							|  |  |  |         message: DataExtractionNotification | 
					
						
							|  |  |  |     ) throws { | 
					
						
							|  |  |  |         guard | 
					
						
							|  |  |  |             threadVariant == .contact, | 
					
						
							|  |  |  |             let sender: String = message.sender, | 
					
						
							|  |  |  |             let messageKind: DataExtractionNotification.Kind = message.kind | 
					
						
							|  |  |  |         else { throw MessageReceiverError.invalidMessage } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         let timestampMs: Int64 = ( | 
					
						
							|  |  |  |             message.sentTimestamp.map { Int64($0) } ?? | 
					
						
							|  |  |  |             SnodeAPI.currentOffsetTimestampMs() | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         _ = try Interaction( | 
					
						
							|  |  |  |             serverHash: message.serverHash, | 
					
						
							|  |  |  |             threadId: threadId, | 
					
						
							|  |  |  |             authorId: sender, | 
					
						
							|  |  |  |             variant: { | 
					
						
							|  |  |  |                 switch messageKind { | 
					
						
							|  |  |  |                     case .screenshot: return .infoScreenshotNotification | 
					
						
							|  |  |  |                     case .mediaSaved: return .infoMediaSavedNotification | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             }(), | 
					
						
							|  |  |  |             timestampMs: timestampMs, | 
					
						
							|  |  |  |             wasRead: SessionUtil.timestampAlreadyRead( | 
					
						
							|  |  |  |                 threadId: threadId, | 
					
						
							|  |  |  |                 threadVariant: threadVariant, | 
					
						
							|  |  |  |                 timestampMs: (timestampMs * 1000), | 
					
						
							|  |  |  |                 userPublicKey: getUserHexEncodedPublicKey(db), | 
					
						
							|  |  |  |                 openGroup: nil | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         ).inserted(db) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |