Send livechat webhooks

pull/3441/head
Diego Sampaio 9 years ago
parent a1680029ab
commit b32eb82e0a
  1. 9
      lib/ua-parser.min.js
  2. 2
      packages/rocketchat-lib/i18n/en.i18n.json
  3. 2
      packages/rocketchat-livechat/client/views/app/livechatIntegrations.html
  4. 0
      packages/rocketchat-livechat/lib/ua-parser.js
  5. 6
      packages/rocketchat-livechat/package.js
  6. 10
      packages/rocketchat-livechat/server/lib/Livechat.js
  7. 10
      packages/rocketchat-livechat/server/methods/sendOfflineMessage.js
  8. 14
      packages/rocketchat-livechat/server/methods/webhookTest.js
  9. 2
      packages/rocketchat-livechat/server/models/Rooms.js
  10. 122
      packages/rocketchat-livechat/server/setupWebhook.js

File diff suppressed because one or more lines are too long

@ -1055,7 +1055,7 @@
"Title_bar_color_offline" : "Title bar color offline",
"Title_offline" : "Title offline",
"To_install_RocketChat_Livechat_in_your_website_copy_paste_this_code_above_the_last_body_tag_on_your_site" : "To install Rocket.Chat Livechat in your website, copy &amp; paste this code above the last <strong>&lt;/body&gt;</strong> tag on your site.",
"to_see_more_detailed_how_to_integrate" : "to see more detailed how to integrate.",
"to_see_more_details_on_how_to_integrate" : "to see more details on how to integrate.",
"To_users" : "To Users",
"Topic" : "Topic",
"Travel_and_Places" : "Travel & Places",

@ -3,7 +3,7 @@
<h2>{{_ "Webhooks"}}</h2>
<p>
{{_ "You_can_use_webhooks_to_easily_integrate_livechat_with_your_CRM"}}
<a href="https://rocket.chat/docs/">{{_ "Click_here"}}</a> {{_ "to_see_more_detailed_how_to_integrate"}}
<a href="https://rocket.chat/docs/">{{_ "Click_here"}}</a> {{_ "to_see_more_details_on_how_to_integrate"}}
</p>
<form id="integration-form">

@ -22,11 +22,13 @@ Package.onUse(function(api) {
api.use('ecmascript');
api.use('rocketchat:lib');
api.use('rocketchat:authorization');
api.use('rocketchat:logger');
api.use('konecty:user-presence');
api.use('rocketchat:ui');
api.use('kadira:flow-router', 'client');
api.use('templating', 'client');
api.use('http');
api.use('check');
api.use('mongo');
api.use('ddp-rate-limiter');
api.use('rocketchat:sms');
@ -41,6 +43,9 @@ Package.onUse(function(api) {
api.addFiles('client/ui.js', 'client');
api.addFiles('client/route.js', 'client');
// generic libs
api.addFiles('lib/ua-parser.js');
// add stylesheets to theme compiler
api.addAssets('client/stylesheets/livechat.less', 'server');
api.addFiles('client/stylesheets/load.js', 'server');
@ -140,6 +145,7 @@ Package.onUse(function(api) {
api.addFiles('server/sendMessageBySMS.js', 'server');
api.addFiles('server/externalMessageHook.js', 'server');
api.addFiles('server/forwardUnclosedLivechats.js', 'server');
api.addFiles('server/setupWebhook.js', 'server');
// publications
api.addFiles('server/publications/customFields.js', 'server');

@ -1,4 +1,10 @@
RocketChat.Livechat = {
logger: new Logger('Livechat', {
sections: {
webhook: 'Webhook'
}
}),
getNextAgent(department) {
if (department) {
return RocketChat.models.LivechatDepartmentAgents.getNextAgentForDepartment(department);
@ -193,6 +199,10 @@ RocketChat.Livechat = {
RocketChat.models.Subscriptions.hideByRoomIdAndUserId(room._id, user._id);
Meteor.defer(() => {
RocketChat.callbacks.run('closeLivechat', room);
});
return true;
},

@ -1,6 +1,12 @@
/* globals DDPRateLimiter */
Meteor.methods({
'livechat:sendOfflineMessage'(data) {
check(data, {
name: String,
email: String,
message: String
});
const header = RocketChat.placeholders.replace(RocketChat.settings.get('Email_Header') || '');
const footer = RocketChat.placeholders.replace(RocketChat.settings.get('Email_Footer') || '');
@ -30,6 +36,10 @@ Meteor.methods({
});
});
Meteor.defer(() => {
RocketChat.callbacks.run('sendOfflineLivechatMessage', data);
});
return true;
}
});

@ -46,20 +46,20 @@ Meteor.methods({
customerId: '123456'
}
},
operator: {
agent: {
_id: 'asdf89as6df8',
username: 'operator.username',
name: 'Operator Name',
email: 'operator@email.com'
username: 'agent.username',
name: 'Agent Name',
email: 'agent@email.com'
},
messages: [{
username: 'visitor-username',
msg: 'message content',
ts: new Date()
}, {
username: 'operator.username',
operatorId: 'asdf89as6df8',
msg: 'message content from operator',
username: 'agent.username',
agentId: 'asdf89as6df8',
msg: 'message content from agent',
ts: new Date()
}]
}

@ -27,7 +27,7 @@ RocketChat.models.Rooms.updateLivechatDataByToken = function(token, key, value)
}
};
return this.upsert(query, update);
return this.update(query, update);
};
RocketChat.models.Rooms.findLivechat = function(offset = 0, limit = 20) {

@ -0,0 +1,122 @@
/* globals HTTP */
let sendOnCloseLivechat = false;
let sendOnOfflineMessage = false;
let webhookURL = '';
RocketChat.settings.get('Livechat_webhook_on_close', function(key, value) {
sendOnCloseLivechat = value;
});
RocketChat.settings.get('Livechat_webhook_on_offline_msg', function(key, value) {
sendOnOfflineMessage = value;
});
RocketChat.settings.get('Livechat_webhookUrl', function(key, value) {
webhookURL = value;
});
const sendRequest = (postData, trying = 1) => {
try {
HTTP.post(webhookURL, { data: postData });
} catch (e) {
RocketChat.Livechat.logger.webhook.error('Response error on ' + trying + ' try ->', e);
// try 10 times after 10 seconds each
if (trying < 10) {
RocketChat.Livechat.logger.webhook.info('Try again in 10 seconds.');
trying++;
setTimeout(Meteor.bindEnvironment(() => {
sendRequest(postData, trying);
}), 10000);
}
}
};
RocketChat.callbacks.add('closeLivechat', (room) => {
if (!sendOnCloseLivechat) {
return room;
}
const visitor = RocketChat.models.Users.findOneById(room.v._id);
const agent = RocketChat.models.Users.findOneById(room.servedBy._id);
const ua = new UAParser();
ua.setUA(visitor.userAgent);
let postData = {
type: 'LivechatSession',
_id: room._id,
label: room.label,
topic: room.topic,
code: room.code,
createdAt: room.ts,
lastMessageAt: room.lm,
tags: room.tags,
customFields: room.livechatData,
visitor: {
_id: visitor._id,
name: visitor.name,
username: visitor.username,
email: null,
phone: null,
department: visitor.department,
ip: visitor.ip,
os: ua.getOS().name && (ua.getOS().name + ' ' + ua.getOS().version),
browser: ua.getBrowser().name && (ua.getBrowser().name + ' ' + ua.getBrowser().version),
customFields: visitor.livechatData
},
agent: {
_id: agent._id,
username: agent.username,
name: agent.name,
email: null
},
messages: []
};
if (visitor.emails && visitor.emails.length > 0) {
postData.visitor.email = visitor.emails[0].address;
}
if (visitor.phone && visitor.phone.length > 0) {
postData.visitor.phone = visitor.phone[0].phoneNumber;
}
if (agent.emails && agent.emails.length > 0) {
postData.agent.email = agent.emails[0].address;
}
RocketChat.models.Messages.findVisibleByRoomId(room._id, { sort: { ts: 1 } }).forEach((message) => {
if (message.t) {
return;
}
let msg = {
username: message.u.username,
msg: message.msg,
ts: message.ts
};
if (message.u.username !== visitor.username) {
msg.agentId = message.u._id;
}
postData.messages.push(msg);
});
sendRequest(postData);
});
RocketChat.callbacks.add('sendOfflineLivechatMessage', (data) => {
if (!sendOnOfflineMessage) {
return data;
}
let postData = {
type: 'LivechatOfflineMessage',
sentAt: new Date(),
visitor: {
name: data.name,
email: data.email
},
message: data.message
};
sendRequest(postData);
});
Loading…
Cancel
Save