import { InstanceDto } from '@api/dto/instance.dto'; import { SendAudioDto, SendButtonsDto, SendContactDto, SendListDto, SendLocationDto, SendMediaDto, SendPollDto, SendPtvDto, SendReactionDto, SendStatusDto, SendStickerDto, SendTemplateDto, SendTextDto, } from '@api/dto/sendMessage.dto'; import { WAMonitoringService } from '@api/services/monitor.service'; import { BadRequestException } from '@exceptions'; import { isBase64, isURL } from 'class-validator'; function isEmoji(str: string) { if (str === '') return true; const emojiRegex = /^[\u{1F300}-\u{1F9FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}\u{1F000}-\u{1F02F}\u{1F0A0}-\u{1F0FF}\u{1F100}-\u{1F64F}\u{1F680}-\u{1F6FF}]$/u; return emojiRegex.test(str); } export class SendMessageController { constructor(private readonly waMonitor: WAMonitoringService) {} public async sendTemplate({ instanceName }: InstanceDto, data: SendTemplateDto) { return await this.waMonitor.waInstances[instanceName].templateMessage(data); } public async sendText({ instanceName }: InstanceDto, data: SendTextDto) { return await this.waMonitor.waInstances[instanceName].textMessage(data); } public async sendMedia({ instanceName }: InstanceDto, data: SendMediaDto, file?: any) { if (isBase64(data?.media) && !data?.fileName && data?.mediatype === 'document') { throw new BadRequestException('For base64 the file name must be informed.'); } if (file || isURL(data?.media) || isBase64(data?.media)) { return await this.waMonitor.waInstances[instanceName].mediaMessage(data, file); } throw new BadRequestException('Owned media must be a url or base64'); } public async sendPtv({ instanceName }: InstanceDto, data: SendPtvDto, file?: any) { if (file || isURL(data?.video) || isBase64(data?.video)) { return await this.waMonitor.waInstances[instanceName].ptvMessage(data, file); } throw new BadRequestException('Owned media must be a url or base64'); } public async sendSticker({ instanceName }: InstanceDto, data: SendStickerDto, file?: any) { if (file || isURL(data.sticker) || isBase64(data.sticker)) { return await this.waMonitor.waInstances[instanceName].mediaSticker(data, file); } throw new BadRequestException('Owned media must be a url or base64'); } public async sendWhatsAppAudio({ instanceName }: InstanceDto, data: SendAudioDto, file?: any) { if (file?.buffer || isURL(data.audio) || isBase64(data.audio)) { // Si file existe y tiene buffer, o si es una URL o Base64, continĂºa return await this.waMonitor.waInstances[instanceName].audioWhatsapp(data, file); } else { console.error('El archivo no tiene buffer o el audio no es una URL o Base64 vĂ¡lida'); throw new BadRequestException('Owned media must be a url, base64, or valid file with buffer'); } } public async sendButtons({ instanceName }: InstanceDto, data: SendButtonsDto) { return await this.waMonitor.waInstances[instanceName].buttonMessage(data); } public async sendLocation({ instanceName }: InstanceDto, data: SendLocationDto) { return await this.waMonitor.waInstances[instanceName].locationMessage(data); } public async sendList({ instanceName }: InstanceDto, data: SendListDto) { return await this.waMonitor.waInstances[instanceName].listMessage(data); } public async sendContact({ instanceName }: InstanceDto, data: SendContactDto) { return await this.waMonitor.waInstances[instanceName].contactMessage(data); } public async sendReaction({ instanceName }: InstanceDto, data: SendReactionDto) { if (!isEmoji(data.reaction)) { throw new BadRequestException('Reaction must be a single emoji or empty string'); } return await this.waMonitor.waInstances[instanceName].reactionMessage(data); } public async sendPoll({ instanceName }: InstanceDto, data: SendPollDto) { return await this.waMonitor.waInstances[instanceName].pollMessage(data); } public async sendStatus({ instanceName }: InstanceDto, data: SendStatusDto, file?: any) { return await this.waMonitor.waInstances[instanceName].statusMessage(data, file); } }