diff --git a/src/dev-env.yml b/src/dev-env.yml index 7af78d40..cadfe105 100644 --- a/src/dev-env.yml +++ b/src/dev-env.yml @@ -97,6 +97,7 @@ WEBHOOK: WEBHOOK_BY_EVENTS: false # Automatically maps webhook paths # Set the events you want to hear + WEBHOOK_BASE64: false EVENTS: APPLICATION_STARTUP: false QRCODE_UPDATED: true diff --git a/src/whatsapp/controllers/instance.controller.ts b/src/whatsapp/controllers/instance.controller.ts index a2903f59..3ead8690 100644 --- a/src/whatsapp/controllers/instance.controller.ts +++ b/src/whatsapp/controllers/instance.controller.ts @@ -41,6 +41,7 @@ export class InstanceController { instanceName, webhook, webhook_by_events, + webhook_base64, events, qrcode, number, @@ -139,6 +140,7 @@ export class InstanceController { url: webhook, events: newEvents, webhook_by_events, + webhook_base64, }); webhookEvents = (await this.webhookService.find(instance)).events; @@ -297,6 +299,7 @@ export class InstanceController { webhook: { webhook, webhook_by_events, + webhook_base64, events: webhookEvents, }, websocket: { @@ -390,6 +393,7 @@ export class InstanceController { webhook: { webhook, webhook_by_events, + webhook_base64, events: webhookEvents, }, websocket: { diff --git a/src/whatsapp/dto/instance.dto.ts b/src/whatsapp/dto/instance.dto.ts index 7807d1a5..700fa099 100644 --- a/src/whatsapp/dto/instance.dto.ts +++ b/src/whatsapp/dto/instance.dto.ts @@ -5,6 +5,7 @@ export class InstanceDto { token?: string; webhook?: string; webhook_by_events?: boolean; + webhook_base64?: boolean; events?: string[]; reject_call?: boolean; msg_call?: string; diff --git a/src/whatsapp/models/webhook.model.ts b/src/whatsapp/models/webhook.model.ts index 05a222e0..9a1bb43d 100644 --- a/src/whatsapp/models/webhook.model.ts +++ b/src/whatsapp/models/webhook.model.ts @@ -8,6 +8,7 @@ export class WebhookRaw { enabled?: boolean; events?: string[]; webhook_by_events?: boolean; + webhook_base64?: boolean; } const webhookSchema = new Schema({ @@ -16,6 +17,7 @@ const webhookSchema = new Schema({ enabled: { type: Boolean, required: true }, events: { type: [String], required: true }, webhook_by_events: { type: Boolean, required: true }, + webhook_base64: { type: Boolean, required: true }, }); export const WebhookModel = dbserver?.model(WebhookRaw.name, webhookSchema, 'webhook'); diff --git a/src/whatsapp/services/webhook.service.ts b/src/whatsapp/services/webhook.service.ts index dd0a88cd..7dbb9d36 100644 --- a/src/whatsapp/services/webhook.service.ts +++ b/src/whatsapp/services/webhook.service.ts @@ -26,7 +26,7 @@ export class WebhookService { return result; } catch (error) { - return { enabled: false, url: '', events: [], webhook_by_events: false }; + return { enabled: false, url: '', events: [], webhook_by_events: false, webhook_base64 : false }; } } } diff --git a/src/whatsapp/services/whatsapp.service.ts b/src/whatsapp/services/whatsapp.service.ts index 7eb9296a..e4c25938 100644 --- a/src/whatsapp/services/whatsapp.service.ts +++ b/src/whatsapp/services/whatsapp.service.ts @@ -276,6 +276,10 @@ export class WAStartupService { this.localWebhook.webhook_by_events = data?.webhook_by_events; this.logger.verbose(`Webhook by events: ${this.localWebhook.webhook_by_events}`); + this.localWebhook.webhook_base64 = data?.webhook_base64; + this.logger.verbose(`Webhook by webhook_base64: ${this.localWebhook.webhook_base64}`); + + this.logger.verbose('Webhook loaded'); } @@ -1528,15 +1532,42 @@ export class WAStartupService { return; } - const messageRaw: MessageRaw = { - key: received.key, - pushName: received.pushName, - message: { ...received.message }, - messageType: getContentType(received.message), - messageTimestamp: received.messageTimestamp as number, - owner: this.instance.name, - source: getDevice(received.key.id), - }; + let messageRaw: MessageRaw; + const globalWebhook = this.configService.get('WEBHOOK').GLOBAL; + if (this.localWebhook.webhook_base64 === true && received?.message.documentMessage || received?.message.imageMessage ) { + const buffer = await downloadMediaMessage( + { key: received.key, message: received?.message }, + 'buffer', + {}, + { + logger: P({ level: 'error' }), + reuploadRequest: this.client.updateMediaMessage, + }, + ); + console.log(buffer); + messageRaw = { + key: received.key, + pushName: received.pushName, + message: { + ...received.message, + base64: buffer ? buffer.toString('base64') : undefined, + }, + messageType: getContentType(received.message), + messageTimestamp: received.messageTimestamp as number, + owner: this.instance.name, + source: getDevice(received.key.id), + }; + } else { + messageRaw = { + key: received.key, + pushName: received.pushName, + message: { ...received.message }, + messageType: getContentType(received.message), + messageTimestamp: received.messageTimestamp as number, + owner: this.instance.name, + source: getDevice(received.key.id), + }; + } if (this.localSettings.read_messages && received.key.id !== 'status@broadcast') { await this.client.readMessages([received.key]); diff --git a/src/whatsapp/types/wa.types.ts b/src/whatsapp/types/wa.types.ts index 2025e7f7..9f326c8a 100644 --- a/src/whatsapp/types/wa.types.ts +++ b/src/whatsapp/types/wa.types.ts @@ -50,6 +50,7 @@ export declare namespace wa { url?: string; events?: string[]; webhook_by_events?: boolean; + webhook_base64?: boolean; }; export type LocalChatwoot = {