|
|
|
@ -9,6 +9,7 @@ import { LivechatRooms, LivechatVisitors, Messages } from '../../../app/models/s |
|
|
|
|
import { FileUpload } from '../../../app/file-upload/server'; |
|
|
|
|
import { QueueManager } from '../../../app/livechat/server/lib/QueueManager'; |
|
|
|
|
import { settings } from '../../../app/settings/server'; |
|
|
|
|
import { logger } from './logger'; |
|
|
|
|
import { OmnichannelSourceType } from '../../../definition/IRoom'; |
|
|
|
|
|
|
|
|
|
type FileAttachment = { |
|
|
|
@ -30,12 +31,20 @@ const language = settings.get('Language') || 'en'; |
|
|
|
|
const t = (s: string): string => TAPi18n.__(s, { lng: language }); |
|
|
|
|
|
|
|
|
|
function getGuestByEmail(email: string, name: string, department?: string): any { |
|
|
|
|
logger.debug(`Attempt to register a guest for ${ email } on department: ${ department }`); |
|
|
|
|
const guest = LivechatVisitors.findOneGuestByEmailAddress(email); |
|
|
|
|
|
|
|
|
|
if (guest) { |
|
|
|
|
logger.debug(`Guest with email ${ email } found with id ${ guest._id }`); |
|
|
|
|
if (guest.department !== department) { |
|
|
|
|
logger.debug(`Switching departments for guest ${ guest._id }. Previous: ${ guest.department } New: ${ department }`); |
|
|
|
|
Livechat.setDepartmentForGuest({ token: guest.token, department }); |
|
|
|
|
return LivechatVisitors.findOneById(guest._id, {}); |
|
|
|
|
} |
|
|
|
|
return guest; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
logger.debug(`Creating a new Omnichannel guest for visitor with email ${ email }`); |
|
|
|
|
const userId = Livechat.registerGuest({ |
|
|
|
|
token: Random.id(), |
|
|
|
|
name: name || email, |
|
|
|
@ -48,6 +57,7 @@ function getGuestByEmail(email: string, name: string, department?: string): any |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
const newGuest = LivechatVisitors.findOneById(userId, {}); |
|
|
|
|
logger.debug(`Guest ${ userId } for visitor ${ email } created`); |
|
|
|
|
if (newGuest) { |
|
|
|
|
return newGuest; |
|
|
|
|
} |
|
|
|
@ -103,6 +113,7 @@ async function uploadAttachment(attachment: Attachment, rid: string, visitorToke |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export async function onEmailReceived(email: ParsedMail, inbox: string, department?: string): Promise<void> { |
|
|
|
|
logger.debug(`New email conversation received on inbox ${ inbox }. Will be assigned to department ${ department }`); |
|
|
|
|
if (!email.from?.value?.[0]?.address) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
@ -111,10 +122,14 @@ export async function onEmailReceived(email: ParsedMail, inbox: string, departme |
|
|
|
|
|
|
|
|
|
const thread = references?.[0] ?? email.messageId; |
|
|
|
|
|
|
|
|
|
logger.debug(`Fetching guest for visitor ${ email.from.value[0].address }`); |
|
|
|
|
const guest = getGuestByEmail(email.from.value[0].address, email.from.value[0].name, department); |
|
|
|
|
|
|
|
|
|
let room = LivechatRooms.findOneByVisitorTokenAndEmailThread(guest.token, thread, {}); |
|
|
|
|
logger.debug(`Guest ${ guest._id } obtained. Attempting to find or create a room on department ${ department }`); |
|
|
|
|
let room = LivechatRooms.findOneByVisitorTokenAndEmailThreadAndDepartment(guest.token, thread, department, {}); |
|
|
|
|
logger.debug(`Room ${ room?._id } found for guest ${ guest._id }`); |
|
|
|
|
if (room?.closedAt) { |
|
|
|
|
logger.debug(`Room ${ room?._id } is closed. Reopening`); |
|
|
|
|
room = await QueueManager.unarchiveRoom(room); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -128,6 +143,7 @@ export async function onEmailReceived(email: ParsedMail, inbox: string, departme |
|
|
|
|
const rid = room?._id ?? Random.id(); |
|
|
|
|
const msgId = Random.id(); |
|
|
|
|
|
|
|
|
|
logger.debug(`Sending email message to room ${ rid } for visitor ${ guest._id }. Conversation assigned to department ${ department }`); |
|
|
|
|
Livechat.sendMessage({ |
|
|
|
|
guest, |
|
|
|
|
message: { |
|
|
|
@ -205,6 +221,7 @@ export async function onEmailReceived(email: ParsedMail, inbox: string, departme |
|
|
|
|
}, |
|
|
|
|
}); |
|
|
|
|
}).catch((error) => { |
|
|
|
|
Livechat.logger.log('Error receiving Email: %s', error.message); |
|
|
|
|
console.log(error); |
|
|
|
|
Livechat.logger.error('Error receiving Email: %s', error.message); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|