[core] Add reply to for all messages

fixes #503
This commit is contained in:
devlikepro committed 2024-08-27 16:44:23 +07:00
1 parent 5287421cea
commit e32b128b0f
5 files changed
+85 -34

No files matched your search

+11 -7
View File
@@ -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);
}
}
+19 -11
View File
@@ -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<any> {
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<any> {
+16 -10
View File
@@ -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<Message> {
+30 -5
View File
@@ -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 {
+9 -1
View File
@@ -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 };