diff --git a/src/api/chatting.controller.ts b/src/api/chatting.controller.ts index b6bd9f0b..4c60084f 100644 --- a/src/api/chatting.controller.ts +++ b/src/api/chatting.controller.ts @@ -113,13 +113,6 @@ export class ChattingController { return whatsapp.sendVideo(request); } - @Post('/reply') - @ApiOperation({ summary: 'Reply to a text message' }) - reply(@Body() request: MessageReplyRequest) { - const whatsapp = this.manager.getSession(request.session); - return whatsapp.reply(request); - } - @Post('/sendSeen') sendSeen(@Body() chat: SendSeenRequest) { const whatsapp = this.manager.getSession(chat.session); @@ -172,4 +165,15 @@ export class ChattingController { msg.text = query.text; return whatsapp.sendText(msg); } + + @Post('/reply') + @ApiOperation({ + summary: + 'DEPRECATED - you can set "reply_to" field when sending text, image, etc', + deprecated: true, + }) + reply(@Body() request: MessageReplyRequest) { + const whatsapp = this.manager.getSession(request.session); + return whatsapp.reply(request); + } } diff --git a/src/core/engines/noweb/session.noweb.core.ts b/src/core/engines/noweb/session.noweb.core.ts index 1ccf9d3e..f7a2c2dd 100644 --- a/src/core/engines/noweb/session.noweb.core.ts +++ b/src/core/engines/noweb/session.noweb.core.ts @@ -536,13 +536,14 @@ export class WhatsappSessionNoWebCore extends WhatsappSession { }; } - sendText(request: MessageTextRequest) { + async sendText(request: MessageTextRequest) { const chatId = toJID(this.ensureSuffix(request.chatId)); const message = { text: request.text, mentions: request.mentions?.map(toJID), }; - return this.sock.sendMessage(chatId, message); + const options = await this.getMessageOptions(request); + return this.sock.sendMessage(chatId, message, options); } public deleteMessage(chatId: string, messageId: string) { @@ -587,23 +588,18 @@ export class WhatsappSessionNoWebCore extends WhatsappSession { }; const message = { poll: poll }; const remoteJid = toJID(request.chatId); - const result = await this.sock.sendMessage(remoteJid, message); + const options = await this.getMessageOptions(request); + const result = await this.sock.sendMessage(remoteJid, message, options); return this.toWAMessage(result); } async reply(request: MessageReplyRequest) { - const { id } = parseMessageId(request.reply_to); - const quotedMessage = await this.store.loadMessage( - toJID(request.chatId), - id, - ); + const options = await this.getMessageOptions(request); const message = { text: request.text, mentions: request.mentions?.map(toJID), }; - return await this.sock.sendMessage(request.chatId, message, { - quoted: quotedMessage, - }); + return await this.sock.sendMessage(request.chatId, message, options); } sendImage(request: MessageImageRequest) { @@ -1465,6 +1461,18 @@ export class WhatsappSessionNoWebCore extends WhatsappSession { const processor = new EngineMediaProcessor(this); return this.mediaManager.processMedia(processor, message, this.name); } + + protected async getMessageOptions(request: any): Promise { + let quoted; + if (request.reply_to) { + const { id } = parseMessageId(request.reply_to); + quoted = await this.store.loadMessage(toJID(request.chatId), id); + } + + return { + quoted: quoted, + }; + } } export class EngineMediaProcessor implements IMediaEngineProcessor { diff --git a/src/core/engines/webjs/session.webjs.core.ts b/src/core/engines/webjs/session.webjs.core.ts index f93c4ab4..be69c55a 100644 --- a/src/core/engines/webjs/session.webjs.core.ts +++ b/src/core/engines/webjs/session.webjs.core.ts @@ -352,10 +352,7 @@ export class WhatsappSessionWebJSCore extends WhatsappSession { } sendText(request: MessageTextRequest) { - const options = { - // It's fine to sent just ids instead of Contact object - mentions: request.mentions as unknown as string[], - }; + const options = this.getMessageOptions(request); return this.whatsapp.sendMessage( this.ensureSuffix(request.chatId), request.text, @@ -382,11 +379,7 @@ export class WhatsappSessionWebJSCore extends WhatsappSession { } reply(request: MessageReplyRequest) { - const options = { - quotedMessageId: request.reply_to, - // It's fine to sent just ids instead of Contact object - mentions: request.mentions as unknown as string[], - }; + const options = this.getMessageOptions(request); return this.whatsapp.sendMessage(request.chatId, request.text, options); } @@ -406,7 +399,8 @@ export class WhatsappSessionWebJSCore extends WhatsappSession { const location = new Location(request.latitude, request.longitude, { name: request.title, }); - return this.whatsapp.sendMessage(request.chatId, location); + const options = this.getMessageOptions(request); + return this.whatsapp.sendMessage(request.chatId, location, options); } async sendSeen(request: SendSeenRequest) { @@ -973,6 +967,18 @@ export class WhatsappSessionWebJSCore extends WhatsappSession { const processor = new EngineMediaProcessor(); return this.mediaManager.processMedia(processor, message, this.name); } + + protected getMessageOptions(request: any): any { + let mentions = request.mentions; + mentions = mentions ? mentions.map(this.ensureSuffix) : undefined; + + const quotedMessageId = request.reply_to; + + return { + mentions: mentions, + quotedMessageId: quotedMessageId, + }; + } } export class EngineMediaProcessor implements IMediaEngineProcessor { diff --git a/src/structures/chatting.dto.ts b/src/structures/chatting.dto.ts index 91c69bec..33cbec1a 100644 --- a/src/structures/chatting.dto.ts +++ b/src/structures/chatting.dto.ts @@ -15,7 +15,7 @@ import { VoiceBinaryFile, VoiceRemoteFile, } from './files.dto'; -import { ChatIdProperty } from './properties.dto'; +import { ChatIdProperty, ReplyToProperty } from './properties.dto'; /** * Queries @@ -145,6 +145,9 @@ export class MessageTextRequest extends ChatRequest { text = 'Hi there!'; @ApiHideProperty() mentions?: string[]; + + @ReplyToProperty() + reply_to?: string; } export class EditMessageRequest { @@ -156,10 +159,6 @@ export class EditMessageRequest { export class MessageReplyRequest extends MessageTextRequest { text = 'Reply text'; - @ApiProperty({ - example: 'false_11111111111@c.us_AAAAAAAAAAAAAAAAAAAA', - }) - reply_to: string; } export class MessageLocationRequest extends ChatRequest { @@ -177,6 +176,9 @@ export class MessageLocationRequest extends ChatRequest { example: 'Our office', }) title: string; + + @ReplyToProperty() + reply_to?: string; } @ApiExtraModels(BinaryFile, RemoteFile) @@ -192,10 +194,16 @@ class FileRequest extends ChatRequest { export class MessageImageRequest extends FileRequest { caption: string; + + @ReplyToProperty() + reply_to?: string; } export class MessageFileRequest extends FileRequest { caption: string; + + @ReplyToProperty() + reply_to?: string; } @ApiExtraModels(VoiceBinaryFile, VoiceRemoteFile) @@ -207,6 +215,9 @@ export class MessageVoiceRequest extends ChatRequest { ], }) file: VoiceBinaryFile | VoiceRemoteFile; + + @ReplyToProperty() + reply_to?: string; } @ApiExtraModels(VideoRemoteFile, VideoBinaryFile) @@ -220,6 +231,13 @@ export class MessageVideoRequest extends ChatRequest { file: VideoRemoteFile | VideoBinaryFile; caption: string = 'Just watch at this!'; + + @ApiProperty({ + description: + 'The ID of the message to reply to - false_11111111111@c.us_AAAAAAAAAAAAAAAAAAAA', + example: null, + }) + reply_to?: string; } export class MessageLinkPreviewRequest extends ChatRequest { @@ -268,6 +286,13 @@ export class MessagePoll { export class MessagePollRequest extends ChatRequest { poll: MessagePoll; + + @ApiProperty({ + description: + 'The ID of the message to reply to - false_11111111111@c.us_AAAAAAAAAAAAAAAAAAAA', + example: null, + }) + reply_to?: string; } export class MessageDestination { diff --git a/src/structures/properties.dto.ts b/src/structures/properties.dto.ts index 61640fef..72b3e2fe 100644 --- a/src/structures/properties.dto.ts +++ b/src/structures/properties.dto.ts @@ -15,4 +15,12 @@ function MessageIdProperty() { }); } -export { ChatIdProperty, MessageIdProperty }; +function ReplyToProperty() { + return ApiProperty({ + description: + 'The ID of the message to reply to - false_11111111111@c.us_AAAAAAAAAAAAAAAAAAAA', + example: null, + }); +} + +export { ChatIdProperty, MessageIdProperty, ReplyToProperty };