UNPKG

@tiledesk/tiledesk-server

Version:
1,350 lines (879 loc) 59.8 kB
const requestEvent = require('../../event/requestEvent'); const messageEvent = require('../../event/messageEvent'); const triggerEventEmitter = require('./event/triggerEventEmitter'); // const event2Event = require('../../../pubmodules/events/event2Event'); const eventEvent = require('../../pubmodules/events/eventEvent'); var Trigger = require('./models/trigger'); var winston = require('../../config/winston'); var Engine = require('@tiledesk/tiledesk-json-rules-engine').Engine; var messageService = require('../../services/messageService'); var requestService = require('../../services/requestService'); var MessageConstants = require("../../models/messageConstants"); var leadService = require('../../services/leadService'); var LeadConstants = require('../../models/leadConstants'); var operatingHoursService = require("../../services/operatingHoursService"); var sendMessageUtil = require("../../utils/sendMessageUtil"); var sendEmailUtil = require("../../utils/sendEmailUtil"); var cacheUtil = require("../../utils/cacheUtil"); var cacheEnabler = require("../../services/cacheEnabler"); var UIDGenerator = require("../../utils/UIDGenerator"); const RequestConstants = require('../../models/requestConstants'); var Bot = require("../../models/faq_kb"); var request = require('retry-request', { request: require('request') }); const uuidv4 = require('uuid/v4'); var jwt = require('jsonwebtoken'); const port = process.env.PORT || '3000'; let TILEBOT_ENDPOINT = "http://localhost:" + port + "/modules/tilebot/ext/";; if (process.env.TILEBOT_ENDPOINT) { TILEBOT_ENDPOINT = process.env.TILEBOT_ENDPOINT + "/ext/" } winston.debug("TILEBOT_ENDPOINT: " + TILEBOT_ENDPOINT); class RulesTrigger { constructor() { // this.engine = new Engine();; // this.engine = undefined; this.engines = {}; } // getEngine() { // return this.engine; // } listen(success, error) { var that = this; var enabled = process.env.TRIGGER_ENABLED || "true"; winston.debug('Trigger enabled:'+enabled); if (enabled==="true") { winston.debug('Trigger enabled'); }else { winston.info('Trigger disabled'); return 0; } setImmediate(() => { requestEvent.on('request.support_group.created', function(request) { // performance console log // console.log("************* request.support_group.created: "+new Date().toISOString()); // requestEvent.on('request.create', function(request) { var requestJson = request.toJSON(); operatingHoursService.projectIsOpenNow(request.id_project, function (isOpen, err) { requestJson.isOpen = isOpen; winston.debug('requestJson: ', requestJson); that.exec(requestJson, 'request.create', success, error); }); }); // da aggiungere in dashboard requestEvent.on('request.participants.join', function(data) { let request = data.request; let member = data.member; var requestJson = request.toJSON(); operatingHoursService.projectIsOpenNow(request.id_project, function (isOpen, err) { requestJson.isOpen = isOpen; winston.debug('requestJson: ', requestJson); that.exec(requestJson, 'request.participants.join', success, error); }); }); messageEvent.on('message.create.from.requester', function(message) { winston.debug('message.create.from.requester', message); // aggiungi is open anche a message.create altrimenti isOpen nn va // operatingHoursService.projectIsOpenNow(request.id_project, function (isOpen, err) { that.exec(message, 'message.create.from.requester', success, error); }); messageEvent.on('message.received', function(message) { that.exec(message, 'message.received', success, error); }); // event2Event.on('*', function(event){ // winston.verbose('event2Event this.event: ' + this.event); // that.exec(event, this.event, success,error); // }); eventEvent.on('event.emit', function(event) { winston.debug('eventEvent event.emit', event); that.exec(event, 'event.emit', success,error); }); this.runAction(); winston.info('Trigger rules started'); }); } runAction() { triggerEventEmitter.on('message.send', function(eventTrigger) { try { winston.debug('runAction eventTrigger.eventSuccess:', eventTrigger.eventSuccess); var trigger = eventTrigger.trigger; winston.debug('runAction trigger', trigger.toObject()); var action = eventTrigger.action; winston.debug('runAction action', action.toObject()); var fullname = action.parameters.fullName || "BOT"; winston.debug('runAction action fullname: ' + fullname); var sender = "system"; if (action.parameters.sender) { sender = action.parameters.sender; } winston.debug('runAction action sender: ' + sender); var text = action.parameters.text; winston.debug('runAction action text: ' + text); var attributes = {templateProcessor: true}; // var attributes = action.parameters.attributes; // winston.debug('runAction action attributes: ' + attributes); if (text && text.endsWith(":tdk_msg_subtype_info")) { attributes.subtype = "info"; //TODO ATTENTION change value by reference text. Text is string so string is passed by value. No problem text = text.replace(':tdk_msg_subtype_info', ''); winston.verbose('tdk_msg_subtype_info'); } var recipient; if (eventTrigger.eventKey=="request.create" || eventTrigger.eventKey=="request.participants.join") { recipient = eventTrigger.event.request_id; // console.log("eventTrigger.event",eventTrigger.event); // console.log("eventTrigger.event.id_project",eventTrigger.event.id_project); } if (eventTrigger.eventKey=="message.create.from.requester" || eventTrigger.eventKey=="message.received") { recipient = eventTrigger.event.recipient; } if (eventTrigger.eventKey=="event.emit") { winston.debug('runAction action event.emit: ', eventTrigger.event.toObject()); //TODO funziona? recipient = eventTrigger.event.project_user.id_user; } winston.debug('runAction action recipient: ' + recipient); var id_project = eventTrigger.event.id_project; winston.debug('runAction action id_project: ' + id_project); // send(sender, senderFullname, recipient, text, id_project, createdBy, attributes) { // messageService.send( // sender, // fullname, // recipient, // text, // id_project, // null, // attributes // ); // performance console log // console.log("************* send message trigger: "+new Date().toISOString(), text); // send(sender, senderFullname, recipient, text, id_project, createdBy, attributes, type, metadata, language) { sendMessageUtil.send( sender, fullname, recipient, text, id_project, null, attributes ); } catch(e) { winston.error("Error runAction", e); } }); triggerEventEmitter.on('email.send', function(eventTrigger) { try { winston.debug('runAction eventTrigger.eventSuccess:', eventTrigger.eventSuccess); var trigger = eventTrigger.trigger; winston.debug('runAction trigger', trigger.toObject()); var action = eventTrigger.action; winston.debug('runAction action', action.toObject()); var fullname = action.parameters.fullName || "BOT"; winston.debug('runAction action fullname: ' + fullname); var subject = action.parameters.subject || "New Email"; winston.debug('runAction action subject: ' + subject); var sender = "system"; if (action.parameters.sender) { sender = action.parameters.sender; } winston.debug('runAction action sender: ' + sender); var text = action.parameters.text; winston.debug('runAction action text: ' + text); var attributes = {}; // var attributes = action.parameters.attributes; // winston.debug('runAction action attributes: ' + attributes); var recipient; if (eventTrigger.eventKey=="request.create" || eventTrigger.eventKey=="request.participants.join") { recipient = eventTrigger.event.request_id; //custom ocf here //prod //pre // if (eventTrigger.event.id_project =="6406e34727b57500120b1bd6" || eventTrigger.event.id_project == "642c609f179910002cc56b3e") { // // subject = "Richiesta di supporto #" + eventTrigger.event.ticket_id; // subject = "Segnalazione #" + eventTrigger.event.ticket_id; // if (eventTrigger.event.subject) { // subject = subject + " - " + eventTrigger.event.subject; // } // // console.log("subject",subject); // } } if (eventTrigger.eventKey=="message.create.from.requester" || eventTrigger.eventKey=="message.received") { recipient = eventTrigger.event.recipient; } if (eventTrigger.eventKey=="event.emit") { winston.debug('runAction action event.emit: ', eventTrigger.event.toObject()); //TODO funziona? recipient = eventTrigger.event.project_user.id_user; } // console.log("eventTrigger.event", eventTrigger.event); winston.debug('runAction action recipient: ' + recipient); var id_project = eventTrigger.event.id_project; winston.debug('runAction action id_project: ' + id_project); var message = eventTrigger.event; winston.debug('runAction action message: ', message); if (eventTrigger.event.request && eventTrigger.event.request.lead && eventTrigger.event.request.lead.email) { var to = eventTrigger.event.request.lead.email; winston.debug('to ' + to); // sendEmailDirect(to, text, id_project, recipient, subject, message) sendEmailUtil.sendEmailDirect(to, text, id_project, recipient, subject, message); } else { winston.info('email.send trigger. Lead email is undefined '); } } catch(e) { winston.error("Error runAction", e); } }); triggerEventEmitter.on('bot.calling', async (eventTrigger) => { try { winston.debug('runAction eventTrigger.eventSuccess:', eventTrigger.eventSuccess); var trigger = eventTrigger.trigger; winston.debug('runAction trigger', trigger.toObject()); var action = eventTrigger.action; winston.debug('runAction action', action.toObject()); var intentName = action.parameters.intentName; winston.debug('runAction action intentName: ' + intentName); var botId = action.parameters.botId; winston.debug('runAction action botId: ' + botId); var url = TILEBOT_ENDPOINT+botId; if (action.parameters.url) { url = action.parameters.url; } winston.debug('runAction action url: ' + url); var message = action.parameters.message; winston.debug('runAction action message: ' + message); if (eventTrigger.eventKey=="request.create" || eventTrigger.eventKey=="request.participants.join") { // recipient = eventTrigger.event.request_id; } if (eventTrigger.eventKey=="message.create.from.requester" || eventTrigger.eventKey=="message.received") { // recipient = eventTrigger.event.recipient; } if (eventTrigger.eventKey=="event.emit") { winston.debug('runAction action event.emit: ', eventTrigger.event.toObject()); // recipient = eventTrigger.event.project_user.id_user; } // console.log("eventTrigger.event", eventTrigger.event); var id_project = eventTrigger.event.id_project; winston.debug('runAction action id_project: ' + id_project); var payload = Object.assign({}, eventTrigger.event);; winston.debug('runAction action payload: ', payload); if (message && payload.text) { payload.text = message; winston.debug('forcing payload text to : ' + payload.text); } delete payload.request.snapshot var json = {timestamp: Date.now(), payload: payload}; json["hook"] = trigger; var bot = await Bot.findById(botId).select("+secret").exec(); winston.debug("bot: ", bot); var signOptions = { issuer: 'https://tiledesk.com', subject: 'bot', audience: 'https://tiledesk.com/bots/'+bot._id, jwtid: uuidv4() }; let botPayload = bot.toObject(); let botSecret = botPayload.secret; delete botPayload.secret; delete botPayload.description; delete botPayload.attributes; var token = jwt.sign(botPayload, botSecret, signOptions); json["token"] = token; var webhook_origin = process.env.WEBHOOK_ORIGIN || "http://localhost:3000"; winston.debug("webhook_origin: "+webhook_origin); winston.debug("Rules trigger notify json ", json ); request({ url: url, headers: { 'Content-Type' : 'application/json', 'User-Agent': 'tiledesk-bot', 'Origin': webhook_origin //'x-hook-secret': s.secret }, json: json, method: 'POST' }, function(err, result, json){ winston.verbose("SENT notify for bot with url " + url + " with err " + err); winston.debug("SENT notify for bot with url ", result); if (err) { winston.error("Error sending notify for bot with url " + url + " with err " + err); //TODO Reply with error // next(err, json); } }); } catch(e) { winston.error("Error runAction", e); } }); triggerEventEmitter.on('request.department.route', function(eventTrigger) { try { winston.debug('runAction eventTrigger.eventSuccess:', eventTrigger.eventSuccess); var trigger = eventTrigger.trigger; winston.debug('runAction trigger', trigger.toObject()); var action = eventTrigger.action; winston.debug('runAction action', action.toObject()); var departmentid = action.parameters.departmentid; winston.debug('runAction action departmentid: ' + departmentid); var request_id; if (eventTrigger.eventKey=="request.create") { request_id = eventTrigger.event.request_id; } if (eventTrigger.eventKey=="message.create.from.requester" || eventTrigger.eventKey=="message.received") { request_id = eventTrigger.event.recipient; } winston.debug('runAction action request_id: ' + request_id); var id_project = eventTrigger.event.id_project; winston.debug('runAction action id_project: ' + id_project); // route(request_id, departmentid, id_project, nobot) { requestService.route(request_id, departmentid, id_project).catch((err) => { winston.error("Error runAction route: ", err); }); } catch(e) { winston.error("Error runAction", e); } }); triggerEventEmitter.on('request.department.route.self', function(eventTrigger) { try { winston.debug('runAction eventTrigger.eventSuccess:', eventTrigger.eventSuccess); var trigger = eventTrigger.trigger; winston.debug('runAction trigger', trigger.toObject()); var action = eventTrigger.action; winston.debug('runAction action', action.toObject()); var request_id; if (eventTrigger.eventKey=="request.create") { request_id = eventTrigger.event.request_id; } if (eventTrigger.eventKey=="message.create.from.requester" || eventTrigger.eventKey=="message.received") { request_id = eventTrigger.event.recipient; } winston.debug('runAction action request_id: ' + request_id); var id_project = eventTrigger.event.id_project; winston.debug('runAction action id_project: ' + id_project); // reroute(request_id, id_project, nobot) { requestService.reroute(request_id, id_project).catch((err) => { winston.error("Error runAction on reroute", err); }); } catch(e) { winston.error("Error runAction", e); } }); triggerEventEmitter.on('request.status.update', function(eventTrigger) { try { winston.debug('runAction eventTrigger.eventSuccess:', eventTrigger.eventSuccess); var trigger = eventTrigger.trigger; winston.debug('runAction trigger', trigger.toObject()); var action = eventTrigger.action; winston.debug('runAction action', action.toObject()); var newstatus = action.parameters.status; winston.debug('runAction action newstatus: ' + newstatus); var request_id; if (eventTrigger.eventKey=="request.create") { request_id = eventTrigger.event.request_id; } if (eventTrigger.eventKey=="message.create.from.requester" || eventTrigger.eventKey=="message.received") { request_id = eventTrigger.event.recipient; } winston.debug('runAction action request_id: ' + request_id); var id_project = eventTrigger.event.id_project; winston.debug('runAction action id_project: ' + id_project); // changeStatusByRequestId(request_id, id_project, newstatus) { requestService.changeStatusByRequestId(request_id, id_project, newstatus); } catch(e) { winston.error("Error runAction", e); } }); triggerEventEmitter.on('request.close', function(eventTrigger) { try { winston.debug('runAction eventTrigger.eventSuccess:', eventTrigger.eventSuccess); var trigger = eventTrigger.trigger; winston.debug('runAction trigger', trigger.toObject()); var action = eventTrigger.action; winston.debug('runAction action', action.toObject()); var request_id; if (eventTrigger.eventKey=="request.create") { request_id = eventTrigger.event.request_id; } if (eventTrigger.eventKey=="message.create.from.requester" || eventTrigger.eventKey=="message.received") { request_id = eventTrigger.event.recipient; } winston.debug('runAction action request_id: ' + request_id); var id_project = eventTrigger.event.id_project; winston.debug('runAction action id_project: ' + id_project); // closeRequestByRequestId(request_id, id_project, skipStatsUpdate, notify, closed_by) const closed_by = "_trigger"; requestService.closeRequestByRequestId(request_id, id_project, false, true, closed_by); } catch(e) { winston.error("Error runAction", e); } }); triggerEventEmitter.on('request.reopen', function(eventTrigger) { try { winston.debug('runAction eventTrigger.eventSuccess:', eventTrigger.eventSuccess); var trigger = eventTrigger.trigger; winston.debug('runAction trigger', trigger.toObject()); var action = eventTrigger.action; winston.debug('runAction action', action.toObject()); var request_id; if (eventTrigger.eventKey=="request.create") { request_id = eventTrigger.event.request_id; } if (eventTrigger.eventKey=="message.create.from.requester" || eventTrigger.eventKey=="message.received") { request_id = eventTrigger.event.recipient; } winston.debug('runAction action request_id: ' + request_id); var id_project = eventTrigger.event.id_project; winston.debug('runAction action id_project: ' + id_project); // reopenRequestByRequestId(request_id, id_project) { requestService.reopenRequestByRequestId(request_id, id_project); } catch(e) { winston.error("Error runAction", e); } }); triggerEventEmitter.on('request.participants.join', function(eventTrigger) { try { winston.debug('runAction eventTrigger.eventSuccess:', eventTrigger.eventSuccess); var trigger = eventTrigger.trigger; winston.debug('runAction trigger', trigger.toObject()); var action = eventTrigger.action; winston.debug('runAction action', action.toObject()); // console.log("actionaction",action); var member = action.parameters.member; winston.debug('runAction action member: ' + member); var request_id; if (eventTrigger.eventKey=="request.create") { request_id = eventTrigger.event.request_id; } if (eventTrigger.eventKey=="message.create.from.requester" || eventTrigger.eventKey=="message.received") { request_id = eventTrigger.event.recipient; } winston.debug('runAction action request_id: ' + request_id); var id_project = eventTrigger.event.id_project; winston.debug('runAction action id_project: ' + id_project); // addParticipantByRequestId(request_id, id_project, member) { requestService.addParticipantByRequestId(request_id, id_project, member); } catch(e) { winston.error("Error runAction", e); } }); triggerEventEmitter.on('request.department.bot.launch', function(eventTrigger) { try { winston.debug('triggerEventEmitter eventTrigger:', eventTrigger); winston.debug('runAction eventTrigger.eventSuccess:', eventTrigger.eventSuccess); var trigger = eventTrigger.trigger; winston.debug('runAction trigger', trigger.toObject()); var action = eventTrigger.action; winston.debug('runAction action', action.toObject()); var request_id; if (eventTrigger.eventKey=="request.create") { request_id = eventTrigger.event.request_id; } if (eventTrigger.eventKey=="message.create.from.requester" || eventTrigger.eventKey=="message.received") { request_id = eventTrigger.event.recipient; } winston.debug('runAction action request_id: ' + request_id); var id_project = eventTrigger.event.id_project; winston.debug('runAction action id_project: ' + id_project); var startText = "/start"; // var startText = "\\start"; if (action.parameters && action.parameters.text) { startText = action.parameters.text; } winston.debug('runAction action startText: ' + startText); // reroute(request_id, id_project, nobot) { requestService.reroute(request_id, id_project).then(function(request) { winston.verbose('request.department.bot.launch action reroute request_id: ' + request_id); // rendi dinamico /start messageService.send( 'system', 'Bot', request_id, startText, // /start controlla se chatbot nuovo manda /start altrimenti per i vecchi \start id_project, null, {subtype:'info', updateconversation : false} ); // TODO Add typing? }).catch((err) => { winston.error("Error runAction on reroute", err); }) } catch(e) { winston.error("Error runAction", e); } }); triggerEventEmitter.on('request.bot.launch', function(eventTrigger) { try { winston.debug('runAction eventTrigger.eventSuccess:', eventTrigger.eventSuccess); var trigger = eventTrigger.trigger; winston.debug('runAction trigger', trigger.toObject()); var action = eventTrigger.action; winston.debug('runAction action', action.toObject()); var request_id; if (eventTrigger.eventKey=="request.create") { request_id = eventTrigger.event.request_id; } if (eventTrigger.eventKey=="message.create.from.requester" || eventTrigger.eventKey=="message.received") { request_id = eventTrigger.event.recipient; } winston.debug('runAction action request_id: ' + request_id); var member = action.parameters.member; winston.debug('runAction action member: ' + member); var id_project = eventTrigger.event.id_project; winston.debug('runAction action id_project: ' + id_project); requestService.addParticipantByRequestId(request_id, id_project, member).then(function(request) { winston.verbose('request.bot.launch action request_id: ' + request_id); // rendi dinamico /start messageService.send( 'system', 'Bot', request_id, '/start', // TODO CHANGE TO / start id_project, null, {subtype:'info', updateconversation : false} ); // TODO Add typing? }) } catch(e) { winston.error("Error runAction", e); } }); triggerEventEmitter.on('request.tags.add', function(eventTrigger) { try { winston.debug('runAction eventTrigger.eventSuccess:', eventTrigger.eventSuccess); var trigger = eventTrigger.trigger; winston.debug('runAction trigger', trigger.toObject()); var action = eventTrigger.action; winston.debug('runAction action', action.toObject()); // console.log("actionaction",action); var tag = action.parameters.tag; winston.debug('runAction action tag: ' + tag); var request_id; if (eventTrigger.eventKey=="request.create") { request_id = eventTrigger.event.request_id; } if (eventTrigger.eventKey=="message.create.from.requester" || eventTrigger.eventKey=="message.received") { request_id = eventTrigger.event.recipient; } winston.debug('runAction action request_id: ' + request_id); var id_project = eventTrigger.event.id_project; winston.debug('runAction action id_project: ' + id_project); // addTagByRequestId(request_id, id_project, tag) { requestService.addTagByRequestId(request_id, id_project, {tag:tag}); } catch(e) { winston.error("Error runAction", e); } }); triggerEventEmitter.on('request.participants.leave', function(eventTrigger) { try { winston.debug('runAction eventTrigger.eventSuccess:', eventTrigger.eventSuccess); var trigger = eventTrigger.trigger; winston.debug('runAction trigger', trigger.toObject()); var action = eventTrigger.action; winston.debug('runAction action', action.toObject()); var member = action.parameters.member; winston.debug('runAction action member: ' + member); var request_id; if (eventTrigger.eventKey=="request.create") { request_id = eventTrigger.event.request_id; } if (eventTrigger.eventKey=="message.create.from.requester" || eventTrigger.eventKey=="message.received") { request_id = eventTrigger.event.recipient; } winston.debug('runAction action request_id: ' + request_id); var id_project = eventTrigger.event.id_project; winston.debug('runAction action id_project: ' + id_project); // removeParticipantByRequestId(request_id, id_project, member) { requestService.removeParticipantByRequestId(request_id, id_project, member).catch((err) => { winston.error("(RulesTrigger) removeParticipantByRequestId error", err) }); } catch(e) { winston.error("Error runAction", e); } }); triggerEventEmitter.on('request.create', function(eventTrigger) { try { winston.debug('runAction eventTrigger.eventSuccess:', eventTrigger.eventSuccess); var trigger = eventTrigger.trigger; winston.debug('runAction trigger', trigger.toObject()); var action = eventTrigger.action; winston.debug('runAction action', action.toObject()); var text = action.parameters.text; winston.debug('runAction action text: ' + text); var subtype = action.parameters.subtype; winston.debug('runAction action subtype: ' + subtype);; var status = action.parameters.status; winston.debug('runAction action status: ' + status); var preflight = action.parameters.preflight; winston.debug('runAction action preflight: ' + preflight); if (text && text.indexOf(":tdk_msg_subtype_info")>-1) { //TODO ATTENTION change value by reference text subtype. Text is string so string is passed by value. No problem subtype = "info"; text = text.replace(':tdk_msg_subtype_info', ''); winston.debug('tdk_msg_subtype_info'); } if (text && text.indexOf(":tdk_req_status_hidden")>-1) { //TODO ATTENTION change value by reference status preflight text. Text is string so string is passed by value. No problem status = 50; preflight = true; text = text.replace(':tdk_req_status_hidden', ''); winston.debug('tdk_req_status_hidden'); } var type = action.parameters.type; winston.debug('runAction action type: ' + type); var departmentid = action.parameters.departmentid; winston.debug('runAction action departmentid: ' + departmentid); var participants = action.parameters.participants; winston.debug('runAction action participants: ' + participants); // var attributes = action.parameters.attributes; // winston.debug('runAction action attributes: ' + attributes); var request_id = 'support-group-'+id_project+"-"+UIDGenerator.generate(); var id_user; var fullname; var email; var attributes = {}; var sourcePage; var language; var userAgent; var userObj = undefined; if (eventTrigger.eventKey=="event.emit") { winston.verbose('runAction action event.emit: ', eventTrigger.event); // winston.debug('runAction action event.emit: ', eventTrigger.event.toObject()); // if (eventTrigger.event.project_user && // eventTrigger.event.project_user.uuid_user && // eventTrigger.event.project_user.uuid_user) { id_user = eventTrigger.event.project_user.uuid_user; if (eventTrigger.event.user) { winston.verbose('eventTrigger.event.user: ', eventTrigger.event.user); if (eventTrigger.event.user.toObject) { userObj = eventTrigger.event.user.toObject(); }else { userObj = eventTrigger.event.user; } //TODO ATTENTION change value by reference userObj.password. This is a problem for trigger. Resolve it delete userObj.password; if (eventTrigger.event.user.fullName) { fullname = eventTrigger.event.user.fullName; winston.verbose('fullname: '+ fullname); } if (eventTrigger.event.user.email) { email = eventTrigger.event.user.email; winston.verbose('email: '+ email); } } // } // if (attributes && attributes.id_user) { // id_user = attributes.id_user; // } if (eventTrigger.event.attributes) { var eventAttributes = eventTrigger.event.attributes; if (eventAttributes.request_id) { request_id = eventAttributes.request_id; } if (eventAttributes.id_user) { id_user = eventAttributes.id_user; } if (eventAttributes.fullname) { fullname = eventAttributes.fullname; } if (eventAttributes.email) { email = eventAttributes.email; } if (eventAttributes.language) { language = eventAttributes.language; } if (eventAttributes.department) { //TODO Dario change to departmentId departmentid = eventAttributes.department; } if (eventAttributes.text) { text = eventAttributes.text; } // console.log("eventAttributes.participants.length"+ eventAttributes.participants.length); if (eventAttributes.participants && eventAttributes.participants.length>0) { participants = eventAttributes.participants; if (participants[0].indexOf("bot_")>-1) { // TODO CHANGE TO /start text = "/start"; //if participants is passed than the bot reply to the first message "welcome" so I changed "welcome" with "\start" } // status = RequestConstants.ASSIGNED; // console.log("eventAttributes.participants",eventAttributes.participants); } // console.log("text", text); if (eventAttributes.status) { status = eventAttributes.status; } if (eventAttributes.subtype) { subtype = eventAttributes.subtype; } if (eventAttributes.attributes) { attributes = eventAttributes.attributes; if (eventAttributes.attributes.client) { userAgent = eventAttributes.attributes.client; //the widget pass client parameter and not userAgent } if (eventAttributes.attributes.sourcePage) { sourcePage = eventAttributes.attributes.sourcePage; } } } if (subtype) { attributes.subtype = subtype; } if (userObj) { attributes.decoded_jwt = userObj; } } winston.debug('runAction action id_user:'+id_user); var id_project = eventTrigger.event.id_project; winston.debug('runAction action id_project: ' + id_project); // createIfNotExistsWithLeadId(lead_id, fullname, email, id_project, createdBy, attributes, status) leadService.createIfNotExistsWithLeadId(id_user, fullname , email, id_project, null, attributes, LeadConstants.TEMP) .then(function(createdLead) { // return Project_user.findOne(queryProjectUser, function (err, project_user) { // var project_user_id = null; // if (err) { // winston.error("Error getting the project_user_id", err); // } // if (project_user) { // winston.verbose("project_user", project_user); // project_user_id = project_user.id; // winston.verbose("project_user_id: " + project_user_id); // } var puser = eventTrigger.event.project_user; var project_user_id = puser._id; //questo è null se nn specifico come trigger un event winston.verbose("project_user_id: " + project_user_id); // qui c'è errore c21 // createWithIdAndRequester(request_id, project_user_id, lead_id, id_project, first_text, departmentid, sourcePage, // language, userAgent, status, createdBy, attributes, subject, preflight) { // return requestService.createWithIdAndRequester(request_id, project_user_id, createdLead._id, id_project, // text, departmentid, sourcePage, // language, userAgent, status, id_user, attributes, undefined, preflight).then(function (savedRequest) { var new_request = { request_id: request_id, project_user_id: project_user_id, lead_id: createdLead._id, id_project: id_project, first_text: text, participants: participants, departmentid: departmentid, sourcePage: sourcePage, language: language, userAgent: userAgent, status: status, createdBy: id_user, attributes: attributes, subject: undefined, preflight: preflight, channel: undefined, location: undefined, lead: createdLead, requester: puser }; return requestService.create(new_request).then(function (savedRequest) { // performance console log // console.log("************* request created trigger: "+new Date().toISOString()); if (attributes) { attributes.sendnotification = false; // sembra nn funzionae } var senderFullname = fullname || 'Guest'; // guest_here // create(sender, senderFullname, recipient, text, id_project, createdBy, status, attributes, type, metadata, language) { return messageService.create( id_user, senderFullname , savedRequest.request_id, text, id_project, id_user, MessageConstants.CHAT_MESSAGE_STATUS.SENDING, attributes, type, eventTrigger.event.metadata, language); }).catch(function (err) { winston.error("Error trigger requestService.create", err); }); }); // }); } catch(e) { winston.error("Error runAction", e); } }); } delayedFunction(action,triggerEvent, waitTime) { setTimeout(function() { triggerEvent.action = action; // console.log("setTimeout",action.key, triggerEvent); triggerEventEmitter.emit(action.key,triggerEvent ); }, waitTime); } createEngine() { } exec(event, eventKey,successCall,errorCall) { var that = this; // winston.verbose('this', this); // var eventKey = Object.keys(this._events); // var eventKey = Object.values(this._events); // winston.verbose('eventKey: ',eventKey); // winston.verbose('this', JSON.stringify(this)); setImmediate(() => { winston.debug('event', event); winston.debug('successCall', successCall); winston.debug('trigger event', event); let query = {id_project: event.id_project, enabled:true, 'trigger.key':eventKey}; winston.debug('trigger query', query); let q = Trigger.find(query); if (cacheEnabler.trigger) { q.cache(cacheUtil.longTTL, event.id_project+":triggers:trigger.key:"+eventKey) //CACHE_TRIGGER winston.debug('trigger cache enabled'); } q.exec(function(err, triggers) { if (err) { winston.error('Error gettting bots ', err); return 0; } if (!triggers || triggers.length==0) { winston.debug('No trigger found'); return 0; } winston.debug('active triggers found', triggers); // var engineExists = that.engines.hasOwnProperty(event.id_project); // // var engineExists = that.engines.hasOwnProperty(event.id_project+"-"+eventKey); // winston.verbose("engineExists:"+engineExists); // var engine; // if (!engineExists) { // engine = new Engine(); // that.engines[event.id_project] = engine; // // that.engines[event.id_project+"-"+eventKey] = engine; // winston.verbose("create engine"); // }else { // engine = that.engines[event.id_project]; // // engine = that.engines[event.id_project+"-"+eventKey]; // winston.verbose("engine already exists"); // return 0; // } var engine = new Engine(); // winston.verbose("create engine"); // that.engine = new Engine(); triggers.forEach(function(trigger) { winston.debug('trigger', trigger.toObject()); var rule = { conditions: { }, event: { // define the event to fire when the conditions evaluate truthy type: trigger.id, // type: trigger.actions[0].key, params: trigger.actions // params: {id: trigger._id, actionParameters:trigger.actions[0].parameters} // params: { // message: 'Player has fouled out!' // } } }; // qui se non imposto condizioni // uncaughtException: "conditions" root must contain a single instance of "all" or "any" // 2022-07-18T08:58:18.589888+00:00 app[web.1]: Error: "conditions" root must contain a single instance of "all" or "any" if (trigger.conditions.all.toObject() && trigger.conditions.all.toObject().length>0) { rule.conditions.all = trigger.conditions.all.toObject(); } if (trigger.conditions.any.toObject() && trigger.conditions.any.toObject().length>0) { rule.conditions.any = trigger.conditions.any.toObject(); } winston.debug('rule', rule); // define a rule for detecting the player has exceeded foul limits. Foul out any player who: // (has committed 5 fouls AND game is 40 minutes) OR (has committed 6 fouls AND game is 48 minutes) engine.addRule(rule); // that.engine.addRule(rule); }); /** * Define facts the engine will use to evaluate the conditions above. * Facts may also be loaded asynchronously at runtime; see the advanced example below */ // let facts = event.toObject(); let facts; if (event.toJSON) { //request is mongoose object facts = event.toJSON(); }else { //message is plain object because messageEvent replace it facts = event; } winston.verbose("facts", facts); engine.addFact("json", facts) engine.on('success', function(eventSuccess, almanac, ruleResult) { // info: runAction eventTrigger.eventSuccess: {"type":"request.create","params":{"id":"5e4a771a248688f8ea55e47a","actionParameters":{"fullName":"fullName","text":"hi"}}} winston.debug("success eventSuccess", eventSuccess); winston.debug("success ruleResult", ruleResult); var triggerEvent = {event: event, eventKey:eventKey , triggers: triggers, ruleResult:requestEvent,eventSuccess:eventSuccess, engine:engine }; // info: test success eventTrigger:{ // "event":{"_id":"5e4a771a248688f8ea55e47e","name":"user.pay","attributes":{"attr1":"val1"},"id_project":"5e4a771a248688f8ea55e476","project_user":{"_id":"5e4a771a248688f8ea55e477","id_project":"5e4a771a248688f8ea55e476","id_user":{"_id":"5e4a771a248688f8ea55e475","email":"test-trigger-EventEmit-1581938458317@email.com","firstname":"Test Firstname","lastname":"Test lastname","createdAt":"2020-02-17T11:20:58.326Z","updatedAt":"2020-02-17T11:20:58.326Z","__v":0},"role":"owner","user_available":true,"createdBy