public async Task <object> ProcessActions(ChatModel chatModel, ChatFlowStep chatFlowStep, object functionParams, bool expectResult) { ScriptHost.ClearProperties(); if (chatFlowStep.Actions == null && chatFlowStep.ObjectType != ChatObjectType.Message && chatFlowStep.ObjectType != ChatObjectType.StaticMessage) { return(null); } logger.DebugFormat("Script: ProcessActions Start - Remote NodeJS. {0}:{1}", chatFlowStep.Flow, chatFlowStep.Id); object result = null; var functionName = $"{chatFlowStep.ObjectType}{chatFlowStep.Id}_{FormatFunctionName(chatFlowStep.Name)}"; var response = await ExecuteNode(chatModel, chatFlowStep.Flow, functionName, functionParams); if (!UtilityMethods.IsNullOrEmpty(response)) { foreach (var item in response) { switch (item) { case NodeAbortResponse abortResponse: ChatScriptHost.Abort(abortResponse.Result); break; // TODO: Check if actionResponse is different meaning than nodeVariableResponse case NodeActionResponse actionResponse: result = actionResponse.Result?.FromScriptValue(); break; case NodeAddPiiTextResponse addPiiTextResponse: { ChatScriptHost.AddPiiText(addPiiTextResponse.Result.PiiType, addPiiTextResponse.Result.Text, addPiiTextResponse.Result.Mask); break; } case NodeCallFlowResponse callFlowResponse: ChatScriptHost.CallFlow(callFlowResponse.Result.FlowName, callFlowResponse.Result.Params); break; case NodeChangeContextResponse changeContextResponse: ChatScriptHost.ChangeContext(changeContextResponse.Result.Partner, changeContextResponse.Result.Context); break; case NodeErrorResponse errorResponse: throw new ScriptException(errorResponse.Stack, chatFlowStep.Flow, chatFlowStep.Id); case NodeIncreaseFailureCountResponse increaseFailureCountResponse: ChatScriptHost.IncreaseFailureCount(); break; case NodeLogResponse logResponse: ChatScriptHost.LogInfoMessage(logResponse.Result); break; case NodeMessageResponse messageResponse: ChatScriptHost.UI("", messageResponse.Result); break; case NodeSendEmailResponse sendEmailResponse: { ChatScriptHost.SendEmail(sendEmailResponse.Result.From, sendEmailResponse.Result.Recipients, sendEmailResponse.Result.Subject, sendEmailResponse.Result.Body, sendEmailResponse.Result.IsBodyHtml); break; } case NodeSendTagEventResponse sendTagEventResponse: ChatScriptHost.SendTagEvent(sendTagEventResponse.Result.TagName, sendTagEventResponse.Result.Properties); break; case NodePutKinesisEventResponse putKinesisEventResponse: { ChatScriptHost.PutKinesisEvent(putKinesisEventResponse.Result.Arn, putKinesisEventResponse.Result.StreamName, putKinesisEventResponse.Result.StsRoleSessionName, putKinesisEventResponse.Result.PartitionKey, putKinesisEventResponse.Result.EventData); break; } case NodeSetQuickRepliesResponse setQuickRepliesResponse: ChatScriptHost.SetQuickReplies(setQuickRepliesResponse.Result.Choices); break; case NodeTransferToAgentResponse transferToAgentResponse: { ChatScriptHost.TransferToAgent(transferToAgentResponse.Result.TransferInfo, transferToAgentResponse.Result.Skill); break; } case NodeUiResponse uiResponse: ChatScriptHost.UI(uiResponse.Result.CustomMarkup, uiResponse.Result.PlainText); break; case NodeVariableResponse variableResponse: result = variableResponse.Result; break; } } } logger.DebugFormat("Script: ProcessActions End - Remote NodeJS. {0}:{1}", chatFlowStep.Flow, chatFlowStep.Id); return(result); }