mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 14:45:21 +00:00
Send forwarded messages in groups
This commit is contained in:
@@ -355,6 +355,8 @@ public final class PendingMessageManager {
|
|||||||
strongSelf.collectUploadingInfo(messageContext: messageContext, message: message)
|
strongSelf.collectUploadingInfo(messageContext: messageContext, message: message)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var messagesToUpload: [(PendingMessageContext, Message, PendingMessageUploadedContentType, Signal<PendingMessageUploadedContentResult, PendingMessageUploadError>)] = []
|
||||||
|
var messagesToForward: [PeerIdAndNamespace: [(PendingMessageContext, Message, ForwardSourceInfoAttribute)]] = [:]
|
||||||
for (messageContext, _) in strongSelf.messageContexts.values.compactMap({ messageContext -> (PendingMessageContext, Message)? in
|
for (messageContext, _) in strongSelf.messageContexts.values.compactMap({ messageContext -> (PendingMessageContext, Message)? in
|
||||||
if case let .collectingInfo(message) = messageContext.state {
|
if case let .collectingInfo(message) = messageContext.state {
|
||||||
return (messageContext, message)
|
return (messageContext, message)
|
||||||
@@ -365,16 +367,58 @@ public final class PendingMessageManager {
|
|||||||
return lhs.1.index < rhs.1.index
|
return lhs.1.index < rhs.1.index
|
||||||
}) {
|
}) {
|
||||||
if case let .collectingInfo(message) = messageContext.state {
|
if case let .collectingInfo(message) = messageContext.state {
|
||||||
let (contentUploadSignal, contentType) = messageContentToUpload(network: strongSelf.network, postbox: strongSelf.postbox, auxiliaryMethods: strongSelf.auxiliaryMethods, transformOutgoingMessageMedia: strongSelf.transformOutgoingMessageMedia, messageMediaPreuploadManager: strongSelf.messageMediaPreuploadManager, revalidationContext: strongSelf.revalidationContext, forceReupload: messageContext.forcedReuploadOnce, isGrouped: message.groupingKey != nil, message: message)
|
let contentToUpload = messageContentToUpload(network: strongSelf.network, postbox: strongSelf.postbox, auxiliaryMethods: strongSelf.auxiliaryMethods, transformOutgoingMessageMedia: strongSelf.transformOutgoingMessageMedia, messageMediaPreuploadManager: strongSelf.messageMediaPreuploadManager, revalidationContext: strongSelf.revalidationContext, forceReupload: messageContext.forcedReuploadOnce, isGrouped: message.groupingKey != nil, message: message)
|
||||||
messageContext.contentType = contentType
|
messageContext.contentType = contentToUpload.type
|
||||||
|
switch contentToUpload {
|
||||||
if strongSelf.canBeginUploadingMessage(id: message.id, type: contentType) {
|
case let .immediate(result, type):
|
||||||
strongSelf.beginUploadingMessage(messageContext: messageContext, id: message.id, groupId: message.groupingKey, uploadSignal: contentUploadSignal)
|
var isForward = false
|
||||||
} else {
|
switch result {
|
||||||
messageContext.state = .waitingForUploadToStart(groupId: message.groupingKey, upload: contentUploadSignal)
|
case let .content(content):
|
||||||
|
switch content.content {
|
||||||
|
case let .forward(forwardInfo):
|
||||||
|
isForward = true
|
||||||
|
let peerIdAndNamespace = PeerIdAndNamespace(peerId: message.id.peerId, namespace: message.id.namespace)
|
||||||
|
if messagesToForward[peerIdAndNamespace] == nil {
|
||||||
|
messagesToForward[peerIdAndNamespace] = []
|
||||||
|
}
|
||||||
|
messagesToForward[peerIdAndNamespace]!.append((messageContext, message, forwardInfo))
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if !isForward {
|
||||||
|
messagesToUpload.append((messageContext, message, type, .single(result)))
|
||||||
|
}
|
||||||
|
case let .signal(signal, type):
|
||||||
|
messagesToUpload.append((messageContext, message, type, signal))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (messageContext, message, type, contentUploadSignal) in messagesToUpload {
|
||||||
|
if strongSelf.canBeginUploadingMessage(id: message.id, type: type) {
|
||||||
|
strongSelf.beginUploadingMessage(messageContext: messageContext, id: message.id, groupId: message.groupingKey, uploadSignal: contentUploadSignal)
|
||||||
|
} else {
|
||||||
|
messageContext.state = .waitingForUploadToStart(groupId: message.groupingKey, upload: contentUploadSignal)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (_, messages) in messagesToForward {
|
||||||
|
for (context, _, _) in messages {
|
||||||
|
context.state = .sending(groupId: nil)
|
||||||
|
}
|
||||||
|
let sendMessage: Signal<PendingMessageResult, NoError> = strongSelf.sendGroupMessagesContent(network: strongSelf.network, postbox: strongSelf.postbox, stateManager: strongSelf.stateManager, group: messages.map { data in
|
||||||
|
let (_, message, forwardInfo) = data
|
||||||
|
return (message.id, PendingMessageUploadedContentAndReuploadInfo(content: .forward(forwardInfo), reuploadInfo: nil))
|
||||||
|
})
|
||||||
|
|> map { next -> PendingMessageResult in
|
||||||
|
return .progress(1.0)
|
||||||
|
}
|
||||||
|
messages[0].0.sendDisposable.set((sendMessage
|
||||||
|
|> deliverOn(strongSelf.queue)).start())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
@@ -502,7 +546,8 @@ public final class PendingMessageManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return .complete()
|
return .complete()
|
||||||
}).start(next: { [weak self] next in
|
}
|
||||||
|
|> deliverOn(queue)).start(next: { [weak self] next in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
assert(strongSelf.queue.isCurrent())
|
assert(strongSelf.queue.isCurrent())
|
||||||
|
|
||||||
|
|||||||
@@ -38,11 +38,25 @@ enum PendingMessageUploadError {
|
|||||||
case generic
|
case generic
|
||||||
}
|
}
|
||||||
|
|
||||||
func messageContentToUpload(network: Network, postbox: Postbox, auxiliaryMethods: AccountAuxiliaryMethods, transformOutgoingMessageMedia: TransformOutgoingMessageMedia?, messageMediaPreuploadManager: MessageMediaPreuploadManager, revalidationContext: MediaReferenceRevalidationContext, forceReupload: Bool, isGrouped: Bool, message: Message) -> (Signal<PendingMessageUploadedContentResult, PendingMessageUploadError>, PendingMessageUploadedContentType) {
|
enum MessageContentToUpload {
|
||||||
|
case signal(Signal<PendingMessageUploadedContentResult, PendingMessageUploadError>, PendingMessageUploadedContentType)
|
||||||
|
case immediate(PendingMessageUploadedContentResult, PendingMessageUploadedContentType)
|
||||||
|
|
||||||
|
var type: PendingMessageUploadedContentType {
|
||||||
|
switch self {
|
||||||
|
case let .signal(_, type):
|
||||||
|
return type
|
||||||
|
case let .immediate(_, type):
|
||||||
|
return type
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func messageContentToUpload(network: Network, postbox: Postbox, auxiliaryMethods: AccountAuxiliaryMethods, transformOutgoingMessageMedia: TransformOutgoingMessageMedia?, messageMediaPreuploadManager: MessageMediaPreuploadManager, revalidationContext: MediaReferenceRevalidationContext, forceReupload: Bool, isGrouped: Bool, message: Message) -> MessageContentToUpload {
|
||||||
return messageContentToUpload(network: network, postbox: postbox, auxiliaryMethods: auxiliaryMethods, transformOutgoingMessageMedia: transformOutgoingMessageMedia, messageMediaPreuploadManager: messageMediaPreuploadManager, revalidationContext: revalidationContext, forceReupload: forceReupload, isGrouped: isGrouped, peerId: message.id.peerId, messageId: message.id, attributes: message.attributes, text: message.text, media: message.media)
|
return messageContentToUpload(network: network, postbox: postbox, auxiliaryMethods: auxiliaryMethods, transformOutgoingMessageMedia: transformOutgoingMessageMedia, messageMediaPreuploadManager: messageMediaPreuploadManager, revalidationContext: revalidationContext, forceReupload: forceReupload, isGrouped: isGrouped, peerId: message.id.peerId, messageId: message.id, attributes: message.attributes, text: message.text, media: message.media)
|
||||||
}
|
}
|
||||||
|
|
||||||
func messageContentToUpload(network: Network, postbox: Postbox, auxiliaryMethods: AccountAuxiliaryMethods, transformOutgoingMessageMedia: TransformOutgoingMessageMedia?, messageMediaPreuploadManager: MessageMediaPreuploadManager, revalidationContext: MediaReferenceRevalidationContext, forceReupload: Bool, isGrouped: Bool, peerId: PeerId, messageId: MessageId?, attributes: [MessageAttribute], text: String, media: [Media]) -> (Signal<PendingMessageUploadedContentResult, PendingMessageUploadError>, PendingMessageUploadedContentType) {
|
func messageContentToUpload(network: Network, postbox: Postbox, auxiliaryMethods: AccountAuxiliaryMethods, transformOutgoingMessageMedia: TransformOutgoingMessageMedia?, messageMediaPreuploadManager: MessageMediaPreuploadManager, revalidationContext: MediaReferenceRevalidationContext, forceReupload: Bool, isGrouped: Bool, peerId: PeerId, messageId: MessageId?, attributes: [MessageAttribute], text: String, media: [Media]) -> MessageContentToUpload {
|
||||||
var contextResult: OutgoingChatContextResultMessageAttribute?
|
var contextResult: OutgoingChatContextResultMessageAttribute?
|
||||||
var autoremoveAttribute: AutoremoveTimeoutMessageAttribute?
|
var autoremoveAttribute: AutoremoveTimeoutMessageAttribute?
|
||||||
for attribute in attributes {
|
for attribute in attributes {
|
||||||
@@ -65,15 +79,15 @@ func messageContentToUpload(network: Network, postbox: Postbox, auxiliaryMethods
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let media = media.first as? TelegramMediaAction, media.action == .historyScreenshot {
|
if let media = media.first as? TelegramMediaAction, media.action == .historyScreenshot {
|
||||||
return (.single(.content(PendingMessageUploadedContentAndReuploadInfo(content: .messageScreenshot, reuploadInfo: nil))), .none)
|
return .immediate(.content(PendingMessageUploadedContentAndReuploadInfo(content: .messageScreenshot, reuploadInfo: nil)), .none)
|
||||||
} else if let forwardInfo = forwardInfo {
|
} else if let forwardInfo = forwardInfo {
|
||||||
return (.single(.content(PendingMessageUploadedContentAndReuploadInfo(content: .forward(forwardInfo), reuploadInfo: nil))), .text)
|
return .immediate(.content(PendingMessageUploadedContentAndReuploadInfo(content: .forward(forwardInfo), reuploadInfo: nil)), .text)
|
||||||
} else if let contextResult = contextResult {
|
} else if let contextResult = contextResult {
|
||||||
return (.single(.content(PendingMessageUploadedContentAndReuploadInfo(content: .chatContextResult(contextResult), reuploadInfo: nil))), .text)
|
return .immediate(.content(PendingMessageUploadedContentAndReuploadInfo(content: .chatContextResult(contextResult), reuploadInfo: nil)), .text)
|
||||||
} else if let media = media.first, let mediaResult = mediaContentToUpload(network: network, postbox: postbox, auxiliaryMethods: auxiliaryMethods, transformOutgoingMessageMedia: transformOutgoingMessageMedia, messageMediaPreuploadManager: messageMediaPreuploadManager, revalidationContext: revalidationContext, forceReupload: forceReupload, isGrouped: isGrouped, peerId: peerId, media: media, text: text, autoremoveAttribute: autoremoveAttribute, messageId: messageId, attributes: attributes) {
|
} else if let media = media.first, let mediaResult = mediaContentToUpload(network: network, postbox: postbox, auxiliaryMethods: auxiliaryMethods, transformOutgoingMessageMedia: transformOutgoingMessageMedia, messageMediaPreuploadManager: messageMediaPreuploadManager, revalidationContext: revalidationContext, forceReupload: forceReupload, isGrouped: isGrouped, peerId: peerId, media: media, text: text, autoremoveAttribute: autoremoveAttribute, messageId: messageId, attributes: attributes) {
|
||||||
return (mediaResult, .media)
|
return .signal(mediaResult, .media)
|
||||||
} else {
|
} else {
|
||||||
return (.single(.content(PendingMessageUploadedContentAndReuploadInfo(content: .text(text), reuploadInfo: nil))), .text)
|
return .signal(.single(.content(PendingMessageUploadedContentAndReuploadInfo(content: .text(text), reuploadInfo: nil))), .text)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user