From 7db801478cdc8b40589489dbf81efbd465a05306 Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Fri, 11 Mar 2022 15:38:38 -0800 Subject: [PATCH] Include authorUuid when sending replies Co-authored-by: Josh Perez <60019601+josh-signal@users.noreply.github.com> --- ts/jobs/helpers/sendNormalMessage.ts | 43 ++++++++++++++++------------ ts/jobs/helpers/sendReaction.ts | 13 ++++++++- ts/state/ducks/stories.ts | 4 +-- ts/textsecure/SendMessage.ts | 30 +++++++++---------- ts/types/Util.ts | 7 +++++ 5 files changed, 61 insertions(+), 36 deletions(-) diff --git a/ts/jobs/helpers/sendNormalMessage.ts b/ts/jobs/helpers/sendNormalMessage.ts index eee839166..d095bdf6c 100644 --- a/ts/jobs/helpers/sendNormalMessage.ts +++ b/ts/jobs/helpers/sendNormalMessage.ts @@ -19,7 +19,7 @@ import { } from '../../state/selectors/message'; import type { AttachmentType } from '../../textsecure/SendMessage'; import type { LinkPreviewType } from '../../types/message/LinkPreviews'; -import type { BodyRangesType } from '../../types/Util'; +import type { BodyRangesType, StoryContextType } from '../../types/Util'; import type { WhatIsThis } from '../../window.d'; import type { LoggerType } from '../../types/Logging'; import type { @@ -141,7 +141,7 @@ export async function sendNormalMessage( preview, quote, sticker, - storyContextTimestamp, + storyContext, } = await getMessageSendData({ log, message }); let messageSendPromise: Promise; @@ -254,7 +254,7 @@ export async function sendNormalMessage( groupId: undefined, profileKey, options: sendOptions, - storyContextTimestamp, + storyContext, }); } @@ -402,7 +402,7 @@ async function getMessageSendData({ preview: Array; quote: WhatIsThis; sticker: WhatIsThis; - storyContextTimestamp?: number; + storyContext?: StoryContextType; }> { const { loadAttachmentData, @@ -426,18 +426,22 @@ async function getMessageSendData({ messageTimestamp = Date.now(); } - const [attachmentsWithData, preview, quote, sticker] = await Promise.all([ - // We don't update the caches here because (1) we expect the caches to be populated - // on initial send, so they should be there in the 99% case (2) if you're retrying - // a failed message across restarts, we don't touch the cache for simplicity. If - // sends are failing, let's not add the complication of a cache. - Promise.all((message.get('attachments') ?? []).map(loadAttachmentData)), - message.cachedOutgoingPreviewData || - loadPreviewData(message.get('preview')), - message.cachedOutgoingQuoteData || loadQuoteData(message.get('quote')), - message.cachedOutgoingStickerData || - loadStickerData(message.get('sticker')), - ]); + const storyId = message.get('storyId'); + + const [attachmentsWithData, preview, quote, sticker, storyMessage] = + await Promise.all([ + // We don't update the caches here because (1) we expect the caches to be populated + // on initial send, so they should be there in the 99% case (2) if you're retrying + // a failed message across restarts, we don't touch the cache for simplicity. If + // sends are failing, let's not add the complication of a cache. + Promise.all((message.get('attachments') ?? []).map(loadAttachmentData)), + message.cachedOutgoingPreviewData || + loadPreviewData(message.get('preview')), + message.cachedOutgoingQuoteData || loadQuoteData(message.get('quote')), + message.cachedOutgoingStickerData || + loadStickerData(message.get('sticker')), + storyId ? getMessageById(storyId) : undefined, + ]); const { body, attachments } = window.Whisper.Message.getLongMessageAttachment( { @@ -457,8 +461,11 @@ async function getMessageSendData({ preview, quote, sticker, - storyContextTimestamp: message.get('storyId') - ? message.get('sent_at') + storyContext: storyMessage + ? { + authorUuid: storyMessage.get('sourceUuid'), + timestamp: storyMessage.get('sent_at'), + } : undefined, }; } diff --git a/ts/jobs/helpers/sendReaction.ts b/ts/jobs/helpers/sendReaction.ts index a0d837db8..6311c1441 100644 --- a/ts/jobs/helpers/sendReaction.ts +++ b/ts/jobs/helpers/sendReaction.ts @@ -204,6 +204,12 @@ export async function sendReaction( return; } + let storyMessage: MessageModel | undefined; + const storyId = message.get('storyId'); + if (storyId) { + storyMessage = await getMessageById(storyId); + } + log.info('sending direct reaction message'); promise = window.textsecure.messaging.sendMessageToIdentifier({ identifier: recipientIdentifiersWithoutMe[0], @@ -220,7 +226,12 @@ export async function sendReaction( groupId: undefined, profileKey, options: sendOptions, - storyContextTimestamp: message.get('sent_at'), + storyContext: storyMessage + ? { + authorUuid: storyMessage.get('sourceUuid'), + timestamp: storyMessage.get('sent_at'), + } + : undefined, }); } else { log.info('sending group reaction message'); diff --git a/ts/state/ducks/stories.ts b/ts/state/ducks/stories.ts index 9161ead1a..1cacd2f96 100644 --- a/ts/state/ducks/stories.ts +++ b/ts/state/ducks/stories.ts @@ -160,7 +160,7 @@ function reactToStory( function replyToStory( conversationId: string, - message: string, + messageBody: string, mentions: Array, timestamp: number, story: StoryViewType @@ -169,7 +169,7 @@ function replyToStory( if (conversation) { conversation.enqueueMessageForSend( - message, + messageBody, [], undefined, undefined, diff --git a/ts/textsecure/SendMessage.ts b/ts/textsecure/SendMessage.ts index 4af8a2a1b..f5752eba1 100644 --- a/ts/textsecure/SendMessage.ts +++ b/ts/textsecure/SendMessage.ts @@ -59,7 +59,7 @@ import { SendMessageProtoError, HTTPError, } from './Errors'; -import type { BodyRangesType } from '../types/Util'; +import type { BodyRangesType, StoryContextType } from '../types/Util'; import type { LinkPreviewImage, LinkPreviewMetadata, @@ -193,7 +193,7 @@ export type MessageOptionsType = { timestamp: number; mentions?: BodyRangesType; groupCallUpdate?: GroupCallUpdateType; - storyContextTimestamp?: number; + storyContext?: StoryContextType; }; export type GroupSendOptionsType = { attachments?: Array; @@ -211,7 +211,7 @@ export type GroupSendOptionsType = { timestamp: number; mentions?: BodyRangesType; groupCallUpdate?: GroupCallUpdateType; - storyContextTimestamp?: number; + storyContext?: StoryContextType; }; class Message { @@ -256,7 +256,7 @@ class Message { groupCallUpdate?: GroupCallUpdateType; - storyContextTimestamp?: number; + storyContext?: StoryContextType; constructor(options: MessageOptionsType) { this.attachments = options.attachments || []; @@ -276,7 +276,7 @@ class Message { this.deletedForEveryoneTimestamp = options.deletedForEveryoneTimestamp; this.mentions = options.mentions; this.groupCallUpdate = options.groupCallUpdate; - this.storyContextTimestamp = options.storyContextTimestamp; + this.storyContext = options.storyContext; if (!(this.recipients instanceof Array)) { throw new Error('Invalid recipient list'); @@ -477,14 +477,14 @@ class Message { proto.groupCallUpdate = groupCallUpdate; } - if (this.storyContextTimestamp) { + if (this.storyContext) { const { StoryContext } = Proto.DataMessage; const storyContext = new StoryContext(); - storyContext.authorUuid = String( - window.textsecure.storage.user.getCheckedUuid() - ); - storyContext.sentTimestamp = this.storyContextTimestamp; + if (this.storyContext.authorUuid) { + storyContext.authorUuid = this.storyContext.authorUuid; + } + storyContext.sentTimestamp = this.storyContext.timestamp; proto.storyContext = storyContext; } @@ -798,7 +798,7 @@ export default class MessageSender { quote, reaction, sticker, - storyContextTimestamp, + storyContext, timestamp, } = options; @@ -853,7 +853,7 @@ export default class MessageSender { reaction, recipients, sticker, - storyContextTimestamp, + storyContext, timestamp, }; } @@ -1043,7 +1043,7 @@ export default class MessageSender { groupId, profileKey, options, - storyContextTimestamp, + storyContext, }: Readonly<{ identifier: string; messageText: string | undefined; @@ -1058,7 +1058,7 @@ export default class MessageSender { contentHint: number; groupId: string | undefined; profileKey?: Uint8Array; - storyContextTimestamp?: number; + storyContext?: StoryContextType; options?: SendOptionsType; }>): Promise { return this.sendMessage({ @@ -1074,7 +1074,7 @@ export default class MessageSender { deletedForEveryoneTimestamp, expireTimer, profileKey, - storyContextTimestamp, + storyContext, }, contentHint, groupId, diff --git a/ts/types/Util.ts b/ts/types/Util.ts index b28845fd3..6b14303b1 100644 --- a/ts/types/Util.ts +++ b/ts/types/Util.ts @@ -1,6 +1,8 @@ // Copyright 2018-2021 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only +import type { UUIDStringType } from './UUID'; + export type BodyRangeType = { start: number; length: number; @@ -11,6 +13,11 @@ export type BodyRangeType = { export type BodyRangesType = Array; +export type StoryContextType = { + authorUuid?: UUIDStringType; + timestamp: number; +}; + export type RenderTextCallbackType = (options: { text: string; key: number;