import type { IMessage } from '@rocket.chat/core-typings'; import { isEditedMessage, isMessageFromVisitor } from '@rocket.chat/core-typings'; import moment from 'moment'; import { markRoomResponded } from '../../../../server/hooks/omnichannel/markRoomResponded'; import { callbacks } from '../../../../server/lib/callbacks'; import { settings } from '../../../../server/settings'; import { setPredictedVisitorAbandonmentTime } from '../../lib/omnichannel/Helper'; function shouldSaveInactivity(message: IMessage): boolean { if (message.t || isEditedMessage(message) || isMessageFromVisitor(message)) { return false; } const abandonedRoomsAction = settings.get('Livechat_abandoned_rooms_action'); const visitorInactivityTimeout = settings.get('Livechat_visitor_inactivity_timeout'); if (!abandonedRoomsAction || abandonedRoomsAction === 'none' || visitorInactivityTimeout <= 0) { return false; } return true; } callbacks.remove('afterOmnichannelSaveMessage', 'markRoomResponded'); callbacks.add( 'afterOmnichannelSaveMessage', async (message, { room, roomUpdater }) => { const responseBy = await markRoomResponded(message, room, roomUpdater); if (!shouldSaveInactivity(message)) { return message; } if (!responseBy) { return; } if (moment(responseBy.firstResponseTs).isSame(moment(message.ts))) { await setPredictedVisitorAbandonmentTime({ ...room, responseBy }, roomUpdater); } }, callbacks.priority.MEDIUM, 'save-visitor-inactivity', );