The communications platform that puts data protection first.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
Rocket.Chat/app/livechat/server/hooks/saveAnalyticsData.js

67 lines
2.4 KiB

import { callbacks } from '../../../callbacks';
import { LivechatRooms } from '../../../models';
import { normalizeMessageAttachments } from '../../../utils/server/functions/normalizeMessageAttachments';
callbacks.add('afterSaveMessage', function(message, room) {
// skips this callback if the message was edited
if (!message || message.editedAt) {
return message;
}
// check if room is livechat
if (room.t !== 'l') {
return message;
}
if (message.file) {
message = normalizeMessageAttachments(message);
}
const now = new Date();
let analyticsData;
// if the message has a token, it was sent by the visitor
if (!message.token) {
const visitorLastQuery = room.metrics && room.metrics.v ? room.metrics.v.lq : room.ts;
const agentLastReply = room.metrics && room.metrics.servedBy ? room.metrics.servedBy.lr : room.ts;
const agentJoinTime = room.servedBy && room.servedBy.ts ? room.servedBy.ts : room.ts;
const isResponseTt = room.metrics && room.metrics.response && room.metrics.response.tt;
const isResponseTotal = room.metrics && room.metrics.response && room.metrics.response.total;
if (agentLastReply === room.ts) { // first response
const firstResponseDate = now;
const firstResponseTime = (now.getTime() - visitorLastQuery) / 1000;
const responseTime = (now.getTime() - visitorLastQuery) / 1000;
const avgResponseTime = ((isResponseTt ? room.metrics.response.tt : 0) + responseTime) / ((isResponseTotal ? room.metrics.response.total : 0) + 1);
const firstReactionDate = now;
const firstReactionTime = (now.getTime() - agentJoinTime) / 1000;
const reactionTime = (now.getTime() - agentJoinTime) / 1000;
analyticsData = {
firstResponseDate,
firstResponseTime,
responseTime,
avgResponseTime,
firstReactionDate,
firstReactionTime,
reactionTime,
};
} else if (visitorLastQuery > agentLastReply) { // response, not first
const responseTime = (now.getTime() - visitorLastQuery) / 1000;
const avgResponseTime = ((isResponseTt ? room.metrics.response.tt : 0) + responseTime) / ((isResponseTotal ? room.metrics.response.total : 0) + 1);
const reactionTime = (now.getTime() - visitorLastQuery) / 1000;
analyticsData = {
responseTime,
avgResponseTime,
reactionTime,
};
} // ignore, its continuing response
}
LivechatRooms.saveAnalyticsDataByRoomId(room, message, analyticsData);
return message;
}, callbacks.priority.LOW, 'saveAnalyticsData');