// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. import Foundation import GRDB import WebRTC import SessionUtilitiesKit import SessionSnodeKit extension MessageReceiver { public static func handleCallMessage( _ db: Database, threadId: String, threadVariant: SessionThread.Variant, message: CallMessage ) throws { // Only support calls from contact threads guard threadVariant == .contact else { return } switch message.kind { case .preOffer: try MessageReceiver.handleNewCallMessage(db, message: message) case .offer: MessageReceiver.handleOfferCallMessage(db, message: message) case .answer: MessageReceiver.handleAnswerCallMessage(db, message: message) case .provisionalAnswer: break // TODO: Implement case let .iceCandidates(sdpMLineIndexes, sdpMids): guard let currentWebRTCSession = WebRTCSession.current, currentWebRTCSession.uuid == message.uuid else { return } var candidates: [RTCIceCandidate] = [] let sdps = message.sdps for i in 0.. Interaction? { guard (try? Interaction .filter(Interaction.Columns.variant == Interaction.Variant.infoCall) .filter(Interaction.Columns.messageUuid == message.uuid) .isEmpty(db)) .defaulting(to: false), let sender: String = message.sender, let thread: SessionThread = try SessionThread.fetchOne(db, id: sender), !thread.isMessageRequest(db) else { return nil } let currentUserPublicKey: String = getUserHexEncodedPublicKey(db) let messageInfo: CallMessage.MessageInfo = CallMessage.MessageInfo( state: state.defaulting( to: (sender == currentUserPublicKey ? .outgoing : .incoming ) ) ) let timestampMs: Int64 = ( message.sentTimestamp.map { Int64($0) } ?? SnodeAPI.currentOffsetTimestampMs() ) guard let messageInfoData: Data = try? JSONEncoder().encode(messageInfo) else { return nil } return try Interaction( serverHash: message.serverHash, messageUuid: message.uuid, threadId: thread.id, authorId: sender, variant: .infoCall, body: String(data: messageInfoData, encoding: .utf8), timestampMs: timestampMs, wasRead: SessionUtil.timestampAlreadyRead( threadId: thread.id, threadVariant: thread.variant, timestampMs: (timestampMs * 1000), userPublicKey: currentUserPublicKey, openGroup: nil ) ).inserted(db) } }