Skip to content

Commit b502ebd

Browse files
committed
feat: Added Typebot integration
1 parent 7c5d94c commit b502ebd

File tree

12 files changed

+96
-24
lines changed

12 files changed

+96
-24
lines changed

Docker/.env.example

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ CLEAN_STORE_CONTACTS=true
3131
CLEAN_STORE_CHATS=true
3232

3333
# Permanent data storage
34-
DATABASE_ENABLED=true
34+
DATABASE_ENABLED=false
3535
DATABASE_CONNECTION_URI=mongodb://root:root@mongodb:27017/?authSource=admin&readPreference=primary&ssl=false&directConnection=true
3636
DATABASE_CONNECTION_DB_PREFIX_NAME=evdocker
3737

@@ -42,13 +42,15 @@ DATABASE_SAVE_MESSAGE_UPDATE=false
4242
DATABASE_SAVE_DATA_CONTACTS=false
4343
DATABASE_SAVE_DATA_CHATS=false
4444

45-
REDIS_ENABLED=true
45+
REDIS_ENABLED=false
4646
REDIS_URI=redis://redis:6379
4747
REDIS_PREFIX_KEY=evdocker
4848

49-
RABBITMQ_ENABLED=true
49+
RABBITMQ_ENABLED=false
5050
RABBITMQ_URI=amqp://guest:guest@rabbitmq:5672
5151

52+
WEBSOCKET_ENABLED=false
53+
5254
# Global Webhook Settings
5355
# Each instance's Webhook URL and events will be requested at the time it is created
5456
## Define a global webhook that will listen for enabled events from all instances

Dockerfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ ENV REDIS_PREFIX_KEY=evolution
5454
ENV RABBITMQ_ENABLED=false
5555
ENV RABBITMQ_URI=amqp://guest:guest@rabbitmq:5672
5656

57+
ENV WEBSOCKET_ENABLED=false
58+
5759
ENV WEBHOOK_GLOBAL_URL=
5860
ENV WEBHOOK_GLOBAL_ENABLED=false
5961

src/config/env.config.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ export type Rabbitmq = {
6666
URI: string;
6767
};
6868

69+
export type Websocket = {
70+
ENABLED: boolean;
71+
};
72+
6973
export type EventsWebhook = {
7074
APPLICATION_STARTUP: boolean;
7175
QRCODE_UPDATED: boolean;
@@ -122,6 +126,7 @@ export interface Env {
122126
DATABASE: Database;
123127
REDIS: Redis;
124128
RABBITMQ: Rabbitmq;
129+
WEBSOCKET: Websocket;
125130
LOG: Log;
126131
DEL_INSTANCE: DelInstance;
127132
WEBHOOK: Webhook;
@@ -211,6 +216,9 @@ export class ConfigService {
211216
ENABLED: process.env?.RABBITMQ_ENABLED === 'true',
212217
URI: process.env.RABBITMQ_URI,
213218
},
219+
WEBSOCKET: {
220+
ENABLED: process.env?.WEBSOCKET_ENABLED === 'true',
221+
},
214222
LOG: {
215223
LEVEL: process.env?.LOG_LEVEL.split(',') as LogLevel[],
216224
COLOR: process.env?.LOG_COLOR === 'true',

src/dev-env.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ RABBITMQ:
8383
ENABLED: false
8484
URI: "amqp://guest:guest@localhost:5672"
8585

86+
WEBSOCKET:
87+
ENABLED: false
88+
8689
# Global Webhook Settings
8790
# Each instance's Webhook URL and events will be requested at the time it is created
8891
WEBHOOK:

src/libs/socket.server.ts

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Server } from 'http';
22
import { Server as SocketIO } from 'socket.io';
33

4-
import { configService, Cors } from '../config/env.config';
4+
import { configService, Cors, Websocket } from '../config/env.config';
55
import { Logger } from '../config/logger.config';
66

77
const logger = new Logger('Socket');
@@ -11,22 +11,25 @@ let io: SocketIO;
1111
const cors = configService.get<Cors>('CORS').ORIGIN;
1212

1313
export const initIO = (httpServer: Server) => {
14-
io = new SocketIO(httpServer, {
15-
cors: {
16-
origin: cors,
17-
},
18-
});
14+
if (configService.get<Websocket>('WEBSOCKET').ENABLED) {
15+
io = new SocketIO(httpServer, {
16+
cors: {
17+
origin: cors,
18+
},
19+
});
1920

20-
io.on('connection', (socket) => {
21-
logger.info('User connected');
21+
io.on('connection', (socket) => {
22+
logger.info('User connected');
2223

23-
socket.on('disconnect', () => {
24-
logger.info('User disconnected');
24+
socket.on('disconnect', () => {
25+
logger.info('User disconnected');
26+
});
2527
});
26-
});
2728

28-
logger.info('Socket.io initialized');
29-
return io;
29+
logger.info('Socket.io initialized');
30+
return io;
31+
}
32+
return null;
3033
};
3134

3235
export const getIO = (): SocketIO => {

src/whatsapp/controllers/instance.controller.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ export class InstanceController {
6464
typebot_url,
6565
typebot,
6666
typebot_expire,
67+
typebot_keyword_finish,
6768
typebot_delay_message,
6869
typebot_unknown_message,
6970
}: InstanceDto) {
@@ -243,6 +244,7 @@ export class InstanceController {
243244
url: typebot_url,
244245
typebot: typebot,
245246
expire: typebot_expire,
247+
keyword_finish: typebot_keyword_finish,
246248
delay_message: typebot_delay_message,
247249
unknown_message: typebot_unknown_message,
248250
});
@@ -286,7 +288,7 @@ export class InstanceController {
286288
webhook_by_events,
287289
events: webhookEvents,
288290
},
289-
websocker: {
291+
websocket: {
290292
enabled: websocket_enabled,
291293
events: websocketEvents,
292294
},
@@ -299,6 +301,7 @@ export class InstanceController {
299301
url: typebot_url,
300302
typebot,
301303
expire: typebot_expire,
304+
keyword_finish: typebot_keyword_finish,
302305
delay_message: typebot_delay_message,
303306
unknown_message: typebot_unknown_message,
304307
},
@@ -377,7 +380,7 @@ export class InstanceController {
377380
webhook_by_events,
378381
events: webhookEvents,
379382
},
380-
websocker: {
383+
websocket: {
381384
enabled: websocket_enabled,
382385
events: websocketEvents,
383386
},
@@ -390,6 +393,7 @@ export class InstanceController {
390393
url: typebot_url,
391394
typebot,
392395
expire: typebot_expire,
396+
keyword_finish: typebot_keyword_finish,
393397
delay_message: typebot_delay_message,
394398
unknown_message: typebot_unknown_message,
395399
},

src/whatsapp/dto/instance.dto.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export class InstanceDto {
2525
typebot_url?: string;
2626
typebot?: string;
2727
typebot_expire?: number;
28+
typebot_keyword_finish?: string;
2829
typebot_delay_message?: number;
2930
typebot_unknown_message?: string;
3031
proxy_enabled?: boolean;

src/whatsapp/dto/typebot.dto.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export class TypebotDto {
1111
url: string;
1212
typebot?: string;
1313
expire?: number;
14+
keyword_finish?: string;
1415
delay_message?: number;
1516
unknown_message?: string;
1617
sessions?: Session[];

src/whatsapp/models/typebot.model.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export class TypebotRaw {
1616
url: string;
1717
typebot?: string;
1818
expire?: number;
19+
keyword_finish?: string;
1920
delay_message?: number;
2021
unknown_message?: string;
2122
sessions?: Session[];
@@ -27,6 +28,7 @@ const typebotSchema = new Schema<TypebotRaw>({
2728
url: { type: String, required: true },
2829
typebot: { type: String, required: true },
2930
expire: { type: Number, required: true },
31+
keyword_finish: { type: String, required: true },
3032
delay_message: { type: Number, required: true },
3133
unknown_message: { type: String, required: true },
3234
sessions: [

src/whatsapp/services/typebot.service.ts

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ export class TypebotService {
5050
url: findData.url,
5151
typebot: findData.typebot,
5252
expire: findData.expire,
53+
keyword_finish: findData.keyword_finish,
54+
delay_message: findData.delay_message,
55+
unknown_message: findData.unknown_message,
5356
sessions: findData.sessions,
5457
};
5558

@@ -70,6 +73,9 @@ export class TypebotService {
7073
url: findData.url,
7174
typebot: findData.typebot,
7275
expire: findData.expire,
76+
keyword_finish: findData.keyword_finish,
77+
delay_message: findData.delay_message,
78+
unknown_message: findData.unknown_message,
7379
sessions: findData.sessions,
7480
};
7581

@@ -143,6 +149,9 @@ export class TypebotService {
143149
url: data.url,
144150
typebot: data.typebot,
145151
expire: data.expire,
152+
keyword_finish: data.keyword_finish,
153+
delay_message: data.delay_message,
154+
unknown_message: data.unknown_message,
146155
sessions: data.sessions,
147156
};
148157

@@ -285,6 +294,9 @@ export class TypebotService {
285294
const typebot = (await this.find(instance)).typebot;
286295
const sessions = ((await this.find(instance)).sessions as Session[]) ?? [];
287296
const expire = (await this.find(instance)).expire;
297+
const keyword_finish = (await this.find(instance)).keyword_finish;
298+
const delay_message = (await this.find(instance)).delay_message;
299+
const unknown_message = (await this.find(instance)).unknown_message;
288300

289301
const session = sessions.find((session) => session.remoteJid === remoteJid);
290302

@@ -302,6 +314,9 @@ export class TypebotService {
302314
url: url,
303315
typebot: typebot,
304316
expire: expire,
317+
keyword_finish: keyword_finish,
318+
delay_message: delay_message,
319+
unknown_message: unknown_message,
305320
sessions: sessions,
306321
remoteJid: remoteJid,
307322
pushName: msg.pushName,
@@ -322,6 +337,9 @@ export class TypebotService {
322337
url: url,
323338
typebot: typebot,
324339
expire: expire,
340+
keyword_finish: keyword_finish,
341+
delay_message: delay_message,
342+
unknown_message: unknown_message,
325343
sessions: sessions,
326344
remoteJid: remoteJid,
327345
pushName: msg.pushName,
@@ -343,6 +361,9 @@ export class TypebotService {
343361
url: url,
344362
typebot: typebot,
345363
expire: expire,
364+
keyword_finish: keyword_finish,
365+
delay_message: delay_message,
366+
unknown_message: unknown_message,
346367
sessions,
347368
};
348369

@@ -351,21 +372,40 @@ export class TypebotService {
351372
const content = this.getConversationMessage(msg.message);
352373

353374
if (!content) {
354-
if (this.waMonitor.waInstances[instance.instanceName].localTypebot.unknown_message) {
375+
if (unknown_message) {
355376
this.waMonitor.waInstances[instance.instanceName].textMessage({
356377
number: remoteJid.split('@')[0],
357378
options: {
358-
delay: this.waMonitor.waInstances[instance.instanceName].localTypebot.delay_message || 1000,
379+
delay: delay_message || 1000,
359380
presence: 'composing',
360381
},
361382
textMessage: {
362-
text: this.waMonitor.waInstances[instance.instanceName].localTypebot.unknown_message,
383+
text: unknown_message,
363384
},
364385
});
365386
}
366387
return;
367388
}
368389

390+
if (content.toLowerCase() === keyword_finish.toLowerCase()) {
391+
sessions.splice(sessions.indexOf(session), 1);
392+
393+
const typebotData = {
394+
enabled: true,
395+
url: url,
396+
typebot: typebot,
397+
expire: expire,
398+
keyword_finish: keyword_finish,
399+
delay_message: delay_message,
400+
unknown_message: unknown_message,
401+
sessions,
402+
};
403+
404+
this.create(instance, typebotData);
405+
406+
return;
407+
}
408+
369409
const reqData = {
370410
message: content,
371411
sessionId: session.sessionId.split('-')[1],

0 commit comments

Comments
 (0)