コード例 #1
0
        public Task <bool> IsConditionMet(ChatModel chatModel, ChatFlowStep chatFlowStep, Chat_ChildRef childRef)
        {
            if (!initialized)
            {
                throw new ApplicationException("ChatScriptManager is not initialized.  Call Initialize()");
            }

            if (String.IsNullOrEmpty(childRef.Condition))
            {
                return(Task.FromResult(true));
            }

            ChatVariables globalFields = chatModel.CurrentState.GlobalAnswers;
            ChatVariables flowFields   = chatModel.CurrentState.GetFlowAnswers(chatFlowStep.Flow);

            if (AwsUtilityMethods.IsRunningOnAWS)
            {
                AWSXRayRecorder.Instance.BeginSubsegment("Script: Evaluate Condition");
            }
            try
            {
                //logger.DebugFormat("Script: IsConditionMet Start. '{0}'", childRef.Condition);

                return(Task.FromResult(
                           RunScript <bool>((engine, globalValues, flowValues) =>
                {
                    var result = engine.Evaluate(childRef.Condition);

                    if (!(result is bool))
                    {
                        logger.WarnFormat("Script: IsCondition did not return true/false.  Evaluating with Javascript rules. '{0}', result: '{1}'", childRef.Condition, result);
                    }

                    return UtilityMethods.ParseJavascriptBoolean(result);
                }, globalFields, flowFields, null)
                           ));
            }
            catch (Exception ex)
            {
                if (AwsUtilityMethods.IsRunningOnAWS)
                {
                    AWSXRayRecorder.Instance.AddException(ex);
                }
                logger.ErrorFormat("Script: IsConditionMet Error. '{0}' '{1}'", childRef.Condition, ex.Message);
            }
            finally
            {
                if (AwsUtilityMethods.IsRunningOnAWS)
                {
                    AWSXRayRecorder.Instance.EndSubsegment();
                }
            }

            return(Task.FromResult(false));
        }
コード例 #2
0
        private void ConvertFieldsToNative(ChatVariables fields, dynamic values, bool global)
        {
            ExpandoObject eo = values;

            foreach (var item in eo)
            {
                if (global && IsVariableControlled(item.Key))
                {
                    continue;
                }

                fields[item.Key] = item.Value?.FromScriptValue();
            }
        }
コード例 #3
0
        public Task <ErrorHandlerResult> ProcessErrorHandler(ChatModel chatModel, ChatFlowStep chatFlowStep)
        {
            if (!initialized)
            {
                throw new ApplicationException("ChatScriptManager is not initialized.  Call Initialize()");
            }

            string        script       = chatFlowStep.ErrorHandler;
            ChatVariables globalFields = chatModel.CurrentState.GlobalAnswers;
            ChatVariables flowFields   = chatModel.CurrentState.GetFlowAnswers(chatFlowStep.Flow);

            if (AwsUtilityMethods.IsRunningOnAWS)
            {
                AWSXRayRecorder.Instance.BeginSubsegment("Script: Process Parser Error Handler");
            }
            try
            {
                return(Task.FromResult(
                           RunScript <ErrorHandlerResult>((engine, globalValues, flowValues) =>
                {
                    dynamic result = engine.Evaluate(script);
                    if (result == null)
                    {
                        return null;
                    }

                    ConvertFieldsToNative(globalFields, globalValues, true);
                    ConvertFieldsToNative(flowFields, flowValues, false);

                    return ScriptHelpers.ConvertToType <ErrorHandlerResult>(result);
                }, globalFields, flowFields, null)
                           ));
            }
            catch (Exception ex)
            {
                if (AwsUtilityMethods.IsRunningOnAWS)
                {
                    AWSXRayRecorder.Instance.AddException(ex);
                }
                logger.ErrorFormat("Script: Process Parser Error Handler Error. '{0}'", ex.Message);
                throw;
            }
            finally
            {
                if (AwsUtilityMethods.IsRunningOnAWS)
                {
                    AWSXRayRecorder.Instance.EndSubsegment();
                }
            }
        }
コード例 #4
0
        private TResult RunScript <TResult>(Func <V8ScriptEngine, dynamic, dynamic, TResult> function, ChatVariables globalFields, ChatVariables flowFields, object functionParams)
        {
            using (var context = v8Runtime.CreateScriptEngine())
            {
                dynamic globalValues = globalFields.FieldAnswers.ToDynamic(context);
                dynamic flowValues   = flowFields.FieldAnswers.ToDynamic(context);

                ScriptHost.ScriptContext = context;

                ConfigureScriptEngine(context, globalValues, flowValues, functionParams);

                TResult result = function(context, globalValues, flowValues);
                //if (logger.IsDebugEnabled)
                //    logger.DebugFormat("Script: Stats: {0}", JsonConvert.SerializeObject(context.GetRuntimeHeapInfo()));

                return(result);
            }
        }
コード例 #5
0
        public Task <object> ProcessActions(ChatModel chatModel, ChatFlowStep chatFlowStep, object functionParams, bool expectResult)
        {
            if (!initialized)
            {
                throw new ApplicationException("ChatScriptManager is not initialized.  Call Initialize()");
            }

            ChatVariables globalFields = chatModel.CurrentState.GlobalAnswers;
            ChatVariables flowFields   = chatModel.CurrentState.GetFlowAnswers(chatFlowStep.Flow);

            ScriptHost.ClearProperties();

            if (chatFlowStep.Actions == null)
            {
                return(Task.FromResult <object>(null));
            }

            //logger.DebugFormat("Script: ProcessActions Start JScriptEngine. {0}:{1}", chatFlowStep.Flow, chatFlowStep.Id);

            object result = null;

            if (AwsUtilityMethods.IsRunningOnAWS)
            {
                AWSXRayRecorder.Instance.BeginSubsegment("Script: ProcessActions");
            }
            try
            {
                return(Task.FromResult(
                           RunScript <object>((engine, globalValues, flowValues) =>
                {
                    // Performance optimization for ClearScript.
                    // If we dont want the result, we dont need to marshal the result back.
                    chatFlowStep.Actions.ForEach(action => result = RunAction(engine, action, expectResult));

                    ConvertFieldsToNative(globalFields, globalValues, true);
                    ConvertFieldsToNative(flowFields, flowValues, false);
                    return result;
                }, globalFields, flowFields, functionParams)
                           ));
            }
            catch (Exception ex)
            {
                if (AwsUtilityMethods.IsRunningOnAWS)
                {
                    AWSXRayRecorder.Instance.AddException(ex);
                }

                if (ex is Microsoft.ClearScript.ScriptEngineException scriptEx)
                {
                    logger.ErrorFormat("Script: ProcessActions Error. '{0}'", scriptEx.ErrorDetails);
                    throw new ScriptException(scriptEx.ErrorDetails, ex, chatFlowStep.Flow, chatFlowStep.Id);
                }

                logger.ErrorFormat("Script: ProcessActions Error. '{0}'", ex.Message);
                throw;
            }
            finally
            {
                if (AwsUtilityMethods.IsRunningOnAWS)
                {
                    AWSXRayRecorder.Instance.EndSubsegment();
                }
            }
        }
コード例 #6
0
        private void UpdateV1State(ChatState state, Chat_ParseField chatParseField, ParseResult result, ChatVariables variables)
        {
            DateTime date   = (DateTime)result.Answer;
            int      offset = state.GetUserTimeZoneOffset();

            variables[chatParseField.FieldName]           = date.AddHours(offset).ToShortDateString();
            variables[chatParseField.FieldName + "_Date"] = date;

            CheckIfAnswerHasPII(state, chatParseField, date.ToString(), PIIMask);
        }