From f81ecde3c5a8e9831a8b78833a59bb737ea4d5dd Mon Sep 17 00:00:00 2001 From: AlexanderKanakis Date: Thu, 17 Jun 2021 17:26:11 +0300 Subject: [PATCH 1/4] 1st Stage of whatsapp integration. Image/Link cards, guest number storing, delayed events, session timeout, language change --- lib/Dialogflow.ts | 1 - lib/IdleSessionTimeoutProcessor.ts | 29 ++++++----------------------- lib/Room.ts | 12 ++++++++---- lib/Timeout.ts | 14 +++++++++----- lib/payloadAction.ts | 11 +---------- 5 files changed, 24 insertions(+), 43 deletions(-) diff --git a/lib/Dialogflow.ts b/lib/Dialogflow.ts index 7f0d157..1a41871 100644 --- a/lib/Dialogflow.ts +++ b/lib/Dialogflow.ts @@ -191,7 +191,6 @@ class DialogflowClass { } public async parseCXRequest(read: IRead, response: any): Promise { - console.log(response); if (!response) { throw new Error(Logs.INVALID_RESPONSE_FROM_DIALOGFLOW_CONTENT_UNDEFINED); } const { session, queryResult } = response; diff --git a/lib/IdleSessionTimeoutProcessor.ts b/lib/IdleSessionTimeoutProcessor.ts index 0038a49..83a28f0 100644 --- a/lib/IdleSessionTimeoutProcessor.ts +++ b/lib/IdleSessionTimeoutProcessor.ts @@ -1,11 +1,7 @@ import { IHttp, IModify, IPersistence, IRead } from '@rocket.chat/apps-engine/definition/accessors'; -import { ILivechatRoom } from '@rocket.chat/apps-engine/definition/livechat/ILivechatRoom'; +import { RocketChatAssociationModel, RocketChatAssociationRecord } from '@rocket.chat/apps-engine/definition/metadata'; import { IJobContext, IProcessor } from '@rocket.chat/apps-engine/definition/scheduler'; -import { DialogflowRequestType, IDialogflowMessage } from '../enum/Dialogflow'; -import { removeBotTypingListener } from './BotTyping'; -import { Dialogflow } from './Dialogflow'; -import { createDialogflowMessage } from './Message'; -import { handlePayloadActions } from './payloadAction'; +import { closeChat } from './Room'; import { resetFallbackIntent } from './SynchronousHandover'; export class IdleSessionTimeoutProcessor implements IProcessor { @@ -17,25 +13,12 @@ export class IdleSessionTimeoutProcessor implements IProcessor { public async processor(jobContext: IJobContext, read: IRead, modify: IModify, http: IHttp, persis: IPersistence): Promise { - const event = { name: 'Close_Session', languageCode: 'en', parameters: {} }; - const response: IDialogflowMessage = await Dialogflow.sendRequest(http, - read, - modify, - persis, - jobContext.rid, - event, - DialogflowRequestType.EVENT); + const assoc = new RocketChatAssociationRecord(RocketChatAssociationModel.MISC, `SFLAIA-${jobContext.rid}`); - const createResponseMessage = async () => await createDialogflowMessage(jobContext.rid, read, modify, response); + await modify.getScheduler().cancelJob('idle-session-timeout'); + await persis.updateByAssociation(assoc, { idleSessionScheduleStarted: false }); - await createResponseMessage(); - - await removeBotTypingListener(jobContext.rid); - - const room = await read.getRoomReader().getById(jobContext.rid); - const { visitor: { token: visitorToken } } = room as ILivechatRoom; - - handlePayloadActions(read, modify, http, persis, jobContext.rid, visitorToken, response); + await closeChat(modify, read, jobContext.rid, persis); return resetFallbackIntent(read, modify, jobContext.rid); } diff --git a/lib/Room.ts b/lib/Room.ts index 8a1bd72..aa1255e 100644 --- a/lib/Room.ts +++ b/lib/Room.ts @@ -1,4 +1,4 @@ -import { IModify, IRead } from '@rocket.chat/apps-engine/definition/accessors'; +import { IModify, IPersistence, IRead } from '@rocket.chat/apps-engine/definition/accessors'; import { IDepartment, ILivechatRoom, ILivechatTransferData, IVisitor } from '@rocket.chat/apps-engine/definition/livechat'; import { IRoom } from '@rocket.chat/apps-engine/definition/rooms'; import { AppSetting, DefaultMessage } from '../config/Settings'; @@ -7,6 +7,7 @@ import { removeBotTypingListener } from '../lib//BotTyping'; import { getAppSettingValue } from '../lib/Settings'; import { createMessage } from './Message'; import { SessionMaintenanceOnceSchedule } from './sessionMaintenance/SessionMaintenanceOnceSchedule'; +import { updateIdleSessionScheduleStatus } from './Timeout'; export const updateRoomCustomFields = async (rid: string, data: any, read: IRead, modify: IModify): Promise => { if (!rid) { @@ -33,10 +34,13 @@ export const updateRoomCustomFields = async (rid: string, data: any, read: IRead } }; -export const closeChat = async (modify: IModify, read: IRead, rid: string) => { - await modify.getScheduler().cancelJobByDataQuery({ sessionId: rid }); +export const closeChat = async (modify: IModify, read: IRead, rid: string, persistence?: IPersistence) => { const room: IRoom = (await read.getRoomReader().getById(rid)) as IRoom; - if (!room) { throw new Error(Logs.INVALID_ROOM_ID); } + if (!room || !persistence) { throw new Error(Logs.INVALID_ROOM_ID); } + + if (updateIdleSessionScheduleStatus(read, modify, persistence, rid)) { + await modify.getScheduler().cancelJob('idle-session-timeout'); + } await removeBotTypingListener(rid); diff --git a/lib/Timeout.ts b/lib/Timeout.ts index a751380..f5ea020 100644 --- a/lib/Timeout.ts +++ b/lib/Timeout.ts @@ -83,8 +83,14 @@ export const handleTimeout = async (app: IApp, message: IMessage, read: IRead, h async function scheduleTimeOut(message: IMessage, read: IRead, modify: IModify, persistence: IPersistence) { const idleTimeoutTimeoutTime: string = await getAppSettingValue(read, AppSetting.DialogflowCustomerTimeoutTime); const rid = message.room.id; + const assoc = new RocketChatAssociationRecord(RocketChatAssociationModel.MISC, `SFLAIA-${rid}`); - updateIdleSessionScheduleStatus(read, modify, persistence, rid); + if (updateIdleSessionScheduleStatus(read, modify, persistence, rid)) { + await modify.getScheduler().cancelJob('idle-session-timeout'); + } else { + await persistence.createWithAssociation({ idleSessionScheduleStarted: true }, assoc); + + } const task = { id: 'idle-session-timeout', @@ -99,10 +105,8 @@ export const updateIdleSessionScheduleStatus = async (read: IRead, modify: IModi const data = await retrieveDataByAssociation(read, assoc); if (data && data.idleSessionScheduleStarted) { - await persistence.updateByAssociation(assoc, { idleSessionScheduleStarted: true }); - await modify.getScheduler().cancelJob('idle-session-timeout'); + return true; - } else { - await persistence.createWithAssociation({ idleSessionScheduleStarted: true }, assoc); } + return false; }; diff --git a/lib/payloadAction.ts b/lib/payloadAction.ts index fde7639..f052f08 100644 --- a/lib/payloadAction.ts +++ b/lib/payloadAction.ts @@ -1,9 +1,8 @@ import { IHttp, IModify, IPersistence, IRead } from '@rocket.chat/apps-engine/definition/accessors'; -import { RocketChatAssociationModel, RocketChatAssociationRecord } from '@rocket.chat/apps-engine/definition/metadata'; import { AppSetting, DefaultMessage } from '../config/Settings'; import { ActionIds } from '../enum/ActionIds'; import { DialogflowRequestType, IDialogflowAction, IDialogflowMessage, IDialogflowPayload} from '../enum/Dialogflow'; -import { closeChat, performHandover, updateRoomCustomFields } from '../lib/Room'; +import { performHandover, updateRoomCustomFields } from '../lib/Room'; import { getAppSettingValue } from '../lib/Settings'; import { Dialogflow } from './Dialogflow'; import { createMessage } from './Message'; @@ -34,14 +33,6 @@ export const handlePayloadActions = async (read: IRead, modify: IModify, http: } } await performHandover(modify, read, rid, visitorToken, targetDepartment); - } else if (actionName === ActionIds.CLOSE_CHAT) { - - await updateIdleSessionScheduleStatus(read, modify, persistence, rid); - - const assoc = new RocketChatAssociationRecord(RocketChatAssociationModel.MISC, `SFLAIA-${rid}`); - await persistence.updateByAssociation(assoc, { idleSessionScheduleStarted: false }); - - await closeChat(modify, read, rid); } else if (actionName === ActionIds.SET_TIMEOUT) { const event = { name: params.eventName, languageCode: 'en', parameters: {} }; From 53a05913bd072a88f118888c058e4fe43ceb7e6c Mon Sep 17 00:00:00 2001 From: AlexanderKanakis Date: Tue, 22 Jun 2021 17:36:25 +0300 Subject: [PATCH 2/4] Added handler for close_chat custom payload --- endpoints/IncomingEndpoint.ts | 2 +- handler/ExecuteLivechatBlockActionHandler.ts | 2 +- handler/OnAgentUnassignedHandler.ts | 4 +- handler/PostMessageSentHandler.ts | 2 +- lib/IdleSessionTimeoutProcessor.ts | 5 - lib/Room.ts | 8 +- lib/Timeout.ts | 184 +++++++++---------- lib/payloadAction.ts | 4 +- 8 files changed, 105 insertions(+), 106 deletions(-) diff --git a/endpoints/IncomingEndpoint.ts b/endpoints/IncomingEndpoint.ts index b14efb3..b2081aa 100644 --- a/endpoints/IncomingEndpoint.ts +++ b/endpoints/IncomingEndpoint.ts @@ -37,7 +37,7 @@ export class IncomingEndpoint extends ApiEndpoint { if (!sessionId) { throw new Error(Logs.INVALID_SESSION_ID); } switch (action) { case EndpointActionNames.CLOSE_CHAT: - await closeChat(modify, read, sessionId); + await closeChat(modify, read, sessionId, persistence); break; case EndpointActionNames.HANDOVER: const { actionData: { targetDepartment = '' } = {} } = endpointContent; diff --git a/handler/ExecuteLivechatBlockActionHandler.ts b/handler/ExecuteLivechatBlockActionHandler.ts index 174c014..89f43a9 100644 --- a/handler/ExecuteLivechatBlockActionHandler.ts +++ b/handler/ExecuteLivechatBlockActionHandler.ts @@ -47,7 +47,7 @@ export class ExecuteLivechatBlockActionHandler { break; case ActionIds.CLOSE_CHAT: - await closeChat(this.modify, this.read, rid); + await closeChat(this.modify, this.read, rid, this.persistence); break; default: diff --git a/handler/OnAgentUnassignedHandler.ts b/handler/OnAgentUnassignedHandler.ts index a37b115..cce6609 100644 --- a/handler/OnAgentUnassignedHandler.ts +++ b/handler/OnAgentUnassignedHandler.ts @@ -1,12 +1,12 @@ import { IHttp, IModify, IPersistence, IRead } from '@rocket.chat/apps-engine/definition/accessors'; import { IApp } from '@rocket.chat/apps-engine/definition/IApp'; import { ILivechatEventContext, ILivechatRoom } from '@rocket.chat/apps-engine/definition/livechat'; +import { IRoom } from '@rocket.chat/apps-engine/definition/rooms'; import { AppSetting, DefaultMessage } from '../config/Settings'; +import { Logs } from '../enum/Logs'; import { removeBotTypingListener } from '../lib//BotTyping'; import { createMessage, sendCloseChatButton } from '../lib/Message'; import { getAppSettingValue } from '../lib/Settings'; -import { Logs } from '../enum/Logs'; -import { IRoom } from '@rocket.chat/apps-engine/definition/rooms'; export class OnAgentUnassignedHandler { constructor(private readonly app: IApp, diff --git a/handler/PostMessageSentHandler.ts b/handler/PostMessageSentHandler.ts index 07e252f..bf56d95 100644 --- a/handler/PostMessageSentHandler.ts +++ b/handler/PostMessageSentHandler.ts @@ -45,7 +45,7 @@ export class PostMessageSentHandler { return; } await this.handleClosedByVisitor(rid); - await closeChat(this.modify, this.read, rid); + await closeChat(this.modify, this.read, rid, this.persistence); return; } diff --git a/lib/IdleSessionTimeoutProcessor.ts b/lib/IdleSessionTimeoutProcessor.ts index 83a28f0..1a757f2 100644 --- a/lib/IdleSessionTimeoutProcessor.ts +++ b/lib/IdleSessionTimeoutProcessor.ts @@ -13,11 +13,6 @@ export class IdleSessionTimeoutProcessor implements IProcessor { public async processor(jobContext: IJobContext, read: IRead, modify: IModify, http: IHttp, persis: IPersistence): Promise { - const assoc = new RocketChatAssociationRecord(RocketChatAssociationModel.MISC, `SFLAIA-${jobContext.rid}`); - - await modify.getScheduler().cancelJob('idle-session-timeout'); - await persis.updateByAssociation(assoc, { idleSessionScheduleStarted: false }); - await closeChat(modify, read, jobContext.rid, persis); return resetFallbackIntent(read, modify, jobContext.rid); diff --git a/lib/Room.ts b/lib/Room.ts index aa1255e..6252882 100644 --- a/lib/Room.ts +++ b/lib/Room.ts @@ -1,5 +1,6 @@ import { IModify, IPersistence, IRead } from '@rocket.chat/apps-engine/definition/accessors'; import { IDepartment, ILivechatRoom, ILivechatTransferData, IVisitor } from '@rocket.chat/apps-engine/definition/livechat'; +import { RocketChatAssociationModel, RocketChatAssociationRecord } from '@rocket.chat/apps-engine/definition/metadata'; import { IRoom } from '@rocket.chat/apps-engine/definition/rooms'; import { AppSetting, DefaultMessage } from '../config/Settings'; import { Logs } from '../enum/Logs'; @@ -36,9 +37,12 @@ export const updateRoomCustomFields = async (rid: string, data: any, read: IRead export const closeChat = async (modify: IModify, read: IRead, rid: string, persistence?: IPersistence) => { const room: IRoom = (await read.getRoomReader().getById(rid)) as IRoom; - if (!room || !persistence) { throw new Error(Logs.INVALID_ROOM_ID); } + if (!room) { throw new Error(Logs.INVALID_ROOM_ID); } + + if (persistence && updateIdleSessionScheduleStatus(read, modify, persistence, rid)) { + const assoc = new RocketChatAssociationRecord(RocketChatAssociationModel.MISC, `SFLAIA-${rid}`); - if (updateIdleSessionScheduleStatus(read, modify, persistence, rid)) { + await persistence.updateByAssociation(assoc, { idleSessionScheduleStarted: false }); await modify.getScheduler().cancelJob('idle-session-timeout'); } diff --git a/lib/Timeout.ts b/lib/Timeout.ts index f5ea020..5b69cef 100644 --- a/lib/Timeout.ts +++ b/lib/Timeout.ts @@ -9,104 +9,102 @@ import { retrieveDataByAssociation } from './retrieveDataByAssociation'; export const handleTimeout = async (app: IApp, message: IMessage, read: IRead, http: IHttp, persistence: IPersistence, modify: IModify ) => { - if (message.room.type !== RoomType.LIVE_CHAT || (message.customFields && message.customFields.idleTimeoutConfig)) { - return; - } - - const dialogflowBotUsername: string = (await getAppSettingValue(read, AppSetting.DialogflowBotUsername)); - const chasitorIdleTimeoutIsEnabled: string = (await getAppSettingValue(read, AppSetting.DialogflowEnableCustomerTimeout)); - - if (chasitorIdleTimeoutIsEnabled) { - - /** - * Sets the amount of time that a customer has to respond to an agent message before a warning appears and a timer begins a countdown. - * The warning disappears (and the timer stops) each time the customer sends a message. - * The warning disappears (and the timer resets to 0) each time the agent sends message. - * The warning value must be shorter than the time-out value (we recommend at least 30 seconds). - */ - const warningTime: string = (await getAppSettingValue(read, AppSetting.DialogflowCustomerTimeoutWarningTime)); - - /** - * Sets the amount of time that a customer has to respond to an agent message before the session ends. - * The timer stops when the customer sends a message and starts again from 0 on the next agent's message. - */ - const timeoutTime: string = (await getAppSettingValue(read, AppSetting.DialogflowCustomerTimeoutTime)); - - // ------ When agent sends message ----- - // Send new timeout msg and reset previous timeout - - // ------ When customer sends message ----- - // Send timeout msg to cancel previous timeout - - // On Timeout : Close chat - // On Warning : Show Countdown Popup in Livechat Widget - - const timeoutWarningMessage: string = (await getAppSettingValue(read, AppSetting.DialogflowCustomerTimeoutWarningMessage)); - - if (message.sender.username === dialogflowBotUsername) { - // Agent sent message - if (!message.id) { - return; - } - const user = await read.getUserReader().getByUsername(dialogflowBotUsername); - const msgExtender = modify.getExtender().extendMessage(message.id, user); - (await msgExtender).addCustomField('idleTimeoutConfig', { - idleTimeoutAction: 'start', - idleTimeoutWarningTime: warningTime, - idleTimeoutTimeoutTime: timeoutTime, - idleTimeoutMessage: timeoutWarningMessage, - }); - modify.getExtender().finish(await msgExtender); - } else { - - // Guest sent message - - if (!message.id) { - return; - } - const user = await read.getUserReader().getByUsername(dialogflowBotUsername); - const msgExtender = modify.getExtender().extendMessage(message.id, user); - (await msgExtender).addCustomField('idleTimeoutConfig', { - idleTimeoutAction: 'stop', - idleTimeoutWarningTime: warningTime, - idleTimeoutTimeoutTime: timeoutTime, - idleTimeoutMessage: timeoutWarningMessage, - }); - modify.getExtender().finish(await msgExtender); - - await scheduleTimeOut(message, read, modify, persistence); - - } - } + if (message.room.type !== RoomType.LIVE_CHAT || (message.customFields && message.customFields.idleTimeoutConfig)) { + return; + } + + const dialogflowBotUsername: string = (await getAppSettingValue(read, AppSetting.DialogflowBotUsername)); + const chasitorIdleTimeoutIsEnabled: string = (await getAppSettingValue(read, AppSetting.DialogflowEnableCustomerTimeout)); + + if (chasitorIdleTimeoutIsEnabled) { + + /** + * Sets the amount of time that a customer has to respond to an agent message before a warning appears and a timer begins a countdown. + * The warning disappears (and the timer stops) each time the customer sends a message. + * The warning disappears (and the timer resets to 0) each time the agent sends message. + * The warning value must be shorter than the time-out value (we recommend at least 30 seconds). + */ + const warningTime: string = (await getAppSettingValue(read, AppSetting.DialogflowCustomerTimeoutWarningTime)); + + /** + * Sets the amount of time that a customer has to respond to an agent message before the session ends. + * The timer stops when the customer sends a message and starts again from 0 on the next agent's message. + */ + const timeoutTime: string = (await getAppSettingValue(read, AppSetting.DialogflowCustomerTimeoutTime)); + + // ------ When agent sends message ----- + // Send new timeout msg and reset previous timeout + + // ------ When customer sends message ----- + // Send timeout msg to cancel previous timeout + + // On Timeout : Close chat + // On Warning : Show Countdown Popup in Livechat Widget + + const timeoutWarningMessage: string = (await getAppSettingValue(read, AppSetting.DialogflowCustomerTimeoutWarningMessage)); + + if (message.sender.username === dialogflowBotUsername) { + // Agent sent message + if (!message.id) { + return; + } + const user = await read.getUserReader().getByUsername(dialogflowBotUsername); + const msgExtender = modify.getExtender().extendMessage(message.id, user); + (await msgExtender).addCustomField('idleTimeoutConfig', { + idleTimeoutAction: 'start', + idleTimeoutWarningTime: warningTime, + idleTimeoutTimeoutTime: timeoutTime, + idleTimeoutMessage: timeoutWarningMessage, + }); + modify.getExtender().finish(await msgExtender); + } else { + + // Guest sent message + + if (!message.id) { + return; + } + const user = await read.getUserReader().getByUsername(dialogflowBotUsername); + const msgExtender = modify.getExtender().extendMessage(message.id, user); + (await msgExtender).addCustomField('idleTimeoutConfig', { + idleTimeoutAction: 'stop', + idleTimeoutWarningTime: warningTime, + idleTimeoutTimeoutTime: timeoutTime, + idleTimeoutMessage: timeoutWarningMessage, + }); + modify.getExtender().finish(await msgExtender); + + console.log('schedule timeout'); + + await scheduleTimeOut(message, read, modify, persistence); + + } + } }; async function scheduleTimeOut(message: IMessage, read: IRead, modify: IModify, persistence: IPersistence) { - const idleTimeoutTimeoutTime: string = await getAppSettingValue(read, AppSetting.DialogflowCustomerTimeoutTime); - const rid = message.room.id; - const assoc = new RocketChatAssociationRecord(RocketChatAssociationModel.MISC, `SFLAIA-${rid}`); - - if (updateIdleSessionScheduleStatus(read, modify, persistence, rid)) { - await modify.getScheduler().cancelJob('idle-session-timeout'); - } else { - await persistence.createWithAssociation({ idleSessionScheduleStarted: true }, assoc); - - } - - const task = { - id: 'idle-session-timeout', - when: `${idleTimeoutTimeoutTime} seconds`, - data: {rid}, - }; - await modify.getScheduler().scheduleOnce(task); + const idleTimeoutTimeoutTime: string = await getAppSettingValue(read, AppSetting.DialogflowCustomerTimeoutTime); + const rid = message.room.id; + const assoc = new RocketChatAssociationRecord(RocketChatAssociationModel.MISC, `SFLAIA-${rid}`); + + if (updateIdleSessionScheduleStatus(read, modify, persistence, rid)) { + await modify.getScheduler().cancelJob('idle-session-timeout'); + } else { + await persistence.createWithAssociation({ idleSessionScheduleStarted: true }, assoc); + + } + + const task = { + id: 'idle-session-timeout', + when: `${idleTimeoutTimeoutTime} seconds`, + data: {rid}, + }; + await modify.getScheduler().scheduleOnce(task); } export const updateIdleSessionScheduleStatus = async (read: IRead, modify: IModify, persistence: IPersistence, rid: string) => { - const assoc = new RocketChatAssociationRecord(RocketChatAssociationModel.MISC, `SFLAIA-${rid}`); - const data = await retrieveDataByAssociation(read, assoc); + const assoc = new RocketChatAssociationRecord(RocketChatAssociationModel.MISC, `SFLAIA-${rid}`); + const data = await retrieveDataByAssociation(read, assoc); - if (data && data.idleSessionScheduleStarted) { - return true; - - } - return false; + return data && data.idleSessionScheduleStarted === true; }; diff --git a/lib/payloadAction.ts b/lib/payloadAction.ts index f052f08..cdd6630 100644 --- a/lib/payloadAction.ts +++ b/lib/payloadAction.ts @@ -2,7 +2,7 @@ import { IHttp, IModify, IPersistence, IRead } from '@rocket.chat/apps-engine/de import { AppSetting, DefaultMessage } from '../config/Settings'; import { ActionIds } from '../enum/ActionIds'; import { DialogflowRequestType, IDialogflowAction, IDialogflowMessage, IDialogflowPayload} from '../enum/Dialogflow'; -import { performHandover, updateRoomCustomFields } from '../lib/Room'; +import { closeChat, performHandover, updateRoomCustomFields } from '../lib/Room'; import { getAppSettingValue } from '../lib/Settings'; import { Dialogflow } from './Dialogflow'; import { createMessage } from './Message'; @@ -33,6 +33,8 @@ export const handlePayloadActions = async (read: IRead, modify: IModify, http: } } await performHandover(modify, read, rid, visitorToken, targetDepartment); + } else if (actionName === ActionIds.CLOSE_CHAT) { + await closeChat(modify, read, rid, persistence); } else if (actionName === ActionIds.SET_TIMEOUT) { const event = { name: params.eventName, languageCode: 'en', parameters: {} }; From 37c50dd63b994d18af44fcfa4288e7131ac84d95 Mon Sep 17 00:00:00 2001 From: AlexanderKanakis Date: Wed, 23 Jun 2021 20:15:43 +0300 Subject: [PATCH 3/4] Removed session timeout functionality --- DialogflowApp.ts | 1 - lib/IdleSessionTimeoutProcessor.ts | 20 ------------------- lib/Room.ts | 8 -------- lib/Timeout.ts | 31 ------------------------------ lib/payloadAction.ts | 1 - 5 files changed, 61 deletions(-) delete mode 100644 lib/IdleSessionTimeoutProcessor.ts diff --git a/DialogflowApp.ts b/DialogflowApp.ts index e8e497d..a03ef5b 100644 --- a/DialogflowApp.ts +++ b/DialogflowApp.ts @@ -92,7 +92,6 @@ export class DialogflowApp extends App implements IPostMessageSent, IPostLivecha await configuration.scheduler.registerProcessors([ new SessionMaintenanceProcessor('session-maintenance'), new EventScheduler('event-scheduler'), - new IdleSessionTimeoutProcessor('idle-session-timeout'), ]); await Promise.all(settings.map((setting) => configuration.settings.provideSetting(setting))); diff --git a/lib/IdleSessionTimeoutProcessor.ts b/lib/IdleSessionTimeoutProcessor.ts deleted file mode 100644 index 1a757f2..0000000 --- a/lib/IdleSessionTimeoutProcessor.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { IHttp, IModify, IPersistence, IRead } from '@rocket.chat/apps-engine/definition/accessors'; -import { RocketChatAssociationModel, RocketChatAssociationRecord } from '@rocket.chat/apps-engine/definition/metadata'; -import { IJobContext, IProcessor } from '@rocket.chat/apps-engine/definition/scheduler'; -import { closeChat } from './Room'; -import { resetFallbackIntent } from './SynchronousHandover'; - -export class IdleSessionTimeoutProcessor implements IProcessor { - public id: string; - - constructor(id: string) { - this.id = id; - } - - public async processor(jobContext: IJobContext, read: IRead, modify: IModify, http: IHttp, persis: IPersistence): Promise { - - await closeChat(modify, read, jobContext.rid, persis); - - return resetFallbackIntent(read, modify, jobContext.rid); - } -} diff --git a/lib/Room.ts b/lib/Room.ts index 6252882..7abf355 100644 --- a/lib/Room.ts +++ b/lib/Room.ts @@ -8,7 +8,6 @@ import { removeBotTypingListener } from '../lib//BotTyping'; import { getAppSettingValue } from '../lib/Settings'; import { createMessage } from './Message'; import { SessionMaintenanceOnceSchedule } from './sessionMaintenance/SessionMaintenanceOnceSchedule'; -import { updateIdleSessionScheduleStatus } from './Timeout'; export const updateRoomCustomFields = async (rid: string, data: any, read: IRead, modify: IModify): Promise => { if (!rid) { @@ -39,13 +38,6 @@ export const closeChat = async (modify: IModify, read: IRead, rid: string, persi const room: IRoom = (await read.getRoomReader().getById(rid)) as IRoom; if (!room) { throw new Error(Logs.INVALID_ROOM_ID); } - if (persistence && updateIdleSessionScheduleStatus(read, modify, persistence, rid)) { - const assoc = new RocketChatAssociationRecord(RocketChatAssociationModel.MISC, `SFLAIA-${rid}`); - - await persistence.updateByAssociation(assoc, { idleSessionScheduleStarted: false }); - await modify.getScheduler().cancelJob('idle-session-timeout'); - } - await removeBotTypingListener(rid); const closeChatMessage = await getAppSettingValue(read, AppSetting.DialogflowCloseChatMessage); diff --git a/lib/Timeout.ts b/lib/Timeout.ts index 5b69cef..c4ba117 100644 --- a/lib/Timeout.ts +++ b/lib/Timeout.ts @@ -74,37 +74,6 @@ export const handleTimeout = async (app: IApp, message: IMessage, read: IRead, h }); modify.getExtender().finish(await msgExtender); - console.log('schedule timeout'); - - await scheduleTimeOut(message, read, modify, persistence); - } } }; - -async function scheduleTimeOut(message: IMessage, read: IRead, modify: IModify, persistence: IPersistence) { - const idleTimeoutTimeoutTime: string = await getAppSettingValue(read, AppSetting.DialogflowCustomerTimeoutTime); - const rid = message.room.id; - const assoc = new RocketChatAssociationRecord(RocketChatAssociationModel.MISC, `SFLAIA-${rid}`); - - if (updateIdleSessionScheduleStatus(read, modify, persistence, rid)) { - await modify.getScheduler().cancelJob('idle-session-timeout'); - } else { - await persistence.createWithAssociation({ idleSessionScheduleStarted: true }, assoc); - - } - - const task = { - id: 'idle-session-timeout', - when: `${idleTimeoutTimeoutTime} seconds`, - data: {rid}, - }; - await modify.getScheduler().scheduleOnce(task); -} - -export const updateIdleSessionScheduleStatus = async (read: IRead, modify: IModify, persistence: IPersistence, rid: string) => { - const assoc = new RocketChatAssociationRecord(RocketChatAssociationModel.MISC, `SFLAIA-${rid}`); - const data = await retrieveDataByAssociation(read, assoc); - - return data && data.idleSessionScheduleStarted === true; -}; diff --git a/lib/payloadAction.ts b/lib/payloadAction.ts index cdd6630..46363ad 100644 --- a/lib/payloadAction.ts +++ b/lib/payloadAction.ts @@ -6,7 +6,6 @@ import { closeChat, performHandover, updateRoomCustomFields } from '../lib/Room' import { getAppSettingValue } from '../lib/Settings'; import { Dialogflow } from './Dialogflow'; import { createMessage } from './Message'; -import { updateIdleSessionScheduleStatus } from './Timeout'; export const handlePayloadActions = async (read: IRead, modify: IModify, http: IHttp, persistence: IPersistence, rid: string, visitorToken: string, dialogflowMessage: IDialogflowMessage) => { const { messages = [] } = dialogflowMessage; From 1c718c3a4bb659f1c50accad15d01539c78a93a6 Mon Sep 17 00:00:00 2001 From: AlexanderKanakis Date: Thu, 24 Jun 2021 20:53:41 +0300 Subject: [PATCH 4/4] Fixed issues causing Crash --- DialogflowApp.ts | 1 - lib/Room.ts | 1 - lib/Timeout.ts | 2 -- 3 files changed, 4 deletions(-) diff --git a/DialogflowApp.ts b/DialogflowApp.ts index a03ef5b..de824ec 100644 --- a/DialogflowApp.ts +++ b/DialogflowApp.ts @@ -25,7 +25,6 @@ import { OnAgentUnassignedHandler } from './handler/OnAgentUnassignedHandler'; import { OnSettingUpdatedHandler } from './handler/OnSettingUpdatedHandler'; import { PostMessageSentHandler } from './handler/PostMessageSentHandler'; import { EventScheduler } from './lib/EventTimeoutProcessor'; -import { IdleSessionTimeoutProcessor } from './lib/IdleSessionTimeoutProcessor'; import { SessionMaintenanceProcessor } from './lib/sessionMaintenance/SessionMaintenanceProcessor'; export class DialogflowApp extends App implements IPostMessageSent, IPostLivechatAgentAssigned, IPostLivechatAgentUnassigned, IPostLivechatRoomClosed, IUIKitLivechatInteractionHandler { diff --git a/lib/Room.ts b/lib/Room.ts index 7abf355..d90a75a 100644 --- a/lib/Room.ts +++ b/lib/Room.ts @@ -1,6 +1,5 @@ import { IModify, IPersistence, IRead } from '@rocket.chat/apps-engine/definition/accessors'; import { IDepartment, ILivechatRoom, ILivechatTransferData, IVisitor } from '@rocket.chat/apps-engine/definition/livechat'; -import { RocketChatAssociationModel, RocketChatAssociationRecord } from '@rocket.chat/apps-engine/definition/metadata'; import { IRoom } from '@rocket.chat/apps-engine/definition/rooms'; import { AppSetting, DefaultMessage } from '../config/Settings'; import { Logs } from '../enum/Logs'; diff --git a/lib/Timeout.ts b/lib/Timeout.ts index c4ba117..e88e933 100644 --- a/lib/Timeout.ts +++ b/lib/Timeout.ts @@ -1,11 +1,9 @@ import { IHttp, IModify, IPersistence, IRead } from '@rocket.chat/apps-engine/definition/accessors'; import { IApp } from '@rocket.chat/apps-engine/definition/IApp'; import { IMessage } from '@rocket.chat/apps-engine/definition/messages'; -import { RocketChatAssociationModel, RocketChatAssociationRecord } from '@rocket.chat/apps-engine/definition/metadata'; import { RoomType } from '@rocket.chat/apps-engine/definition/rooms'; import { AppSetting } from '../config/Settings'; import { getAppSettingValue } from '../lib/Settings'; -import { retrieveDataByAssociation } from './retrieveDataByAssociation'; export const handleTimeout = async (app: IApp, message: IMessage, read: IRead, http: IHttp, persistence: IPersistence, modify: IModify ) => {