Team Ai
Apppublic

oex2003/evolution-api

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes
chatbot.controller.ts216 linesDownload Raw Back to chatbot
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