From 798d78286919852699e9f02f73e6eaa9e82aa83c Mon Sep 17 00:00:00 2001 From: devlikepro Date: Tue, 14 Apr 2026 14:56:04 +0700 Subject: [PATCH] [core] Add replyTo.media if possible - all engines --- src/core/engines/gows/session.gows.core.ts | 13 ++++++++ src/core/engines/noweb/session.noweb.core.ts | 31 ++++++++++++++++---- src/core/engines/webjs/session.webjs.core.ts | 8 +++++ src/core/engines/wpp/session.wpp.core.ts | 9 ++++++ src/structures/message.dto.ts | 11 +++++++ 5 files changed, 67 insertions(+), 5 deletions(-) diff --git a/src/core/engines/gows/session.gows.core.ts b/src/core/engines/gows/session.gows.core.ts index 14026050..d4e12b2f 100644 --- a/src/core/engines/gows/session.gows.core.ts +++ b/src/core/engines/gows/session.gows.core.ts @@ -2196,6 +2196,16 @@ export class WhatsappSessionGoWSCore extends WhatsappSession { const media = await this.downloadMediaSafe(message); wamessage.media = media; } + if (downloadMedia && wamessage.replyTo?.hasMedia) { + const msg = { + Message: wamessage.replyTo._data, + Info: { + Chat: message.Info.Chat, + ID: wamessage.replyTo.id || '', + }, + }; + wamessage.replyTo.media = await this.downloadMediaSafe(msg); + } return wamessage; } @@ -2405,10 +2415,13 @@ export class WhatsappSessionGoWSCore extends WhatsappSession { return null; } const body = extractBody(quotedMessage); + const mediaContent = extractMediaContent(quotedMessage); return { id: contextInfo.stanzaID, participant: toCusFormat(contextInfo.participant), body: body, + hasMedia: Boolean(mediaContent), + media: null, _data: quotedMessage, }; } diff --git a/src/core/engines/noweb/session.noweb.core.ts b/src/core/engines/noweb/session.noweb.core.ts index 56baedc6..92ebb8ab 100644 --- a/src/core/engines/noweb/session.noweb.core.ts +++ b/src/core/engines/noweb/session.noweb.core.ts @@ -1,5 +1,5 @@ -import { Browsers, WABrowserDescription } from '@adiwajshing/baileys'; import makeWASocket, { + Browsers, Chat, Contact, decryptPollVote, @@ -19,6 +19,7 @@ import makeWASocket, { PresenceData, proto, SocketConfig, + WABrowserDescription, WAMessageContent, WAMessageKey, WAMessageUpdate, @@ -183,13 +184,13 @@ import * as NodeCache from 'node-cache'; import { filter, fromEvent, + groupBy, identity, merge, mergeAll, mergeMap, Observable, partition, - groupBy, share, tap, } from 'rxjs'; @@ -2482,9 +2483,24 @@ export class WhatsappSessionNoWebCore extends WhatsappSession { return null; } // Media - if (downloadMedia) { - const media = await this.downloadMediaSafe(message); - wamessage.media = media; + if (downloadMedia && wamessage.hasMedia) { + wamessage.media = await this.downloadMediaSafe(message); + } + + if (downloadMedia && wamessage.replyTo?.hasMedia) { + const mediaContent = extractMediaContent(wamessage.replyTo._data); + const m = { + message: wamessage.replyTo._data, + key: { + id: + wamessage.replyTo.id || + mediaContent.fileSha256 || + mediaContent.fileEncSha256 || + mediaContent.mediaKeyTimestamp, + remoteJid: message.key.remoteJid, + }, + }; + wamessage.replyTo.media = await this.downloadMediaSafe(m); } return wamessage; } @@ -2544,10 +2560,15 @@ export class WhatsappSessionNoWebCore extends WhatsappSession { return null; } const body = extractBody(quotedMessage); + const mediaContent = extractMediaContent(quotedMessage); return { id: contextInfo.stanzaId, participant: toCusFormat(contextInfo.participant), body: body, + // Media + hasMedia: Boolean(mediaContent), + media: null, + // Data _data: quotedMessage, }; } diff --git a/src/core/engines/webjs/session.webjs.core.ts b/src/core/engines/webjs/session.webjs.core.ts index ed3c3b44..8f3e96e4 100644 --- a/src/core/engines/webjs/session.webjs.core.ts +++ b/src/core/engines/webjs/session.webjs.core.ts @@ -1991,6 +1991,12 @@ export class WhatsappSessionWebJSCore extends WhatsappSession { const media = await this.downloadMediaSafe(message); wamessage.media = media; } + if (downloadMedia && wamessage.replyTo?.hasMedia) { + const quotedMessage = await message.getQuotedMessage().catch(() => null); + if (quotedMessage) { + wamessage.replyTo.media = await this.downloadMediaSafe(quotedMessage); + } + } return wamessage; } @@ -2158,6 +2164,8 @@ export class WhatsappSessionWebJSCore extends WhatsappSession { id: quotedStanzaId || quotedMsg?.id?.id, participant: quotedParticipant, body: quotedMsg?.caption || quotedMsg?.body, + hasMedia: Boolean(quotedMsg?.directPath), + media: null, _data: quotedMsg, }; } diff --git a/src/core/engines/wpp/session.wpp.core.ts b/src/core/engines/wpp/session.wpp.core.ts index 97f3f57b..15d60e02 100644 --- a/src/core/engines/wpp/session.wpp.core.ts +++ b/src/core/engines/wpp/session.wpp.core.ts @@ -2089,12 +2089,15 @@ export class WhatsappSessionWPPCore extends WhatsappSession { quotedMessage?.author || quotedMessage?.from || null; + const hasMedia = getHasMedia(quotedMessage); return { id: quotedMessageId, participant: toCusFormat( Deserialized(quotedParticipant) || quotedParticipant, ), body: getMessageBody(quotedMessage), + hasMedia: hasMedia, + media: null, _data: quotedMessage, }; } @@ -2105,6 +2108,12 @@ export class WhatsappSessionWPPCore extends WhatsappSession { const media = await this.downloadMediaSafe(message); wamessage.media = media; } + if (downloadMedia && wamessage.replyTo?.hasMedia) { + const quotedMessage = message?.quotedMsg || message?._data?.quotedMsg; + if (quotedMessage) { + wamessage.replyTo.media = await this.downloadMediaSafe(quotedMessage); + } + } return wamessage; } diff --git a/src/structures/message.dto.ts b/src/structures/message.dto.ts index 5cd18ded..728442b5 100644 --- a/src/structures/message.dto.ts +++ b/src/structures/message.dto.ts @@ -3,6 +3,7 @@ import { ChatIdProperty, MessageIdOnlyProperty, } from '@waha/structures/properties.dto'; +import { WAMedia } from '@waha/structures/media.dto'; export class ReplyToMessage { @MessageIdOnlyProperty() @@ -16,6 +17,16 @@ export class ReplyToMessage { }) body?: string; + @ApiProperty({ + description: 'Indicates if the message has media available for download', + }) + hasMedia: boolean; + + @ApiProperty({ + description: 'Media object for the message if any and downloaded', + }) + media?: WAMedia; + @ApiProperty({ description: "Raw data from reply's message", })