Update whatsapp.business.service.ts

Sticker and Location to Catch it is not available.
This commit is contained in:
Jeffry Jesus De La Rosa 2025-04-27 00:06:07 -04:00 committed by GitHub
parent 2ded19752f
commit 7b7f47a361
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -192,31 +192,61 @@ export class BusinessStartupService extends ChannelStartupService {
} }
private messageTextJson(received: any) { private messageTextJson(received: any) {
let content: any; // Verificar que received y received.messages existen
if (!received || !received.messages || received.messages.length === 0) {
this.logger.error('Error: received object or messages array is undefined or empty');
return null;
}
const message = received.messages[0]; const message = received.messages[0];
let content: any;
// Verificar si es un mensaje de tipo sticker, location u otro tipo que no tiene text
if (!message.text) {
// Si no hay texto, manejamos diferente según el tipo de mensaje
if (message.type === 'sticker') {
content = { stickerMessage: {} };
} else if (message.type === 'location') {
content = { locationMessage: {
degreesLatitude: message.location?.latitude,
degreesLongitude: message.location?.longitude,
name: message.location?.name,
address: message.location?.address,
}};
} else {
// Para otros tipos de mensajes sin texto, creamos un contenido genérico
this.logger.log(`Mensaje de tipo ${message.type} sin campo text`);
content = { [message.type + 'Message']: message[message.type] || {} };
}
// Añadir contexto si existe
if (message.context) {
content = { ...content, contextInfo: { stanzaId: message.context.id } };
}
return content;
}
// Si el mensaje tiene texto, procesamos normalmente
if (!received.metadata || !received.metadata.phone_number_id) {
this.logger.error('Error: metadata or phone_number_id is undefined');
return null;
}
if (message.from === received.metadata.phone_number_id) { if (message.from === received.metadata.phone_number_id) {
content = { content = {
extendedTextMessage: { text: message.text.body }, extendedTextMessage: { text: message.text.body },
}; };
message.context ? (content = { ...content, contextInfo: { stanzaId: message.context.id } }) : content; if (message.context) {
content = { ...content, contextInfo: { stanzaId: message.context.id } };
}
} else { } else {
content = { conversation: message.text.body }; content = { conversation: message.text.body };
message.context ? (content = { ...content, contextInfo: { stanzaId: message.context.id } }) : content; if (message.context) {
content = { ...content, contextInfo: { stanzaId: message.context.id } };
} }
return content;
} }
private messageLocationJson(received: any) {
const message = received.messages[0];
let content: any = {
locationMessage: {
degreesLatitude: message.location.latitude,
degreesLongitude: message.location.longitude,
name: message.location?.name,
address: message.location?.address,
},
};
message.context ? (content = { ...content, contextInfo: { stanzaId: message.context.id } }) : content;
return content; return content;
} }
@ -300,6 +330,9 @@ export class BusinessStartupService extends ChannelStartupService {
case 'location': case 'location':
messageType = 'locationMessage'; messageType = 'locationMessage';
break; break;
case 'sticker':
messageType = 'stickerMessage';
break;
default: default:
messageType = 'conversation'; messageType = 'conversation';
break; break;
@ -316,12 +349,29 @@ export class BusinessStartupService extends ChannelStartupService {
if (received.contacts) pushName = received.contacts[0].profile.name; if (received.contacts) pushName = received.contacts[0].profile.name;
if (received.messages) { if (received.messages) {
const message = received.messages[0]; // Añadir esta línea para definir message
const key = { const key = {
id: received.messages[0].id, id: message.id,
remoteJid: this.phoneNumber, remoteJid: this.phoneNumber,
fromMe: received.messages[0].from === received.metadata.phone_number_id, fromMe: message.from === received.metadata.phone_number_id,
}; };
if (this.isMediaMessage(received?.messages[0])) {
if (message.type === 'sticker') {
this.logger.log('Procesando mensaje de tipo sticker');
messageRaw = {
key,
pushName,
message: {
stickerMessage: message.sticker || {},
},
messageType: 'stickerMessage',
messageTimestamp: parseInt(message.timestamp) as number,
source: 'unknown',
instanceId: this.instanceId,
};
} else if (this.isMediaMessage(message)) {
messageRaw = { messageRaw = {
key, key,
pushName, pushName,
@ -455,17 +505,6 @@ export class BusinessStartupService extends ChannelStartupService {
source: 'unknown', source: 'unknown',
instanceId: this.instanceId, instanceId: this.instanceId,
}; };
} else if (received?.messages[0].location) {
messageRaw = {
key,
pushName,
message: this.messageLocationJson(received),
contextInfo: this.messageLocationJson(received)?.contextInfo,
messageType: this.renderMessageType(received.messages[0].type),
messageTimestamp: parseInt(received.messages[0].timestamp) as number,
source: 'unknown',
instanceId: this.instanceId,
};
} else { } else {
messageRaw = { messageRaw = {
key, key,
@ -539,7 +578,7 @@ export class BusinessStartupService extends ChannelStartupService {
} }
} }
if (!this.isMediaMessage(received?.messages[0])) { if (!this.isMediaMessage(message) && message.type !== 'sticker') {
await this.prismaRepository.message.create({ await this.prismaRepository.message.create({
data: messageRaw, data: messageRaw,
}); });
@ -742,10 +781,47 @@ export class BusinessStartupService extends ChannelStartupService {
} }
protected async eventHandler(content: any) { protected async eventHandler(content: any) {
try {
// Registro para depuración
this.logger.log('Contenido recibido en eventHandler:');
this.logger.log(JSON.stringify(content, null, 2));
const database = this.configService.get<Database>('DATABASE'); const database = this.configService.get<Database>('DATABASE');
const settings = await this.findSettings(); const settings = await this.findSettings();
// Si hay mensajes, verificar primero el tipo
if (content.messages && content.messages.length > 0) {
const message = content.messages[0];
this.logger.log(`Tipo de mensaje recibido: ${message.type}`);
// Verificamos el tipo de mensaje antes de procesarlo
if (message.type === 'text' ||
message.type === 'image' ||
message.type === 'video' ||
message.type === 'audio' ||
message.type === 'document' ||
message.type === 'sticker' ||
message.type === 'location' ||
message.type === 'contacts' ||
message.type === 'interactive' ||
message.type === 'button' ||
message.type === 'reaction') {
// Procesar el mensaje normalmente
this.messageHandle(content, database, settings); this.messageHandle(content, database, settings);
} else {
this.logger.warn(`Tipo de mensaje no reconocido: ${message.type}`);
}
} else if (content.statuses) {
// Procesar actualizaciones de estado
this.messageHandle(content, database, settings);
} else {
this.logger.warn('No se encontraron mensajes ni estados en el contenido recibido');
}
} catch (error) {
this.logger.error('Error en eventHandler:');
this.logger.error(error);
}
} }
protected async sendMessageWithTyping(number: string, message: any, options?: Options, isIntegration = false) { protected async sendMessageWithTyping(number: string, message: any, options?: Options, isIntegration = false) {
@ -828,7 +904,6 @@ export class BusinessStartupService extends ChannelStartupService {
} }
if (message['media']) { if (message['media']) {
const isImage = message['mimetype']?.startsWith('image/'); const isImage = message['mimetype']?.startsWith('image/');
const isVideo = message['mimetype']?.startsWith('video/');
content = { content = {
messaging_product: 'whatsapp', messaging_product: 'whatsapp',
@ -838,7 +913,7 @@ export class BusinessStartupService extends ChannelStartupService {
[message['mediaType']]: { [message['mediaType']]: {
[message['type']]: message['id'], [message['type']]: message['id'],
preview_url: linkPreview, preview_url: linkPreview,
...(message['fileName'] && !isImage && !isVideo && { filename: message['fileName'] }), ...(message['fileName'] && !isImage && { filename: message['fileName'] }),
caption: message['caption'], caption: message['caption'],
}, },
}; };
@ -1006,10 +1081,8 @@ export class BusinessStartupService extends ChannelStartupService {
private async getIdMedia(mediaMessage: any) { private async getIdMedia(mediaMessage: any) {
const formData = new FormData(); const formData = new FormData();
const media = mediaMessage.media || mediaMessage.audio;
if (!media) throw new Error('Media or audio not found');
const fileStream = createReadStream(media); const fileStream = createReadStream(mediaMessage.media);
formData.append('file', fileStream, { filename: 'media', contentType: mediaMessage.mimetype }); formData.append('file', fileStream, { filename: 'media', contentType: mediaMessage.mimetype });
formData.append('typeFile', mediaMessage.mimetype); formData.append('typeFile', mediaMessage.mimetype);
@ -1110,7 +1183,7 @@ export class BusinessStartupService extends ChannelStartupService {
const prepareMedia: any = { const prepareMedia: any = {
fileName: `${hash}.mp3`, fileName: `${hash}.mp3`,
mediaType: 'audio', mediaType: 'audio',
audio, media: audio,
}; };
if (isURL(audio)) { if (isURL(audio)) {
@ -1132,7 +1205,15 @@ export class BusinessStartupService extends ChannelStartupService {
public async audioWhatsapp(data: SendAudioDto, file?: any, isIntegration = false) { public async audioWhatsapp(data: SendAudioDto, file?: any, isIntegration = false) {
const mediaData: SendAudioDto = { ...data }; const mediaData: SendAudioDto = { ...data };
if (file) mediaData.audio = file.buffer.toString('base64'); if (file?.buffer) {
mediaData.audio = file.buffer.toString('base64');
} else if (isURL(mediaData.audio)) {
// DO NOTHING
// mediaData.audio = mediaData.audio;
} else {
console.error('El archivo no tiene buffer o file es undefined');
throw new Error('File or buffer is undefined');
}
const message = await this.processAudio(mediaData.audio, data.number); const message = await this.processAudio(mediaData.audio, data.number);