4886106248092

createSocketTransformer({
 handleInput: async ({ payload, endpoint }) => {

let text = payload.text;

const sessionStorage = await getSessionStorage(payload.userId, payload.sessionId);
 if (sessionStorage.hasOwnProperty("chatHistory")) {
 sessionStorage.chatHistory += "\nUser: " + text;
 } else {
 sessionStorage.chatHistory = "User: " + text;
 }

if (sessionStorage.cognigyState == "OPENAGENT" || sessionStorage.cognigyState == "OPENBOT") {
 console.log("Redirecting to ServiceNow");

let body = {
 "token": sessionStorage.serviceNowAPIToken,
 "requestId": sessionStorage.cognigyInputId,
 "action": null,
 "enterpriseId": "Cognigy",
 "clientSessionId": payload.sessionId,
 "botToBot": true,
 "clientVariables": {
 "cognigyState": sessionStorage.cognigyState,
 "cognigyInputId": sessionStorage.cognigyInputId,
 "cognigyUserId": sessionStorage.cognigyUserId
 },
 "message": {
 "text": payload.text,
 "typed": true,
 "clientMessageId": sessionStorage.cognigyInputId
 },
 "userId": sessionStorage.userId,
 "emailId": sessionStorage.emailId,
 "timezone": sessionStorage.timezone
 }

if (payload.text?.toLowerCase() == sessionStorage.quitPhrase?.toLowerCase()) {

body.action = "END_CONVERSATION";
 body.message.text = "";
 body.clientVariables.cognigyState = "CLOSED";
 sessionStorage.cognigyState = "CLOSED";
 }

try {

const result = await httpRequest({
 uri: sessionStorage.serviceNowInstanceURL + "/api/sn_va_as_service/bot/integration",
 method: "POST",
 headers: {
 'Authorization': sessionStorage.authorization,
 'Content-Type': 'application/json',
 'Accept': 'application/json'
 },
 body: body,
 json: true
 });

return null;

} catch (e) {
 text = "Cannot connect to ServiceNow. Check connection details in Start_Conversation node ...\n" + e.message;
 }

}

return {
 userId: payload.userId,
 sessionId: payload.sessionId,
 text: text,
 data: payload.data
 };
 },
 handleOutput: async ({ processedOutput, output, endpoint, userId, sessionId }) => {

const sessionStorage = await getSessionStorage(userId, sessionId);
 if (sessionStorage.hasOwnProperty("chatHistory")) {
 sessionStorage.chatHistory += "\nBot: " + output.text;
 } else {
 sessionStorage.chatHistory = "Bot: " + output.text;
 }

return processedOutput;
 },
 handleNotify: async ({ request, response, endpoint }) => {

if (!request.body.clientVariables.hasOwnProperty('cognigyState')) return null;

const state = request.body.clientVariables.cognigyState;
 if (state != "STARTAGENT" && state != "STARTBOT" && state != "OPENAGENT" && state != "OPENBOT" && state != "CLOSED") return null;

let text = "";
 let data = {};

const userId = request.body.clientVariables.cognigyUserId;
 const sessionId = request.body.clientSessionId;

const sessionStorage = await getSessionStorage(userId, sessionId);

console.log("state=" + state);
 console.log("request.body.agentChat=" + request.body.agentChat);
 console.log("request.body.completed=" + request.body.completed);

if (state == "STARTAGENT" || state == "STARTBOT" || (state == "OPENAGENT" && request.body.completed) || (state == "OPENBOT" && request.body.completed)) {

if (state == "STARTAGENT" || state == "STARTBOT") {
 sessionStorage.serviceNowInstanceURL = request.body.clientVariables.serviceNowInstanceURL;
 sessionStorage.serviceNowAPIToken = request.body.clientVariables.serviceNowAPIToken;
 sessionStorage.authorization = request.body.clientVariables.authorization;
 console.log("Authorization: " + sessionStorage.authorization);
 sessionStorage.userId = request.body.clientVariables.userId;
 sessionStorage.emailId = request.body.clientVariables.emailId;
 sessionStorage.timezone = request.body.clientVariables.timezone;
 sessionStorage.quitPhrase = request.body.clientVariables.quitPhrase;
 sessionStorage.cognigyUserId = userId;
 sessionStorage.botQuitPhrase = request.body.clientVariables.botQuitPhrase;
 }

const body = {
 "token": sessionStorage.serviceNowAPIToken,
 "requestId": sessionStorage.cognigyInputId,
 "action": "AGENT",
 "enterpriseId": "Cognigy",
 "clientSessionId": sessionId,
 "botToBot": true,
 "clientVariables": {
 "cognigyState": "CLOSED",
 "cognigyInputId": sessionStorage.cognigyInputId,
 "cognigyUserId": userId,
 },
 "message": {
 "text": null,
 "typed": true,
 "clientMessageId": sessionStorage.cognigyInputId
 },
 "userId": sessionStorage.userId,
 "emailId": sessionStorage.emailId,
 "timezone": sessionStorage.timezone
 }

if (state == "STARTAGENT") {

const message = sessionStorage.chatHistory;

body.requestId = request.body.clientVariables.cognigyInputId + "/H";
 body.clientVariables.cognigyState = "OPENAGENT";
 body.clientVariables.cognigyInputId = request.body.clientVariables.cognigyInputId + "/H";
 body.message.clientMessageId = request.body.clientVariables.cognigyInputId + "/H";
 body.message.text = message;

sessionStorage.cognigyInputId = request.body.clientVariables.cognigyInputId + "/H";

try {

const result = await httpRequest({
 uri: request.body.clientVariables.serviceNowInstanceURL + "/api/sn_va_as_service/bot/integration",
 method: "POST",
 headers: {
 'Authorization': sessionStorage.authorization,
 'Content-Type': 'application/json',
 'Accept': 'application/json'
 },
 body: body,
 json: true
 });

} catch (e) {

text = "Cannot connect to ServiceNow to initiate the conversation with Livechat. Check connection details in Start_Conversation node ...\n" + e.message;

return {
 userId,
 sessionId,
 text,
 data
 };

}

sessionStorage.cognigyState = "OPENAGENT";

return null;
 }

if (state == "STARTBOT") {
 sessionStorage.cognigyState = "OPENBOT";
 sessionStorage.cognigyInputId = request.body.clientVariables.cognigyInputId + "/H";

text = request.body.body[request.body.body.length - 1].promptMsg;

return {
 userId,
 sessionId,
 text,
 data
 };
 }

if (state == "OPENAGENT" && request.body.completed) {

sessionStorage.cognigyState = "CLOSED";

text = request.body.body[request.body.body.length - 1].value;

return {
 userId,
 sessionId,
 text,
 data
 };
 }

if (state == "OPENBOT" && request.body.completed) {

sessionStorage.cognigyState = "CLOSED";

text = request.body.body[request.body.body.length - 1].value;

return {
 userId,
 sessionId,
 text,
 data
 };
 }

}

sessionStorage.cognigyInputId = request.body.clientVariables.cognigyInputId + "*";

for (let row in request.body.body) {
 if (request.body.body[row].uiType == "OutputText") {
 text += request.body.body[row].value + "\n";
 } if (request.body.body[row].uiType == "OutputCard") {
 let data = JSON.parse(request.body.body[row].data);
 text += data.title + "\n";
 for (let field in data.fields) {
 console.log("Hello");
 text += data.fields[field].fieldLabel + " - " + data.fields[field].fieldValue + "\n";
 }
 } if (request.body.body[row].uiType == "InputText") {
 text += request.body.body[row].label + "\n";
 }
 }

if (sessionStorage.botQuitPhrase != null && sessionStorage.botQuitPhrase != "") {
 if (text.includes(sessionStorage.botQuitPhrase)) sessionStorage.cognigyState = "CLOSED";
 }

return {
 userId,
 sessionId,
 text,
 data
 };
 }
});