pull/318/head
nielsandriesse 4 years ago
parent c67f5f61a7
commit e8661cf4d7

@ -11,7 +11,11 @@ internal extension OpenGroupMessage {
let quote: OpenGroupMessage.Quote? = { let quote: OpenGroupMessage.Quote? = {
if let quote = message.quote { if let quote = message.quote {
guard quote.isValid else { return nil } guard quote.isValid else { return nil }
let quotedMessageServerID = TSIncomingMessage.find(withAuthorId: quote.publicKey!, timestamp: quote.timestamp!, transaction: transaction)?.openGroupServerMessageID var quotedMessageServerID: UInt64?
TSDatabaseSecondaryIndexes.enumerateMessages(withTimestamp: quote.timestamp!, with: { _, key, _ in
guard let message = TSInteraction.fetch(uniqueId: key, transaction: transaction) as? TSMessage else { return }
quotedMessageServerID = message.openGroupServerMessageID
}, using: transaction)
let quotedMessageBody = quote.text ?? String(quote.timestamp!) // The back-end doesn't accept messages without a body so we use this as a workaround let quotedMessageBody = quote.text ?? String(quote.timestamp!) // The back-end doesn't accept messages without a body so we use this as a workaround
if let quotedAttachmentID = quote.attachmentID, let index = attachmentIDs.firstIndex(of: quotedAttachmentID) { if let quotedAttachmentID = quote.attachmentID, let index = attachmentIDs.firstIndex(of: quotedAttachmentID) {
attachmentIDs.remove(at: index) attachmentIDs.remove(at: index)
@ -62,7 +66,7 @@ internal extension OpenGroupMessage {
return OpenGroupMessage.Attachment( return OpenGroupMessage.Attachment(
kind: .attachment, kind: .attachment,
server: server, server: server,
serverID: 0, serverID: attachment.serverId,
contentType: attachment.contentType, contentType: attachment.contentType,
size: UInt(attachment.byteCount), size: UInt(attachment.byteCount),
fileName: fileName, fileName: fileName,

@ -43,31 +43,34 @@ public final class MessageSender : NSObject {
public static let shared = MessageSender() // FIXME: Remove once requestSenderKey is static public static let shared = MessageSender() // FIXME: Remove once requestSenderKey is static
// MARK: Preparation // MARK: Preparation
public static func prep(_ attachments: [SignalAttachment], for message: VisibleMessage, using transaction: YapDatabaseReadWriteTransaction) { public static func prep(_ signalAttachments: [SignalAttachment], for message: VisibleMessage, using transaction: YapDatabaseReadWriteTransaction) {
guard let tsMessage = TSOutgoingMessage.find(withTimestamp: message.sentTimestamp!) else { guard let tsMessage = TSOutgoingMessage.find(withTimestamp: message.sentTimestamp!) else {
#if DEBUG #if DEBUG
preconditionFailure() preconditionFailure()
#endif #else
return return
#endif
} }
// Anything added to message.attachmentIDs will be uploaded by an UploadAttachmentJob. Any attachment IDs added to tsMessage will var attachments: [TSAttachmentStream] = []
// make it render as an attachment (not what we want in the case of a link preview or quoted attachment). signalAttachments.forEach {
var streams: [TSAttachmentStream] = [] let attachment = TSAttachmentStream(contentType: $0.mimeType, byteCount: UInt32($0.dataLength), sourceFilename: $0.sourceFilename,
attachments.forEach {
let stream = TSAttachmentStream(contentType: $0.mimeType, byteCount: UInt32($0.dataLength), sourceFilename: $0.sourceFilename,
caption: $0.captionText, albumMessageId: tsMessage.uniqueId!) caption: $0.captionText, albumMessageId: tsMessage.uniqueId!)
streams.append(stream) attachments.append(attachment)
stream.write($0.dataSource) attachment.write($0.dataSource)
stream.save(with: transaction) attachment.save(with: transaction)
} }
// The line below locally generates a thumbnail for the quoted attachment. It just needs to happen at some point during the
// message sending process.
tsMessage.quotedMessage?.createThumbnailAttachmentsIfNecessary(with: transaction) tsMessage.quotedMessage?.createThumbnailAttachmentsIfNecessary(with: transaction)
var linkPreviewAttachmentID: String? var linkPreviewAttachmentID: String?
if let id = tsMessage.linkPreview?.imageAttachmentId, if let id = tsMessage.linkPreview?.imageAttachmentId,
let stream = TSAttachment.fetch(uniqueId: id, transaction: transaction) as? TSAttachmentStream { let attachment = TSAttachment.fetch(uniqueId: id, transaction: transaction) as? TSAttachmentStream {
linkPreviewAttachmentID = id linkPreviewAttachmentID = id
streams.append(stream) attachments.append(attachment)
} }
message.attachmentIDs = streams.map { $0.uniqueId! } // Anything added to message.attachmentIDs will be uploaded by an UploadAttachmentJob. Any attachment IDs added to tsMessage will
// make it render as an attachment (not what we want in the case of a link preview or quoted attachment).
message.attachmentIDs = attachments.map { $0.uniqueId! }
tsMessage.attachmentIds.addObjects(from: message.attachmentIDs) tsMessage.attachmentIds.addObjects(from: message.attachmentIDs)
if let id = linkPreviewAttachmentID { tsMessage.attachmentIds.remove(id) } if let id = linkPreviewAttachmentID { tsMessage.attachmentIds.remove(id) }
tsMessage.save(with: transaction) tsMessage.save(with: transaction)
@ -260,9 +263,10 @@ public final class MessageSender : NSObject {
guard let message = message as? VisibleMessage else { guard let message = message as? VisibleMessage else {
#if DEBUG #if DEBUG
preconditionFailure() preconditionFailure()
#endif #else
seal.reject(Error.invalidMessage) seal.reject(Error.invalidMessage)
return promise return promise
#endif
} }
guard message.isValid else { seal.reject(Error.invalidMessage); return promise } guard message.isValid else { seal.reject(Error.invalidMessage); return promise }
// Convert the message to an open group message // Convert the message to an open group message

@ -75,7 +75,7 @@ public final class OpenGroupPoller : NSObject {
dataMessageProto.setBody(body) dataMessageProto.setBody(body)
dataMessageProto.setTimestamp(message.timestamp) dataMessageProto.setTimestamp(message.timestamp)
// Attachments // Attachments
let attachments: [SNProtoAttachmentPointer] = message.attachments.compactMap { attachment in let attachmentProtos: [SNProtoAttachmentPointer] = message.attachments.compactMap { attachment in
guard attachment.kind == .attachment else { return nil } guard attachment.kind == .attachment else { return nil }
let attachmentProto = SNProtoAttachmentPointer.builder(id: attachment.serverID) let attachmentProto = SNProtoAttachmentPointer.builder(id: attachment.serverID)
attachmentProto.setContentType(attachment.contentType) attachmentProto.setContentType(attachment.contentType)
@ -88,7 +88,7 @@ public final class OpenGroupPoller : NSObject {
attachmentProto.setUrl(attachment.url) attachmentProto.setUrl(attachment.url)
return try! attachmentProto.build() return try! attachmentProto.build()
} }
dataMessageProto.setAttachments(attachments) dataMessageProto.setAttachments(attachmentProtos)
// Link preview // Link preview
if let linkPreview = message.attachments.first(where: { $0.kind == .linkPreview }) { if let linkPreview = message.attachments.first(where: { $0.kind == .linkPreview }) {
let linkPreviewProto = SNProtoDataMessagePreview.builder(url: linkPreview.linkPreviewURL!) let linkPreviewProto = SNProtoDataMessagePreview.builder(url: linkPreview.linkPreviewURL!)

Loading…
Cancel
Save