diff --git a/backend/src/helpers/MostRepeatedPhrase.ts b/backend/src/helpers/MostRepeatedPhrase.ts new file mode 100644 index 0000000..71ced82 --- /dev/null +++ b/backend/src/helpers/MostRepeatedPhrase.ts @@ -0,0 +1,56 @@ +import { subSeconds } from "date-fns"; +import Message from "../models/Message"; + +import { Op, Sequelize } from "sequelize"; + +const mostRepeatedPhrase = async ( + ticketId: number | string, + fromMe: boolean = false +) => { + let res: any = { body: "", occurrences: 0 }; + + try { + const mostRepeatedPhrase: any = await Message.findOne({ + where: { + ticketId: ticketId, + fromMe: fromMe ? fromMe : 0, + body: { + [Op.notRegexp]: "^[0-9]+$" + }, + updatedAt: { + [Op.between]: [+subSeconds(new Date(), 150), +new Date()] + } + }, + attributes: [ + "body", + [Sequelize.fn("COUNT", Sequelize.col("body")), "occurrences"] + ], + + group: ["body"], + order: [[Sequelize.literal("occurrences"), "DESC"]], + limit: 1 + }); + + if (mostRepeatedPhrase) { + const { body, occurrences } = mostRepeatedPhrase.get(); + + console.log( + `The most repeated phrase is "${body}" with ${occurrences} occurrences.` + ); + + const isNumber = /^\d+$/.test(body.trim()); + + if (!isNumber) { + return { body, occurrences }; + } + } else { + console.log("No phrases found."); + } + } catch (error) { + console.log("error on MostRepeatedPhrase: ", error); + } + + return { body: "", occurrences: 0 }; +}; + +export default mostRepeatedPhrase; diff --git a/backend/src/services/WbotServices/wbotMessageListener.ts b/backend/src/services/WbotServices/wbotMessageListener.ts index 7e812b6..8bef346 100644 --- a/backend/src/services/WbotServices/wbotMessageListener.ts +++ b/backend/src/services/WbotServices/wbotMessageListener.ts @@ -82,6 +82,7 @@ import { import AppError from "../../errors/AppError"; import { setMessageAsRead } from "../../helpers/SetMessageAsRead"; import SettingTicket from "../../models/SettingTicket"; +import mostRepeatedPhrase from "../../helpers/MostRepeatedPhrase"; var lst: any[] = getWhatsappIds(); @@ -299,12 +300,20 @@ const verifyQueue = async ( sendWhatsAppMessageSocket(ticket, body); } else { //test del transfere o atendimento se entrar na ura infinita - let ticket_message = await ShowTicketMessage(ticket.id, false); - if (ticket_message.length > 10) { + const repet: any = await mostRepeatedPhrase(ticket.id); + + if (repet.occurrences > 4) { await UpdateTicketService({ ticketData: { status: "pending", queueId: queues[0].id }, ticketId: ticket.id }); + + await SendWhatsAppMessage({ + body: `Seu atendimento foi transferido para um agente! + `, + ticket, + number: `${contact.number}@c.us` + }); } else { let options = ""; @@ -613,52 +622,57 @@ const handleMessage = async (msg: any, wbot: any): Promise => { await setMessageAsRead(ticket); } - // MESSAGE TO HOLIDAY - const holiday: any = await isHoliday(); + let ticketHasQueue = false; - if (holiday.set) { - if (msg.fromMe && holiday.msg == msg.body) { - console.log("HOLIDAY MESSAGE IGNORED"); + if (ticket?.queueId) { + ticketHasQueue = true; + } + + if (ticketHasQueue) { + // MESSAGE TO HOLIDAY + const holiday: any = await isHoliday(); + + if (holiday.set) { + if (msg.fromMe && holiday.msg == msg.body) { + console.log("HOLIDAY MESSAGE IGNORED"); + return; + } + + botSendMessage(ticket, holiday.msg); return; } - botSendMessage(ticket, holiday.msg); - return; - } + // MESSAGES TO SATURDAY OR SUNDAY + const weekend: any = await isWeekend(); - // MESSAGES TO SATURDAY OR SUNDAY - const weekend: any = await isWeekend(); + if (weekend.set) { + if (msg.fromMe && weekend.msg == msg.body) { + console.log("WEEKEND MESSAGE IGNORED"); + return; + } - if (weekend.set) { - if (msg.fromMe && weekend.msg == msg.body) { - console.log("WEEKEND MESSAGE IGNORED"); + botSendMessage(ticket, weekend.msg); return; } - botSendMessage(ticket, weekend.msg); - return; - } + // MESSAGE TO BUSINESS TIME + const businessTime = await isOutBusinessTime(); - // MESSAGE TO BUSINESS TIME - const businessTime = await isOutBusinessTime(); + if (businessTime.set) { + if (msg.fromMe && businessTime.msg == msg.body) { + console.log("BUSINESS TIME MESSAGE IGNORED"); + return; + } - if (businessTime.set) { - if (msg.fromMe && businessTime.msg == msg.body) { - console.log("BUSINESS TIME MESSAGE IGNORED"); + botSendMessage(ticket, businessTime.msg); return; } - - botSendMessage(ticket, businessTime.msg); - return; } - - } catch (err) { Sentry.captureException(err); console.log("Error handling whatsapp message: Err: ", err); logger.error(`Error handling whatsapp message: Err: ${err}`); - } - + } }; const handleMsgAck = async (msg_id: any, ack: any) => {