oex2003/evolution-api
0
1import { InstanceDto } from '@api/dto/instance.dto';2import { PrismaRepository } from '@api/repository/repository.service';3import {4 difyController,5 evoaiController,6 evolutionBotController,7 flowiseController,8 n8nController,9 openaiController,10 typebotController,11} from '@api/server.module';12import { WAMonitoringService } from '@api/services/monitor.service';13import { Logger } from '@config/logger.config';14import { IntegrationSession } from '@prisma/client';15import { findBotByTrigger } from '@utils/findBotByTrigger';16 17export type EmitData = {18 instance: InstanceDto;19 remoteJid: string;20 msg: any;21 pushName?: string;22};23 24export interface ChatbotControllerInterface {25 integrationEnabled: boolean;26 botRepository: any;27 settingsRepository: any;28 sessionRepository: any;29 userMessageDebounce: { [key: string]: { message: string; timeoutId: NodeJS.Timeout } };30 31 createBot(instance: InstanceDto, data: any): Promise<any>;32 findBot(instance: InstanceDto): Promise<any>;33 fetchBot(instance: InstanceDto, botId: string): Promise<any>;34 updateBot(instance: InstanceDto, botId: string, data: any): Promise<any>;35 deleteBot(instance: InstanceDto, botId: string): Promise<any>;36 37 settings(instance: InstanceDto, data: any): Promise<any>;38 fetchSettings(instance: InstanceDto): Promise<any>;39 40 changeStatus(instance: InstanceDto, botId: string, status: string): Promise<any>;41 fetchSessions(instance: InstanceDto, botId: string, remoteJid?: string): Promise<any>;42 ignoreJid(instance: InstanceDto, data: any): Promise<any>;43 44 emit(data: EmitData): Promise<void>;45}46 47export class ChatbotController {48 public prismaRepository: PrismaRepository;49 public waMonitor: WAMonitoringService;50 51 public readonly logger = new Logger('ChatbotController');52 53 constructor(prismaRepository: PrismaRepository, waMonitor: WAMonitoringService) {54 this.prisma = prismaRepository;55 this.monitor = waMonitor;56 }57 58 public set prisma(prisma: PrismaRepository) {59 this.prismaRepository = prisma;60 }61 62 public get prisma() {63 return this.prismaRepository;64 }65 66 public set monitor(waMonitor: WAMonitoringService) {67 this.waMonitor = waMonitor;68 }69 70 public get monitor() {71 return this.waMonitor;72 }73 74 public async emit({75 instance,76 remoteJid,77 msg,78 pushName,79 isIntegration = false,80 }: {81 instance: InstanceDto;82 remoteJid: string;83 msg: any;84 pushName?: string;85 isIntegration?: boolean;86 }): Promise<void> {87 const emitData = {88 instance,89 remoteJid,90 msg,91 pushName,92 isIntegration,93 };94 await evolutionBotController.emit(emitData);95 96 await typebotController.emit(emitData);97 98 await openaiController.emit(emitData);99 100 await difyController.emit(emitData);101 102 await n8nController.emit(emitData);103 104 await evoaiController.emit(emitData);105 106 await flowiseController.emit(emitData);107 }108 109 public processDebounce(110 userMessageDebounce: any,111 content: string,112 remoteJid: string,113 debounceTime: number,114 callback: any,115 ) {116 if (userMessageDebounce[remoteJid]) {117 userMessageDebounce[remoteJid].message += `\n${content}`;118 this.logger.log('message debounced: ' + userMessageDebounce[remoteJid].message);119 clearTimeout(userMessageDebounce[remoteJid].timeoutId);120 } else {121 userMessageDebounce[remoteJid] = {122 message: content,123 timeoutId: null,124 };125 }126 127 userMessageDebounce[remoteJid].timeoutId = setTimeout(() => {128 const myQuestion = userMessageDebounce[remoteJid].message;129 this.logger.log('Debounce complete. Processing message: ' + myQuestion);130 131 delete userMessageDebounce[remoteJid];132 callback(myQuestion);133 }, debounceTime * 1000);134 }135 136 public checkIgnoreJids(ignoreJids: any, remoteJid: string) {137 if (ignoreJids && ignoreJids.length > 0) {138 let ignoreGroups = false;139 let ignoreContacts = false;140 141 if (ignoreJids.includes('@g.us')) {142 ignoreGroups = true;143 }144 145 if (ignoreJids.includes('@s.whatsapp.net')) {146 ignoreContacts = true;147 }148 149 if (ignoreGroups && remoteJid.endsWith('@g.us')) {150 this.logger.warn('Ignoring message from group: ' + remoteJid);151 return true;152 }153 154 if (ignoreContacts && remoteJid.endsWith('@s.whatsapp.net')) {155 this.logger.warn('Ignoring message from contact: ' + remoteJid);156 return true;157 }158 159 if (ignoreJids.includes(remoteJid)) {160 this.logger.warn('Ignoring message from jid: ' + remoteJid);161 return true;162 }163 164 return false;165 }166 167 return false;168 }169 170 public async getSession(remoteJid: string, instance: InstanceDto) {171 let session = await this.prismaRepository.integrationSession.findFirst({172 where: {173 remoteJid: remoteJid,174 instanceId: instance.instanceId,175 },176 orderBy: { createdAt: 'desc' },177 });178 179 if (session) {180 if (session.status !== 'closed' && !session.botId) {181 this.logger.warn('Session is already opened in another integration');182 return null;183 } else if (!session.botId) {184 session = null;185 }186 }187 188 return session;189 }190 191 public async findBotTrigger(192 botRepository: any,193 content: string,194 instance: InstanceDto,195 session?: IntegrationSession,196 ) {197 let findBot: any = null;198 199 if (!session) {200 findBot = await findBotByTrigger(botRepository, content, instance.instanceId);201 202 if (!findBot) {203 return null;204 }205 } else {206 findBot = await botRepository.findFirst({207 where: {208 id: session.botId,209 },210 });211 }212 213 return findBot;214 }215}216 