mirror of
https://github.com/EvolutionAPI/evolution-api.git
synced 2025-07-21 03:27:22 -06:00
Update whatsapp.business.service.ts
Sticker and Location to Catch it is not available.
This commit is contained in:
parent
2ded19752f
commit
7b7f47a361
@ -191,34 +191,64 @@ export class BusinessStartupService extends ChannelStartupService {
|
|||||||
return content;
|
return content;
|
||||||
}
|
}
|
||||||
|
|
||||||
private messageTextJson(received: any) {
|
private messageTextJson(received: any) {
|
||||||
let content: any;
|
// Verificar que received y received.messages existen
|
||||||
const message = received.messages[0];
|
if (!received || !received.messages || received.messages.length === 0) {
|
||||||
if (message.from === received.metadata.phone_number_id) {
|
this.logger.error('Error: received object or messages array is undefined or empty');
|
||||||
content = {
|
return null;
|
||||||
extendedTextMessage: { text: message.text.body },
|
|
||||||
};
|
|
||||||
message.context ? (content = { ...content, contextInfo: { stanzaId: message.context.id } }) : content;
|
|
||||||
} else {
|
|
||||||
content = { conversation: message.text.body };
|
|
||||||
message.context ? (content = { ...content, contextInfo: { stanzaId: message.context.id } }) : content;
|
|
||||||
}
|
|
||||||
return content;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private messageLocationJson(received: any) {
|
const message = received.messages[0];
|
||||||
const message = received.messages[0];
|
let content: any;
|
||||||
let content: any = {
|
|
||||||
locationMessage: {
|
// Verificar si es un mensaje de tipo sticker, location u otro tipo que no tiene text
|
||||||
degreesLatitude: message.location.latitude,
|
if (!message.text) {
|
||||||
degreesLongitude: message.location.longitude,
|
// 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,
|
name: message.location?.name,
|
||||||
address: message.location?.address,
|
address: message.location?.address,
|
||||||
},
|
}};
|
||||||
};
|
} else {
|
||||||
message.context ? (content = { ...content, contextInfo: { stanzaId: message.context.id } }) : content;
|
// 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;
|
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) {
|
||||||
|
content = {
|
||||||
|
extendedTextMessage: { text: message.text.body },
|
||||||
|
};
|
||||||
|
if (message.context) {
|
||||||
|
content = { ...content, contextInfo: { stanzaId: message.context.id } };
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
content = { conversation: message.text.body };
|
||||||
|
if (message.context) {
|
||||||
|
content = { ...content, contextInfo: { stanzaId: message.context.id } };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
private messageContactsJson(received: any) {
|
private messageContactsJson(received: any) {
|
||||||
const message = received.messages[0];
|
const message = received.messages[0];
|
||||||
@ -277,7 +307,7 @@ export class BusinessStartupService extends ChannelStartupService {
|
|||||||
|
|
||||||
private renderMessageType(type: string) {
|
private renderMessageType(type: string) {
|
||||||
let messageType: string;
|
let messageType: string;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 'text':
|
case 'text':
|
||||||
messageType = 'conversation';
|
messageType = 'conversation';
|
||||||
@ -300,11 +330,14 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
return messageType;
|
return messageType;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -312,16 +345,33 @@ export class BusinessStartupService extends ChannelStartupService {
|
|||||||
try {
|
try {
|
||||||
let messageRaw: any;
|
let messageRaw: any;
|
||||||
let pushName: any;
|
let pushName: any;
|
||||||
|
|
||||||
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) {
|
||||||
const database = this.configService.get<Database>('DATABASE');
|
try {
|
||||||
const settings = await this.findSettings();
|
// Registro para depuración
|
||||||
|
this.logger.log('Contenido recibido en eventHandler:');
|
||||||
this.messageHandle(content, database, settings);
|
this.logger.log(JSON.stringify(content, null, 2));
|
||||||
|
|
||||||
|
const database = this.configService.get<Database>('DATABASE');
|
||||||
|
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);
|
||||||
|
} 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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user