TM-SGNL-iOS/SignalServiceKit/Messages/Interactions/TSOutgoingDeleteMessage.m
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

121 lines
4.1 KiB
Objective-C

//
// Copyright 2017 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
#import "TSOutgoingDeleteMessage.h"
#import <SignalServiceKit/NSDate+OWS.h>
#import <SignalServiceKit/SignalServiceKit-Swift.h>
NS_ASSUME_NONNULL_BEGIN
@interface TSOutgoingDeleteMessage ()
@property (nonatomic, readonly) uint64_t messageTimestamp;
@property (nonatomic, readonly, nullable) NSString *messageUniqueId;
@property (nonatomic, readonly) BOOL isDeletingStoryMessage;
@end
#pragma mark -
@implementation TSOutgoingDeleteMessage
- (instancetype)initWithThread:(TSThread *)thread
message:(TSOutgoingMessage *)message
transaction:(SDSAnyReadTransaction *)transaction
{
OWSAssertDebug([thread.uniqueId isEqualToString:message.uniqueThreadId]);
TSOutgoingMessageBuilder *messageBuilder = [TSOutgoingMessageBuilder outgoingMessageBuilderWithThread:thread];
self = [super initOutgoingMessageWithBuilder:messageBuilder
additionalRecipients:@[]
explicitRecipients:@[]
skippedRecipients:@[]
transaction:transaction];
if (!self) {
return self;
}
_messageTimestamp = message.timestamp;
_messageUniqueId = message.uniqueId;
_isDeletingStoryMessage = NO;
return self;
}
- (instancetype)initWithThread:(TSThread *)thread
storyMessage:(StoryMessage *)storyMessage
skippedRecipients:(NSArray<SignalServiceAddress *> *)skippedRecipients
transaction:(SDSAnyReadTransaction *)transaction
{
TSOutgoingMessageBuilder *messageBuilder = [TSOutgoingMessageBuilder outgoingMessageBuilderWithThread:thread];
self = [super initOutgoingMessageWithBuilder:messageBuilder
additionalRecipients:@[]
explicitRecipients:@[]
skippedRecipients:skippedRecipients
transaction:transaction];
if (!self) {
return self;
}
_messageTimestamp = storyMessage.timestamp;
_messageUniqueId = storyMessage.uniqueId;
_isDeletingStoryMessage = YES;
return self;
}
- (BOOL)shouldBeSaved
{
return NO;
}
- (BOOL)isStorySend
{
return self.isDeletingStoryMessage;
}
- (nullable SSKProtoDataMessageBuilder *)dataMessageBuilderWithThread:(TSThread *)thread
transaction:(SDSAnyReadTransaction *)transaction
{
SSKProtoDataMessageDeleteBuilder *deleteBuilder =
[SSKProtoDataMessageDelete builderWithTargetSentTimestamp:self.messageTimestamp];
NSError *error;
SSKProtoDataMessageDelete *_Nullable deleteProto = [deleteBuilder buildAndReturnError:&error];
if (error || !deleteProto) {
OWSFailDebug(@"could not build protobuf: %@", error);
return nil;
}
SSKProtoDataMessageBuilder *builder = [super dataMessageBuilderWithThread:thread transaction:transaction];
[builder setTimestamp:self.timestamp];
[builder setDelete:deleteProto];
return builder;
}
- (void)anyUpdateOutgoingMessageWithTransaction:(SDSAnyWriteTransaction *)transaction
block:(void(NS_NOESCAPE ^)(TSOutgoingMessage *_Nonnull))block
{
[super anyUpdateOutgoingMessageWithTransaction:transaction block:block];
// Some older outgoing delete messages didn't store the deleted message's unique id.
// We want to mirror our sending state onto the original message, so it shows up
// within the conversation.
if (self.messageUniqueId) {
TSOutgoingMessage *deletedMessage = [TSOutgoingMessage anyFetchOutgoingMessageWithUniqueId:self.messageUniqueId
transaction:transaction];
[deletedMessage updateWithRecipientAddressStates:self.recipientAddressStates tx:transaction];
}
}
- (NSSet<NSString *> *)relatedUniqueIds
{
return [[super relatedUniqueIds] setByAddingObjectsFromArray:@[ self.messageUniqueId ]];
}
@end
NS_ASSUME_NONNULL_END