UNPKG

@tiledesk/tiledesk-server

Version:
998 lines (670 loc) 50.8 kB
const messageEvent = require('../../event/messageEvent'); const authEvent = require('../../event/authEvent'); const botEvent = require('../../event/botEvent'); const requestEvent = require('../../event/requestEvent'); const groupEvent = require('../../event/groupEvent'); const chat21Event = require('./chat21Event'); const leadEvent = require('../../event/leadEvent'); var messageService = require('../../services/messageService'); var MessageConstants = require("../../models/messageConstants"); var ChannelConstants = require("../../models/channelConstants"); var winston = require('../../config/winston'); var Request = require("../../models/request"); var chat21Config = require('./chat21Config'); var chat21 = require('./chat21Client'); const MaskData = require("maskdata"); const maskPasswordOptions = { // Character to mask the data. default value is '*' maskWith : "*", //Should be positive Integer // If the starting 'n' digits needs to be unmasked // Default value is 4 unmaskedStartDigits: 3, // Should be positive Integer //If the ending 'n' digits needs to be unmasked // Default value is 1 unmaskedEndDigits: 2 }; // var chat21Util = require('./chat21Util'); // var tiledeskUtil = require('./tiledesk-util'); var adminToken = process.env.CHAT21_ADMIN_TOKEN || chat21Config.adminToken; const masked_adminToken = MaskData.maskPhone(adminToken, maskPasswordOptions); winston.info('Chat21Handler adminToken: '+ masked_adminToken); class Chat21Handler { typing(message, timestamp) { return new Promise(function (resolve, reject) { // if privateFor skip typing //no typing for subtype info if (message.attributes && message.attributes.subtype && (message.attributes.subtype==='info' || message.attributes.subtype==='private')) { return resolve(); }else { chat21.conversations.typing(message.recipient, message.sender, message.text, timestamp).finally(function() { return resolve(); }); } }); } listen() { var that = this; winston.debug("Chat21Handler listener start "); if (process.env.SYNC_CHAT21_GROUPS !=="true") { winston.info("Sync Tiledesk to Chat21 groups disabled"); // return; questo distrugge il tread. attento non lo mettere + } // chat21Handler on worker is loaded with stadard events like request.create and NOT request.create.queue because it is used internally by the worker when the request is closed by ChatUnhandledRequestScheduler // su projectUser create e update authEvent.on('user.signup', function(userData) { var firstName = userData.savedUser.firstname; var lastName = userData.savedUser.lastname; var email = userData.savedUser.email; var current_user = userData.savedUser.id; setImmediate(() => { winston.debug("Chat21Handler on user.signup ", userData); chat21.auth.setAdminToken(adminToken); // create: function(firstname, lastname, email, current_user){ chat21.contacts.create(firstName, lastName, email, current_user).then(function(data) { winston.verbose("Chat21 contact created: " + JSON.stringify(data)); chat21Event.emit('contact.create', data); }).catch(function(err) { winston.error("Error creating chat21 contact ", err); chat21Event.emit('contact.create.error', err); }); }); }); authEvent.on('user.update', function(userData) { var firstName = userData.updatedUser.firstname; var lastName = userData.updatedUser.lastname; var current_user = userData.updatedUser.id; setImmediate(() => { winston.debug("Chat21Handler on user.update ", userData); chat21.auth.setAdminToken(adminToken); // update: function(firstname, lastname, current_user){ chat21.contacts.update(firstName, lastName, current_user).then(function(data) { winston.verbose("Chat21 contact updated: " + JSON.stringify(data)); chat21Event.emit('contact.update', data); }).catch(function(err) { winston.error("Error updating chat21 contact ", err); chat21Event.emit('contact.update.error', err); }); }); }); botEvent.on('faqbot.create', function(bot) { var firstName = bot.name; var lastName = ""; var email = ""; // botprefix var current_user = "bot_"+bot.id; setImmediate(() => { winston.debug("Chat21Handler on faqbot.create ", bot); chat21.auth.setAdminToken(adminToken); // create: function(firstname, lastname, email, current_user){ chat21.contacts.create(firstName, lastName, email, current_user).then(function(data) { winston.verbose("Chat21 contact created: " + JSON.stringify(data)); chat21Event.emit('contact.create', data); }).catch(function(err) { winston.error("Error creating chat21 contact ", err); chat21Event.emit('contact.create.error', err); }); }); }); botEvent.on('faqbot.update', function(bot) { var firstName = bot.name; var lastName = ""; // botprefix var current_user = "bot_"+bot.id; setImmediate(() => { winston.debug("Chat21Handler on faqbot.create ", bot); chat21.auth.setAdminToken(adminToken); // update: function(firstname, lastname, current_user){ chat21.contacts.update(firstName, lastName, current_user).then(function(data) { winston.verbose("Chat21 contact updated: " + JSON.stringify(data)); chat21Event.emit('contact.update', data); }).catch(function(err) { winston.error("Error updating chat21 contact ", err); chat21Event.emit('contact.update.error', err); }); }); }); // quando passa da lead temp a default aggiorna tutti va bene? leadEvent.on('lead.update', function(lead) { // non sembra funzionare chiedi a Dario dove prende le info setImmediate(() => { winston.debug("Chat21Handler on lead.update ", lead); // TODO AGGIORNA SOLO SE PASSA DA GUEST A ALTRO?? Request.find({lead: lead._id, id_project: lead.id_project}, function(err, requests) { if (err) { winston.error("Error getting request by lead", err); return 0; } if (!requests || (requests && requests.length==0)) { winston.verbose("No request found for lead id " +lead._id ); return 0; } chat21.auth.setAdminToken(adminToken); requests.forEach(function(request) { if (request.channelOutbound.name === ChannelConstants.CHAT21) { winston.verbose("Chat21Handler lead.update for request ", request); var groupName = lead.fullname; if (request.subject) { groupName=request.subject; } // update: function(name, owner, attributes, group_id){ chat21.groups.update(groupName, undefined, undefined, request.request_id).then(function(data) { winston.verbose("Chat21 group updated for lead.update: " + JSON.stringify(data)); chat21Event.emit('group.update', data); }).catch(function(err) { winston.error("Error updating chat21 group for lead.update", err); chat21Event.emit('group.update.error', err); }); // updateAttributes: function(attributes, group_id){ var gattributes = {userFullname:lead.fullname, userEmail: lead.email } // qui1 chat21.groups.updateAttributes(gattributes, request.request_id).then(function(data) { winston.verbose("Chat21 group gattributes for lead.update updated: " + JSON.stringify(data)); chat21Event.emit('group.update', data); chat21Event.emit('group.attributes.update', data); }).catch(function(err) { winston.error("Error updating chat21 gattributes for lead.update group ", err); chat21Event.emit('group.attributes.update.error', err); }); } }) }); }); }); messageEvent.on('message.test', function(message) { winston.info("Chat21Sender message.test"); chat21.auth.setAdminToken(adminToken); return chat21.messages.sendToGroup(message.senderFullname, message.recipient, message.recipient_fullname, message.text, message.sender, message.attributes, message.type, message.metadata, message.timestamp, message.group) .then(function(data){ winston.info("Chat21Sender sendToGroup test: "+ JSON.stringify(data)); }); }); // chat21Handler on worker is loaded with stadard events like request.create and NOT request.create.queue because it is used internally by the worker when the request is closed by ChatUnhandledRequestScheduler messageEvent.on('message.sending', function(message) { // setImmediate(() => { // TODO perche nn c'è setImmedite? per performace winston.verbose("Chat21Sender on message.sending: "+ message.text); winston.debug("Chat21Sender on message.sending ", message); if (message && message.status === MessageConstants.CHAT_MESSAGE_STATUS.SENDING && message.channel_type == MessageConstants.CHANNEL_TYPE.GROUP && message.request && message.request.channelOutbound.name == ChannelConstants.CHAT21) { //here only request.channelOutbound is important because chat21handler is for outgoing messages( from Tiledesk to agents clients) chat21.auth.setAdminToken(adminToken); //chat21.conversations.typing(message.recipient, message.sender, message.text, new Date()).finally(function() { return that.typing(message,new Date() ).then(function() { let attributes = message.attributes; if (!attributes) attributes = {}; attributes['tiledesk_message_id'] = message._id; attributes['projectId'] = message.id_project; //TODO not used. used by ionic to open request detail ??? if (message.channel && message.channel.name) { attributes['channel'] = message.channel.name; } winston.verbose("Chat21Sender sending message.sending: "+ message.text); winston.debug("Chat21Sender sending message.sending ", message); // chat21Util.getParsedMessage().then(function(messageData) { // message = messageData; // doent'work must merge older field with new message = chat21Util.parseReply(message.text); // sendToGroup: function(sender_fullname, recipient_id, recipient_fullname, text, sender_id, attributes, type, metadata, timestamp){ var timestamp = Date.now(); // var timestamp = undefined; if (message.attributes && message.attributes.clienttimestamp) { timestamp = message.attributes.clienttimestamp; } var recipient_fullname = "Guest"; // guest_here if (message.request && message.request.lead && message.request.lead.fullname) { recipient_fullname = message.request.lead.fullname; } if (message.request && message.request.subject ) { recipient_fullname = message.request.subject; } if (message.request && message.request.channel && message.request.channel.name ) { attributes['request_channel'] = message.request.channel.name; } /* const parsedReply = tiledeskUtil.parseReply(message.text); winston.info("Chat21 sendToGroup parsedMessage " + JSON.stringify(parsedReply)); // message = {...message, ...parsedReply.message }; // merge(message, parsedReply.message ); if (parsedReply.message.text) { message.text = parsedReply.message.text; } if (parsedReply.message.type) { message.type = parsedReply.message.type; } if (parsedReply.message.type) { message.metadata = parsedReply.message.metadata; } // var msg_attributes = {...message.attributes, ...parsedReply.message.attributes }; if (parsedReply.message && parsedReply.message.attributes) { for(const [key, value] of Object.entries(parsedReply.message.attributes)) { attributes[key] = value } } */ // performance console log // console.log("************* send message chat21: "+new Date().toISOString(), message.text ); return chat21.messages.sendToGroup(message.senderFullname, message.recipient, recipient_fullname, message.text, message.sender, attributes, message.type, message.metadata, timestamp) .then(function(data){ winston.verbose("Chat21Sender sendToGroup sent: "+ JSON.stringify(data) + " for text message " + message.text); // chat21.conversations.stopTyping(message.recipient,message.sender); // performance console log // console.log("************* senttt message chat21: "+new Date().toISOString(), message.text ); chat21Event.emit('message.sent', data); winston.debug("Message changeStatus 1"); messageService.changeStatus(message._id, MessageConstants.CHAT_MESSAGE_STATUS.DELIVERED) .then(function(upMessage){ winston.debug("Chat21 message sent ", upMessage.toObject()); }).catch(function(err) { winston.error("Error Chat21 message sent with id: "+message._id, err); }); }).catch(function(err) { winston.error("Chat21 sendToGroup err", err); chat21Event.emit('message.sent.error', err); }); }); // }); } else if (message && message.status === MessageConstants.CHAT_MESSAGE_STATUS.SENDING && message.channel_type == MessageConstants.CHANNEL_TYPE.DIRECT && message.channel.name == ChannelConstants.CHAT21) { // winston.warn("Chat21Sender this is a direct message. Unimplemented method", message); chat21.auth.setAdminToken(adminToken); winston.debug("Chat21Sender"); // send: function(sender_fullname, recipient_id, recipient_fullname, text, sender_id, attributes, type, metadata){ return chat21.messages.send(message.senderFullname, message.recipient, message.recipientFullname, message.text, message.sender, message.attributes, message.type, message.metadata) .then(function(data){ winston.verbose("Chat21Sender send sent: "+ JSON.stringify(data)); // chat21.conversations.stopTyping(message.recipient,message.sender); chat21Event.emit('message.sent', data); winston.debug("Message changeStatus 2"); messageService.changeStatus(message._id, MessageConstants.CHAT_MESSAGE_STATUS.DELIVERED) .then(function(upMessage){ winston.debug("Chat21 message sent ", upMessage.toObject()); }).catch(function(err) { winston.error("Error Chat21 message sent with id: "+message._id, err); }); }).catch(function(err) { winston.error("Chat21 send direct err", err); chat21Event.emit('message.sent.error', err); }); } else if (message && message.status === MessageConstants.CHAT_MESSAGE_STATUS.SENDING && message.channel_type == MessageConstants.CHANNEL_TYPE.GROUP && message.channel.name == ChannelConstants.CHAT21) { // winston.warn("Chat21Sender this is a group message. Unimplemented method", message); chat21.auth.setAdminToken(adminToken); var timestamp = Date.now(); // var timestamp = undefined; if (message.attributes && message.attributes.clienttimestamp) { timestamp = message.attributes.clienttimestamp; } return chat21.messages.sendToGroup(message.senderFullname, message.recipient, message.recipientFullname, message.text, message.sender, message.attributes, message.type, message.metadata, timestamp) .then(function(data){ winston.verbose("Chat21Sender send sent: "+ JSON.stringify(data)); // chat21.conversations.stopTyping(message.recipient,message.sender); chat21Event.emit('message.sent', data); winston.debug("Message changeStatus 3"); messageService.changeStatus(message._id, MessageConstants.CHAT_MESSAGE_STATUS.DELIVERED) .then(function(upMessage){ winston.debug("Chat21 message sent ", upMessage.toObject()); }).catch(function(err) { winston.error("Error Chat21 message sent with id: "+message._id, err); }); }).catch(function(err) { winston.error("Chat21 sendToGroup err", err); chat21Event.emit('message.sent.error', err); }); } else { winston.error("Chat21Sender this is not a group o direct message", message); return; } // }); }); requestEvent.on('request.attributes.update', function(request) { setImmediate(() => { if (request.channelOutbound.name === ChannelConstants.CHAT21) { chat21.auth.setAdminToken(adminToken); var gattributes = request.attributes; // qui1 chat21.groups.updateAttributes(gattributes, request.request_id).then(function(data) { winston.verbose("Chat21 group gattributes for request.attributes.update updated: " + JSON.stringify(data)); chat21Event.emit('group.update', data); chat21Event.emit('group.attributes.update', data); }).catch(function(err) { winston.error("Error updating chat21 gattributes for request.attributes.update group ", err); chat21Event.emit('group.attributes.update.error', err); }); } }); }); // not used now. Before used by ionic // requestEvent.on('request.update', function(request) { // setImmediate(() => { // if (request.channelOutbound.name === ChannelConstants.CHAT21) { // chat21.auth.setAdminToken(adminToken); // // https://stackoverflow.com/questions/42310950/handling-undefined-values-with-firebase/42315610 // // var requestWithoutUndefined = JSON.parse(JSON.stringify(request, function(k, v) { // // if (v === undefined) { return null; } return v; // // })); // // var gattributes = { "_request":requestWithoutUndefined}; // // qui1 // chat21.groups.updateAttributes(gattributes, request.request_id).then(function(data) { // winston.verbose("Chat21 group gattributes for request.update updated: " + JSON.stringify(data)); // chat21Event.emit('group.update', data); // chat21Event.emit('group.attributes.update', data); // }).catch(function(err) { // winston.error("Error updating chat21 gattributes for request.update group ", err); // chat21Event.emit('group.attributes.update.error', err); // }); // } // }); // }); // chat21Handler on worker is loaded with stadard events like request.create and NOT request.create.queue because it is used internally by the worker when the request is closed by ChatUnhandledRequestScheduler requestEvent.on('request.create', function(request) { winston.debug("chat21Handler requestEvent request.create called" , request); // setImmediate(() => { // perche nn c'è setImmedite? per performace if (request.channelOutbound.name === ChannelConstants.CHAT21) { chat21.auth.setAdminToken(adminToken); // let requestObj = request.toObject(); let requestObj = request.toJSON(); winston.verbose("creating chat21 group for request with id: " + requestObj._id); // winston.info("requestObj.participants: "+ Object.prototype.toString.call(requestObj.participants)); winston.debug("requestObj.participants: "+ JSON.stringify(requestObj.participants)); let members = requestObj.participants; // var members = reqParticipantArray; members.push("system"); if (request.lead) { // lead_id used. Change it? members.push(request.lead.lead_id); } // let membersArray = JSON.parse(JSON.stringify(members)); // winston.info("membersArray", membersArray); var gAttributes = requestObj.attributes || {}; // TODO ATTENTION change value by reference // var gAttributes = request.attributes || {}; //BUG LINK TO event emmiter obiect // problema requester_id gAttributes["requester_id"] = request.requester_id; gAttributes['projectId'] = request.id_project; //used by ionic to open request detail if (request.lead) { gAttributes['userFullname'] = request.lead.fullname; //used by ionic to open request detail gAttributes['userEmail'] = request.lead.email; //used by ionic to open request detail // TOOD is it necessary? // lead_id used. Change it? gAttributes['senderAuthInfo'] = {authType: "USER", authVar: {uid:request.lead.lead_id}}; //used by ionic otherwise ionic dont show userFullname in the participants panel } // TODO ionic dont show attributes panel if attributes.client is empty. bug? gAttributes['client'] = request.userAgent || 'n.d.'; //used by ionic to open request detail if (request.department) { gAttributes['departmentId'] = request.department._id; //used by ionic to open request detail gAttributes['departmentName'] = request.department.name; //used by ionic to open request detail } gAttributes['sourcePage'] = request.sourcePage; //used by ionic to open request detail // https://stackoverflow.com/questions/42310950/handling-undefined-values-with-firebase/42315610 // not used now. Before used by ionic // var requestWithoutUndefined = JSON.parse(JSON.stringify(request, function(k, v) { // if (v === undefined) { return null; } return v; // })); // gAttributes['_request'] = requestWithoutUndefined; //used by ionic to open request detail winston.debug("Chat21 group create gAttributes: ",gAttributes); var groupId = request.request_id; var group_name = "Guest"; // guest_here if (request.lead && request.lead.fullname) { group_name = request.lead.fullname; } if (request.subject) { group_name = request.subject; } // performance console log // console.log("************* before request.support_group.created: "+new Date().toISOString()); //TODO racecondition? return chat21.groups.create(group_name, members, gAttributes, groupId).then(function(data) { winston.verbose("Chat21 group created: " + JSON.stringify(data)); // performance console log // console.log("************* after request.support_group.created: "+new Date().toISOString()); requestEvent.emit('request.support_group.created', request); chat21Event.emit('group.create', data); }).catch(function(err) { winston.error("Error creating chat21 group ", err); requestEvent.emit('request.support_group.created.error', request); chat21Event.emit('group.create.error', err); }); } // }); }); // chat21Handler on worker is loaded with stadard events like request.create and NOT request.create.queue because it is used internally by the worker when the request is closed by ChatUnhandledRequestScheduler requestEvent.on('request.close', function(request) { //request.close event here noqueued winston.debug("request.close event here 8") winston.debug("chat21Handler requestEvent request.close called" , request); setImmediate(() => { if (request.channelOutbound.name === ChannelConstants.CHAT21) { chat21.auth.setAdminToken(adminToken); winston.debug("Chat21Sender archiving conversations for ",request.participants); //iterate request.participant and archive conversation request.participants.forEach(function(participant,index) { winston.debug("Chat21Sender archiving conversation: " + request.request_id + "for " + participant); chat21.conversations.archive(request.request_id, participant) .then(function(data){ winston.verbose("Chat21 conversation archived result "+ JSON.stringify(data)); chat21Event.emit('conversation.archived', data); }).catch(function(err) { winston.error("Chat21 archived err", err); chat21Event.emit('conversation.archived.error', err); }); }); // archive: function(recipient_id, user_id){ chat21.conversations.archive(request.request_id, "system") .then(function(data){ winston.verbose("Chat21 archived for system"+ JSON.stringify(data)); chat21Event.emit('conversation.archived', data); }).catch(function(err) { winston.error("Chat21 archived for system err", err); chat21Event.emit('conversation.archived.error', err); }); // request.lead can be undefined because some test case uses the old deprecated method requestService.createWithId. if (request.lead) { // lead_id used. Change it? chat21.conversations.archive(request.request_id, request.lead.lead_id) // chat21.conversations.archive(request.request_id, request.requester_id)<-desnt'archive .then(function(data){ winston.verbose("Chat21 archived for request.lead.lead_id"+ JSON.stringify(data)); chat21Event.emit('conversation.archived', data); }).catch(function(err) { winston.error("Chat21 archived for request.lead.lead_id err", err); chat21Event.emit('conversation.archived.error', err); }); } } }); }); requestEvent.on('request.delete', function(request) { winston.debug("chat21Handler requestEvent request.delete called" , request); setImmediate(() => { if (request.channelOutbound.name === ChannelConstants.CHAT21) { chat21.auth.setAdminToken(adminToken); winston.debug("Chat21Sender deleting conversations for ",request.participants); chat21.conversations.delete(request.request_id).then((data) => { winston.verbose("Chat21 conversation archived result "+ JSON.stringify(data)); chat21Event.emit('conversation.deleted', data); }).catch((err) => { winston.error("Chat21 deleted err", err); chat21Event.emit('conversation.deleted.error', err); }) } }) }); requestEvent.on('request.participants.update', function(data) { winston.debug("chat21Handler requestEvent request.participants.update called" , data); let request = data.request; let removedParticipants = data.removedParticipants; setImmediate(() => { if (request.channelOutbound.name === ChannelConstants.CHAT21) { chat21.auth.setAdminToken(adminToken); let requestObj = request.toJSON(); winston.verbose("setting chat21 group for request.participants.update for request with id: " + requestObj._id); var groupId = request.request_id; let members = []; members.push("system"); // qui errore participants sembra 0,1 object ??? request.participants.forEach(function(participant,index) { members.push(participant); }); // requestObj.participants; // var members = reqParticipantArray; if (request.lead) { // lead_id used. Change it? members.push(request.lead.lead_id); } winston.verbose("Chat21 group with members for request.participants.update: " , members); //setMembers: function(members, group_id){ //racecondition chat21.groups.setMembers(members, groupId).then(function(data) { winston.verbose("Chat21 group set for request.participants.update : " + JSON.stringify(data)); chat21Event.emit('group.setMembers', data); }).catch(function(err) { winston.error("Error setting chat21 group for request.participants.update ", err); chat21Event.emit('group.setMembers.error', err); }); // let oldParticipants = data.beforeRequest.participants; // winston.info("oldParticipants ", oldParticipants); // let newParticipants = data.request.participants; // winston.info("newParticipants ", newParticipants); // var removedParticipants = oldParticipants.filter(d => !newParticipants.includes(d)); // winston.info("removedParticipants ", removedParticipants); removedParticipants.forEach(function(removedParticipant) { winston.debug("removedParticipant ", removedParticipant); // archive: function(recipient_id, user_id){ //racecondition?low it's not dangerous archive a conversation that doen't exist chat21.conversations.archive(request.request_id, removedParticipant) .then(function(data){ winston.verbose("Chat21 archived "+ JSON.stringify(data)); chat21Event.emit('conversation.archived', data); }).catch(function(err) { winston.error("Chat21 archived err", err); chat21Event.emit('conversation.archived.error', err); }); }); } }); }); requestEvent.on('request.participants.join', function(data) { winston.debug("chat21Handler requestEvent request.participants.join called" , data); let request = data.request; let member = data.member; setImmediate(() => { if (request.channelOutbound.name === ChannelConstants.CHAT21) { chat21.auth.setAdminToken(adminToken); // let requestObj = request.toJSON(); var groupId = request.request_id; winston.verbose("joining member " + member +" for chat21 group with request : " + groupId); //racecondition? //join: function(member_id, group_id){ chat21.groups.join(member, groupId).then(function(data) { winston.verbose("Chat21 group joined: " + JSON.stringify(data)); chat21Event.emit('group.join', data); }).catch(function(err) { winston.error("Error joining chat21 group ", err); chat21Event.emit('group.join.error', err); }); } }); }); requestEvent.on('request.participants.leave', function(data) { winston.debug("chat21Handler requestEvent request.participants.leave called" , data); let request = data.request; let member = data.member; setImmediate(() => { if (request.channelOutbound.name === ChannelConstants.CHAT21) { chat21.auth.setAdminToken(adminToken); // let requestObj = request.toJSON(); var groupId = request.request_id; winston.verbose("leaving " + member +" for chat21 group for request with id: " + groupId); //racecondition? //leave: function(member_id, group_id){ chat21.groups.leave(member, groupId).then(function(data) { winston.verbose("Chat21 group leaved: " + JSON.stringify(data)); chat21Event.emit('group.leave', data); }).catch(function(err) { winston.error("Error leaving chat21 group ", err); chat21Event.emit('group.leave.error', err); }); // anche devi archiviare la conversazione per utente corrente //racecondition? chat21.conversations.archive(request.request_id, member) .then(function(data){ winston.verbose("Chat21 archived " + JSON.stringify(data)); chat21Event.emit('conversation.archived', data); }).catch(function(err) { winston.error("Chat21 archived err", err); chat21Event.emit('conversation.archived.error', err); }); } }); }) groupEvent.on('group.create', function(group) { if (process.env.SYNC_CHAT21_GROUPS !=="true") { winston.debug("Sync Tiledesk to Chat21 groups disabled"); return; } winston.verbose("Creating chat21 group", group); setImmediate(() => { chat21.auth.setAdminToken(adminToken); var groupMembers = group.members; winston.debug("groupMembers ", groupMembers); var group_id = "group-" + group._id; winston.debug("group_id :" + group_id); return chat21.groups.create(group.name, groupMembers, undefined, group_id).then(function(data) { winston.verbose("Chat21 group created: " + JSON.stringify(data)); // TODO ritorna success anche se // verbose: Chat21 group created: {"success":false,"err":{"message":"Channel closed","stack":"IllegalOperationError: Channel closed\n at ConfirmChannel.<anonymous> (/usr/src/app/node_modules/amqplib/lib/channel.js:160:11)\n at ConfirmChannel.Channel.publish (/usr/src/app/node_modules/amqplib/lib/callback_model.js:171:17)\n at ConfirmChannel.publish (/usr/src/app/node_modules/amqplib/lib/callback_model.js:301:36)\n at Chat21Api.publish (/usr/src/app/chat21Api/index.js:1028:29)\n at Chat21Api.sendMessageRaw (/usr/src/app/chat21Api/index.js:762:14)\n at Chat21Api.sendGroupWelcomeMessage (/usr/src/app/chat21Api/index.js:205:14)\n at /usr/src/app/chat21Api/index.js:99:22\n at /usr/src/app/chat21Api/index.js:234:17\n at /usr/src/app/chatdb/index.js:77:9\n at executeCallback (/usr/src/app/node_modules/mongodb/lib/operations/execute_operation.js:70:5)\n at updateCallback (/usr/src/app/node_modules/mongodb/lib/operations/update_one.js:41:3)\n at /usr/src/app/node_modules/mongodb/lib/operations/update_one.js:24:64\n at handleCallback (/usr/src/app/node_modules/mongodb/lib/utils.js:128:55)\n at /usr/src/app/node_modules/mongodb/lib/operations/common_functions.js:378:5\n at handler (/usr/src/app/node_modules/mongodb/lib/core/sdam/topology.js:913:24)","stackAtStateChange":"Stack capture: Socket error\n at Connection.C.onSocketError (/usr/src/app/node_modules/amqplib/lib/connection.js:354:13)\n at Connection.emit (events.js:314:20)\n at Socket.go (/usr/src/app/node_modules/amqplib/lib/connection.js:481:12)\n at Socket.emit (events.js:314:20)\n at emitReadable_ (_stream_readable.js:557:12)\n at processTicksAndRejections (internal/process/task_queues.js:83:21)"}} chat21Event.emit('group.create', data); }).catch(function(err) { winston.error("Error creating chat21 group ", err); chat21Event.emit('group.create.error', err); }); }); }); groupEvent.on('group.update', function(group) { if (process.env.SYNC_CHAT21_GROUPS !=="true") { winston.debug("Sync Tiledesk to Chat21 groups disabled"); return; } winston.verbose("Updating chat21 group", group); setImmediate(() => { chat21.auth.setAdminToken(adminToken); var groupMembers = group.members; winston.debug("groupMembers ", groupMembers); var group_id = "group-" + group._id; winston.debug("group_id :" + group_id); // update: function(name, owner, attributes, group_id){ return chat21.groups.update(group.name, undefined, undefined, group_id).then(function(data) { winston.verbose("Chat21 group.update updated: " + JSON.stringify(data)); chat21Event.emit('group.update', data); return chat21.groups.setMembers(groupMembers, group_id).then(function(data) { winston.verbose("Chat21 group.update set: " + JSON.stringify(data)); chat21Event.emit('group.setMembers', data); }).catch(function(err) { winston.error("Error setMembers chat21 group.update ", err); chat21Event.emit('group.setMembers.error', err); }); }).catch(function(err) { winston.error("Error setting chat21 group.update ", err); chat21Event.emit('group.update.error', err); }); }); }); groupEvent.on('group.delete', function(group) { if (process.env.SYNC_CHAT21_GROUPS !=="true") { winston.debug("Sync Tiledesk to Chat21 groups disabled"); return; } winston.verbose("Deleting chat21 group for group.delete", group); setImmediate(() => { chat21.auth.setAdminToken(adminToken); var group_id = "