From 10c7e81e0271c0acd87816389a015410227bc215 Mon Sep 17 00:00:00 2001 From: Davidson Gomes Date: Wed, 23 Aug 2023 07:54:46 -0300 Subject: [PATCH] Added webhooks for typebot events --- CHANGELOG.md | 2 ++ Docker/.env.example | 5 +++ Dockerfile | 5 +++ src/config/env.config.ts | 6 ++++ src/dev-env.yml | 11 ++++-- src/validate/validate.schema.ts | 12 +++++++ .../controllers/instance.controller.ts | 9 +++++ .../controllers/rabbitmq.controller.ts | 3 ++ .../controllers/webhook.controller.ts | 3 ++ .../controllers/websocket.controller.ts | 3 ++ src/whatsapp/services/typebot.service.ts | 34 +++++++++++++++---- src/whatsapp/types/wa.types.ts | 3 ++ 12 files changed, 87 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 23129582..7b3b343e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ ### Feature * Added listening_from_me option in Set Typebot +* Added variables options in Start Typebot +* Added webhooks for typebot events ### Fixed diff --git a/Docker/.env.example b/Docker/.env.example index bf21a71c..69ceaf23 100644 --- a/Docker/.env.example +++ b/Docker/.env.example @@ -81,6 +81,11 @@ WEBHOOK_EVENTS_CONNECTION_UPDATE=true WEBHOOK_EVENTS_CALL=true # This event fires every time a new token is requested via the refresh route WEBHOOK_EVENTS_NEW_JWT_TOKEN=false +# This events is used with Typebot +WEBHOOK_EVENTS_TYPEBOT_START=false +WEBHOOK_EVENTS_TYPEBOT_CHANGE_STATUS=false +# This event is used with Chama AI +WEBHOOK_EVENTS_CHAMA_AI_ACTION=false # Name that will be displayed on smartphone connection CONFIG_SESSION_PHONE_CLIENT=EvolutionAPI diff --git a/Dockerfile b/Dockerfile index 3777091f..d4defe07 100644 --- a/Dockerfile +++ b/Dockerfile @@ -84,6 +84,11 @@ ENV WEBHOOK_EVENTS_CALL=true ENV WEBHOOK_EVENTS_NEW_JWT_TOKEN=false +ENV WEBHOOK_EVENTS_TYPEBOT_START=false +ENV WEBHOOK_EVENTS_TYPEBOT_CHANGE_STATUS=false + +ENV WEBHOOK_EVENTS_CHAMA_AI_ACTION=false + ENV CONFIG_SESSION_PHONE_CLIENT=EvolutionAPI ENV CONFIG_SESSION_PHONE_NAME=chrome diff --git a/src/config/env.config.ts b/src/config/env.config.ts index f68c4108..a2255b32 100644 --- a/src/config/env.config.ts +++ b/src/config/env.config.ts @@ -92,6 +92,9 @@ export type EventsWebhook = { GROUP_PARTICIPANTS_UPDATE: boolean; CALL: boolean; NEW_JWT_TOKEN: boolean; + TYPEBOT_START: boolean; + TYPEBOT_CHANGE_STATUS: boolean; + CHAMA_AI_ACTION: boolean; }; export type ApiKey = { KEY: string }; @@ -264,6 +267,9 @@ export class ConfigService { GROUP_PARTICIPANTS_UPDATE: process.env?.WEBHOOK_EVENTS_GROUP_PARTICIPANTS_UPDATE === 'true', CALL: process.env?.WEBHOOK_EVENTS_CALL === 'true', NEW_JWT_TOKEN: process.env?.WEBHOOK_EVENTS_NEW_JWT_TOKEN === 'true', + TYPEBOT_START: process.env?.WEBHOOK_EVENTS_TYPEBOT_START === 'true', + TYPEBOT_CHANGE_STATUS: process.env?.WEBHOOK_EVENTS_TYPEBOT_CHANGE_STATUS === 'true', + CHAMA_AI_ACTION: process.env?.WEBHOOK_EVENTS_CHAMA_AI_ACTION === 'true', }, }, CONFIG_SESSION_PHONE: { diff --git a/src/dev-env.yml b/src/dev-env.yml index 235ec1b7..bd9ad277 100644 --- a/src/dev-env.yml +++ b/src/dev-env.yml @@ -83,7 +83,7 @@ RABBITMQ: ENABLED: false URI: "amqp://guest:guest@localhost:5672" -WEBSOCKET: +WEBSOCKET: ENABLED: false # Global Webhook Settings @@ -120,6 +120,11 @@ WEBHOOK: CALL: true # This event fires every time a new token is requested via the refresh route NEW_JWT_TOKEN: false + # This events is used with Typebot + TYPEBOT_START: false + TYPEBOT_CHANGE_STATUS: false + # This event is used with Chama AI + CHAMA_AI_ACTION: false CONFIG_SESSION_PHONE: # Name that will be displayed on smartphone connection @@ -129,7 +134,7 @@ CONFIG_SESSION_PHONE: # Set qrcode display limit QRCODE: LIMIT: 30 - COLOR: '#198754' + COLOR: "#198754" # Defines an authentication type for the api # We recommend using the apikey because it will allow you to use a custom token, @@ -145,4 +150,4 @@ AUTHENTICATION: # Set the secret key to encrypt and decrypt your token and its expiration time. JWT: EXPIRIN_IN: 0 # seconds - 3600s === 1h | zero (0) - never expires - SECRET: L=0YWt]b2w[WF>#>:&E` \ No newline at end of file + SECRET: L=0YWt]b2w[WF>#>:&E` diff --git a/src/validate/validate.schema.ts b/src/validate/validate.schema.ts index 2875cf2b..b8a4c0ad 100644 --- a/src/validate/validate.schema.ts +++ b/src/validate/validate.schema.ts @@ -55,6 +55,9 @@ export const instanceNameSchema: JSONSchema7 = { 'CONNECTION_UPDATE', 'CALL', 'NEW_JWT_TOKEN', + 'TYPEBOT_START', + 'TYPEBOT_CHANGE_STATUS', + 'CHAMA_AI_ACTION', ], }, }, @@ -856,6 +859,9 @@ export const webhookSchema: JSONSchema7 = { 'CONNECTION_UPDATE', 'CALL', 'NEW_JWT_TOKEN', + 'TYPEBOT_START', + 'TYPEBOT_CHANGE_STATUS', + 'CHAMA_AI_ACTION', ], }, }, @@ -927,6 +933,9 @@ export const websocketSchema: JSONSchema7 = { 'CONNECTION_UPDATE', 'CALL', 'NEW_JWT_TOKEN', + 'TYPEBOT_START', + 'TYPEBOT_CHANGE_STATUS', + 'CHAMA_AI_ACTION', ], }, }, @@ -967,6 +976,9 @@ export const rabbitmqSchema: JSONSchema7 = { 'CONNECTION_UPDATE', 'CALL', 'NEW_JWT_TOKEN', + 'TYPEBOT_START', + 'TYPEBOT_CHANGE_STATUS', + 'CHAMA_AI_ACTION', ], }, }, diff --git a/src/whatsapp/controllers/instance.controller.ts b/src/whatsapp/controllers/instance.controller.ts index 1bcc868d..818fabf1 100644 --- a/src/whatsapp/controllers/instance.controller.ts +++ b/src/whatsapp/controllers/instance.controller.ts @@ -127,6 +127,9 @@ export class InstanceController { 'CONNECTION_UPDATE', 'CALL', 'NEW_JWT_TOKEN', + 'TYPEBOT_START', + 'TYPEBOT_CHANGE_STATUS', + 'CHAMA_AI_ACTION', ]; } else { newEvents = events; @@ -173,6 +176,9 @@ export class InstanceController { 'CONNECTION_UPDATE', 'CALL', 'NEW_JWT_TOKEN', + 'TYPEBOT_START', + 'TYPEBOT_CHANGE_STATUS', + 'CHAMA_AI_ACTION', ]; } else { newEvents = events; @@ -217,6 +223,9 @@ export class InstanceController { 'CONNECTION_UPDATE', 'CALL', 'NEW_JWT_TOKEN', + 'TYPEBOT_START', + 'TYPEBOT_CHANGE_STATUS', + 'CHAMA_AI_ACTION', ]; } else { newEvents = events; diff --git a/src/whatsapp/controllers/rabbitmq.controller.ts b/src/whatsapp/controllers/rabbitmq.controller.ts index 4efd1c3f..8d33ce84 100644 --- a/src/whatsapp/controllers/rabbitmq.controller.ts +++ b/src/whatsapp/controllers/rabbitmq.controller.ts @@ -40,6 +40,9 @@ export class RabbitmqController { 'CONNECTION_UPDATE', 'CALL', 'NEW_JWT_TOKEN', + 'TYPEBOT_START', + 'TYPEBOT_CHANGE_STATUS', + 'CHAMA_AI_ACTION', ]; } diff --git a/src/whatsapp/controllers/webhook.controller.ts b/src/whatsapp/controllers/webhook.controller.ts index 5515b8cc..8201f1b5 100644 --- a/src/whatsapp/controllers/webhook.controller.ts +++ b/src/whatsapp/controllers/webhook.controller.ts @@ -48,6 +48,9 @@ export class WebhookController { 'CONNECTION_UPDATE', 'CALL', 'NEW_JWT_TOKEN', + 'TYPEBOT_START', + 'TYPEBOT_CHANGE_STATUS', + 'CHAMA_AI_ACTION', ]; } diff --git a/src/whatsapp/controllers/websocket.controller.ts b/src/whatsapp/controllers/websocket.controller.ts index fb6bea0f..5771027a 100644 --- a/src/whatsapp/controllers/websocket.controller.ts +++ b/src/whatsapp/controllers/websocket.controller.ts @@ -40,6 +40,9 @@ export class WebsocketController { 'CONNECTION_UPDATE', 'CALL', 'NEW_JWT_TOKEN', + 'TYPEBOT_START', + 'TYPEBOT_CHANGE_STATUS', + 'CHAMA_AI_ACTION', ]; } diff --git a/src/whatsapp/services/typebot.service.ts b/src/whatsapp/services/typebot.service.ts index 6ebcf8b1..ff595c6b 100644 --- a/src/whatsapp/services/typebot.service.ts +++ b/src/whatsapp/services/typebot.service.ts @@ -4,6 +4,7 @@ import { Logger } from '../../config/logger.config'; import { InstanceDto } from '../dto/instance.dto'; import { Session, TypebotDto } from '../dto/typebot.dto'; import { MessageRaw } from '../models'; +import { Events } from '../types/wa.types'; import { WAMonitoringService } from './monitor.service'; export class TypebotService { @@ -83,6 +84,14 @@ export class TypebotService { this.create(instance, typebotData); + this.waMonitor.waInstances[instance.instanceName].sendDataWebhook(Events.TYPEBOT_CHANGE_STATUS, { + remoteJid: remoteJid, + status: status, + url: findData.url, + typebot: findData.typebot, + session, + }); + return { typebot: { ...instance, typebot: typebotData } }; } @@ -90,6 +99,15 @@ export class TypebotService { const remoteJid = data.remoteJid; const url = data.url; const typebot = data.typebot; + const variables = data.variables; + + const prefilledVariables = { + remoteJid: remoteJid, + }; + + variables.forEach((variable) => { + prefilledVariables[variable.name] = variable.value; + }); const id = Math.floor(Math.random() * 10000000000).toString(); @@ -97,14 +115,9 @@ export class TypebotService { sessionId: id, startParams: { typebot: data.typebot, - prefilledVariables: { - remoteJid: data.remoteJid, - pushName: data.pushName, - instanceName: instance.instanceName, - }, + prefilledVariables: prefilledVariables, }, }; - console.log(reqData); const request = await axios.post(data.url + '/api/v1/sendMessage', reqData); @@ -116,6 +129,14 @@ export class TypebotService { request.data.clientSideActions, ); + this.waMonitor.waInstances[instance.instanceName].sendDataWebhook(Events.TYPEBOT_START, { + remoteJid: remoteJid, + url: url, + typebot: typebot, + variables: variables, + sessionId: id, + }); + return { typebot: { ...instance, @@ -123,6 +144,7 @@ export class TypebotService { url: url, remoteJid: remoteJid, typebot: typebot, + variables: variables, }, }, }; diff --git a/src/whatsapp/types/wa.types.ts b/src/whatsapp/types/wa.types.ts index b4020649..2025e7f7 100644 --- a/src/whatsapp/types/wa.types.ts +++ b/src/whatsapp/types/wa.types.ts @@ -23,6 +23,9 @@ export enum Events { GROUPS_UPDATE = 'groups.update', GROUP_PARTICIPANTS_UPDATE = 'group-participants.update', CALL = 'call', + TYPEBOT_START = 'typebot.start', + TYPEBOT_CHANGE_STATUS = 'typebot.change-status', + CHAMA_AI_ACTION = 'chama-ai.action', } export declare namespace wa {