Пример #1
0
        /// <summary>
        /// Searches the CustomTag collection and processes the AIML if an appropriate tag handler is found
        /// </summary>
        /// <param name="user">the user who originated the request</param>
        /// <param name="query">the query that produced this node</param>
        /// <param name="request">the request from the user</param>
        /// <param name="result">the result to be sent to the user</param>
        /// <param name="node">the node to evaluate</param>
        /// <returns>the output string</returns>
        public AIMLTagHandler getBespokeTags(User user, SubQuery query, Request request, Result result, XmlNode node)
        {
            if (CustomTags.ContainsKey(node.Name.ToLower()))
            {
                TagHandler customTagHandler = CustomTags[node.Name.ToLower()];

                AIMLTagHandler newCustomTag = customTagHandler.Instantiate(LateBindingAssemblies);
                if (object.Equals(null, newCustomTag))
                {
                    return(null);
                }
                else
                {
                    newCustomTag.user         = user;
                    newCustomTag.query        = query;
                    newCustomTag.request      = request;
                    newCustomTag.result       = result;
                    newCustomTag.templateNode = node;
                    newCustomTag.bot          = this;
                    return(newCustomTag);
                }
            }
            else
            {
                return(null);
            }
        }
Пример #2
0
        /// <summary>
        /// Given a request containing user input, produces a result from the bot
        /// </summary>
        /// <param name="request">the request from the user</param>
        /// <returns>the result to be output to the user</returns>
        public async Task <Result> Query(Request request)
        {
            return(await Task.Run(() =>
            {
                Result result = new Result(request.user, this, request);

                if (this.isAcceptingUserInput)
                {
                    // Normalize the input
                    AIMLLoader loader = new AIMLLoader(this);
                    LIAM.Normalize.SplitIntoSentences splitter = new LIAM.Normalize.SplitIntoSentences(this);
                    string[] rawSentences = splitter.Transform(request.rawInput);
                    foreach (string sentence in rawSentences)
                    {
                        result.InputSentences.Add(sentence);
                        string path = loader.generatePath(sentence, request.user.getLastBotOutput(), request.user.Topic, true);
                        result.NormalizedPaths.Add(path);
                    }

                    // grab the templates for the various sentences from the graphmaster
                    foreach (string path in result.NormalizedPaths)
                    {
                        Utils.SubQuery query = new SubQuery(path);
                        query.Template = this.Graphmaster.evaluate(path, query, request, MatchState.UserInput, new StringBuilder());
                        result.SubQueries.Add(query);
                    }

                    // process the templates into appropriate output
                    foreach (SubQuery query in result.SubQueries)
                    {
                        if (query.Template.Length > 0)
                        {
                            try
                            {
                                XmlNode templateNode = AIMLTagHandler.getNode(query.Template);
                                string outputSentence = this.processNode(templateNode, query, request, result, request.user);
                                if (outputSentence.Length > 0)
                                {
                                    result.OutputSentences.Add(outputSentence);
                                }
                            }
                            catch
                            {
                                this.writeToLog("WARNING! A problem was encountered when trying to process the input: " + request.rawInput + " with the template: \"" + query.Template + "\"");
                            }
                        }
                    }
                }
                else
                {
                    result.OutputSentences.Add(this.NotAcceptingUserInputMessage);
                }

                // populate the Result object
                result.Duration = DateTime.Now - request.StartedOn;
                request.user.addResult(result);

                return result;
            }));
        }
Пример #3
0
        /// <summary>
        /// Loads any custom tag handlers found in the dll referenced in the argument
        /// </summary>
        /// <param name="pathToDLL">the path to the dll containing the custom tag handling code</param>
        public void loadCustomTagHandlers(string pathToDLL)
        {
            Assembly tagDLL = Assembly.LoadFrom(pathToDLL);

            Type[] tagDLLTypes = tagDLL.GetTypes();
            for (int i = 0; i < tagDLLTypes.Length; i++)
            {
                object[] typeCustomAttributes = tagDLLTypes[i].GetCustomAttributes(false);
                for (int j = 0; j < typeCustomAttributes.Length; j++)
                {
                    if (typeCustomAttributes[j] is CustomTagAttribute)
                    {
                        // We've found a custom tag handling class
                        // so instantiate it and store it away in the hashtable for
                        // later usage
                        AIMLTagHandler customtaghandler = (AIMLTagHandler)tagDLL.CreateInstance(tagDLLTypes[i].FullName);
                        string         tagname          = tagDLLTypes[i].Name.ToLower();
                        if (this.CustomTags.ContainsKey(tagname))
                        {
                            throw new Exception("ERROR! Unable to add the custom tag: <" + tagname + ">, found in: " + pathToDLL + " as a handler for this tag already exists.");
                        }
                        else
                        {
                            this.CustomTags.Add(tagname, customtaghandler);
                        }
                    }
                }
            }
        }
Пример #4
0
        /// <summary>
        /// Searches the CustomTag collection and processes the AIML if an appropriate tag handler is found
        /// </summary>
        /// <param name="user">the user who originated the request</param>
        /// <param name="query">the query that produced this node</param>
        /// <param name="request">the request from the user</param>
        /// <param name="result">the result to be sent to the user</param>
        /// <param name="node">the node to evaluate</param>
        /// <returns>the output string</returns>
        public AIMLTagHandler getBespokeTags(User user, SubQuery query, Request request, Result result, XmlNode node)
        {
            if (this.CustomTags.ContainsKey(node.Name.ToLower()))
            {
                TagHandler customTagHandler = (TagHandler)this.CustomTags[node.Name.ToLower()];

                AIMLTagHandler newCustomTag = customTagHandler.Instantiate(this.LateBindingAssemblies);
                if (object.Equals(null, newCustomTag))
                {
                    return(null);
                }
                else
                {
                    newCustomTag.user         = user;
                    newCustomTag.query        = query;
                    newCustomTag.request      = request;
                    newCustomTag.result       = result;
                    newCustomTag.templateNode = node;
                    newCustomTag.templateNode.Attributes.RemoveNamedItem("xmlns");
                    newCustomTag.InputString = node.OuterXml;
                    newCustomTag.bot         = this;
                    return(newCustomTag);
                }
            }
            else
            {
                return(null);
            }
        }
Пример #5
0
 public override float CanUnify(Unifiable with)
 {
     if (templateNode.NodeType == XmlNodeType.Text)
     {
         string srch = (" " + with.ToValue(query) + " ").ToUpper();
         return(((" " + templateNode.InnerText + " ").ToUpper().Contains(srch)) ? AND_TRUE : AND_FALSE);
     }
     if (templateNode.HasChildNodes)
     {
         // recursively check
         foreach (XmlNode childNode in templateNode.ChildNodes)
         {
             try
             {
                 if (childNode.NodeType == XmlNodeType.Text)
                 {
                     string srch = (" " + with.ToValue(query) + " ").ToUpper();
                     return(((" " + childNode.InnerText + " ").ToUpper().Contains(srch)) ? AND_TRUE : AND_FALSE);
                 }
                 AIMLTagHandler part = GetChildTagHandler(childNode);
                 if (part.CallCanUnify(with) > 0)
                 {
                     return(AND_FALSE);
                 }
             }
             catch (Exception e)
             {
                 Proc.writeToLog(e);
                 writeToLogWarn("" + e);
             }
         }
         return(AND_TRUE);
     }
     return(AND_TRUE);
 }
        private AIMLTagHandler proccessTemplate(SubQuery query, Request request, Result result,
                                                XmlNode templateNode, Unifiable sGuard,
                                                out bool createdOutput, out bool templateSucceeded,
                                                AIMLTagHandler parentHandlerU, TemplateInfo templateInfo,
                                                bool copyChild, bool copyParent)
        {
            ChatLabel label      = request.PushScope;
            var       prevTraced = request.IsTraced;
            var       untraced   = request.Graph.UnTraced;
            var       superTrace = templateInfo != null && templateInfo.IsTraced;

            try
            {
                if (superTrace)
                {
                    request.IsTraced       = true;
                    request.Graph.UnTraced = false;
                }

                var th = proccessResponse000(query, request, result, templateNode, sGuard,
                                             out createdOutput, out templateSucceeded,
                                             parentHandlerU, templateInfo, copyChild, copyParent);

                if (superTrace)
                {
                    StaticAIMLUtils.writeDebugLine("SuperTrace=" + templateSucceeded + ": " + templateInfo);
                }
                return(th);
            }
            catch (ChatSignalOverBudget ex)
            {
                throw;
            }
            catch (ChatSignal ex)
            {
                if (label.IsSignal(ex))
                {
                    // if (ex.SubQuery != query) throw;
                    if (ex.NeedsAdding)
                    {
                        request.AddOutputSentences(templateInfo, ex.TemplateOutput, result, request.TopLevelScore);
                    }
                    templateSucceeded = ex.TemplateSucceeded;
                    createdOutput     = ex.CreatedOutput;
                    return(ex.TagHandlerU);
                }
                throw;
            }
            catch (Exception ex)
            {
                throw;
            }
            finally
            {
                request.IsTraced       = prevTraced;
                request.Graph.UnTraced = untraced;
                label.PopScope();
            }
        }
Пример #7
0
        /// <summary>
        /// Searches the CustomTag collection and processes the AIML if an appropriate tag handler is found
        /// </summary>
        /// <param name="user">the user who originated the request</param>
        /// <param name="query">the query that produced targetBot node</param>
        /// <param name="request">the request from the user</param>
        /// <param name="result">the result to be sent to the user</param>
        /// <param name="node">the node to evaluate</param>
        /// <returns>the output Unifiable</returns>
        static public AIMLTagHandler getBespokeTags(User user, SubQuery query, Request request, Result result, XmlNode node)
        {
            AltBot targetBot = query.TargetBot;
            string nodename  = node.Name.ToLower();

            if (CustomTags != null)
            {
                //return null;
                try
                {
                    lock (CustomTags)


                        if (CustomTags.ContainsKey(nodename))
                        {
                            TagHandler customTagHandler = CustomTags[node.Name.ToLower()];

                            AIMLTagHandler newCustomTag = customTagHandler.Instantiate(LateBindingAssemblies, user,
                                                                                       query,
                                                                                       request, result, node, targetBot);
                            if (Equals(null, newCustomTag))
                            {
                                return(null);
                            }
                            else
                            {
                                return(newCustomTag);
                            }
                        }
                }
                catch (Exception e)
                {
                    writeToLog("WARNING IN GET BESPOKE TAGS: " + e);
                }
            }
            {
                try
                {
                    if (nodename.StartsWith("#"))
                    {
                        return(null);
                    }
                    String typeName = typeof(TagHandlerProcessor).Namespace + ".AIMLTagHandlers." + nodename;
                    Type   t        = Type.GetType(typeName);
                    if (t == null)
                    {
                        return(null);
                    }
                    ConstructorInfo c = t.GetConstructor(TagHandler.CONSTRUCTOR_TYPES);
                    return((AIMLTagHandler)c.Invoke(new object[] { targetBot, user, query, request, result, node }));
                }
                catch (Exception e)
                {
                    writeToLog("ERROR getBespokeTags: " + e);
                    return(null);
                }
            }
        }
Пример #8
0
        /// <summary>
        /// Given a request containing user input, produces a result from the bot
        /// </summary>
        /// <param name="request">the request from the user</param>
        /// <returns>the result to be output to the user</returns>
        public Result Chat(Request request)
        {
            Result result = new Result(request.User, this, request);

            // Normalize the input
            AIMLLoader loader = new AIMLLoader(this);

            AimlStandard.Normalize.SplitIntoSentences splitter = new AimlStandard.Normalize.SplitIntoSentences(this);
            string[] rawSentences = splitter.Transform(request.RawInput);
            foreach (string sentence in rawSentences)
            {
                result.InputSentences.Add(sentence);
                string path = loader.GeneratePath(sentence, request.User.GetLastBotOutput(), request.User.Topic, true);
                result.NormalizedPaths.Add(path);
            }

            // grab the templates for the various sentences from the graphmaster
            foreach (string path in result.NormalizedPaths)
            {
                string template = this.Graphmaster.Evaluate(path, request, MatchState.UserInput, new StringBuilder());
                result.Templates.Add(template);
            }

            // process the templates into appropriate output
            foreach (string template in result.Templates)
            {
                if (template.Length > 0)
                {
                    try
                    {
                        XmlNode templateNode   = AIMLTagHandler.GetNode(template);
                        string  outputSentence = this.ProcessNode(templateNode, request, result, request.User);
                        if (outputSentence.Length > 0)
                        {
                            result.OutputSentences.Add(outputSentence);
                        }
                    }
                    catch (Exception e)
                    {
                        if (this.WillCallHome)
                        {
                            this.PhoneHome(e.Message, request);
                        }
                        this.WriteToLog("WARNING! A mal-formed template was encountered when trying to process the input: " + request.RawInput);
                    }
                }
            }

            // populate the Result object
            result.Duration = DateTime.Now - request.StartedOn;
            request.User.AddResult(result);

            return(result);
        }
Пример #9
0
 // Token: 0x06000072 RID: 114 RVA: 0x00004BAC File Offset: 0x00003BAC
 protected override string ProcessChange()
 {
     if (this.templateNode.Name.ToLower() == "sr")
     {
         XmlNode node  = AIMLTagHandler.getNode("<star/>");
         star    star  = new star(this.bot, this.user, this.query, this.request, this.result, node);
         string  str   = star.Transform();
         XmlNode node2 = AIMLTagHandler.getNode("<srai>" + str + "</srai>");
         srai    srai  = new srai(this.bot, this.user, this.query, this.request, this.result, node2);
         return(srai.Transform());
     }
     return(string.Empty);
 }
Пример #10
0
        // Token: 0x06000018 RID: 24 RVA: 0x000025A0 File Offset: 0x000015A0
        protected override string ProcessChange()
        {
            if (!(this.templateNode.Name.ToLower() == "sentence"))
            {
                return(string.Empty);
            }
            if (this.templateNode.InnerText.Length > 0)
            {
                StringBuilder stringBuilder = new StringBuilder();
                char[]        array         = this.templateNode.InnerText.Trim().ToCharArray();
                bool          flag          = true;
                for (int i = 0; i < array.Length; i++)
                {
                    string text = Convert.ToString(array[i]);
                    if (this.bot.Splitters.Contains(text))
                    {
                        flag = true;
                    }
                    Regex regex = new Regex("[a-zA-Z]");
                    if (regex.IsMatch(text))
                    {
                        if (flag)
                        {
                            stringBuilder.Append(text.ToUpper(this.bot.Locale));
                            flag = false;
                        }
                        else
                        {
                            stringBuilder.Append(text.ToLower(this.bot.Locale));
                        }
                    }
                    else
                    {
                        stringBuilder.Append(text);
                    }
                }
                return(stringBuilder.ToString());
            }
            XmlNode node = AIMLTagHandler.getNode("<star/>");
            star    star = new star(this.bot, this.user, this.query, this.request, this.result, node);

            this.templateNode.InnerText = star.Transform();
            if (this.templateNode.InnerText.Length > 0)
            {
                return(this.ProcessChange());
            }
            return(string.Empty);
        }
Пример #11
0
 /// <summary>
 /// Searches the CustomTag collection and processes the AIML if an appropriate tag handler is found
 /// </summary>
 /// <param name="user">the user who originated the request</param>
 /// <param name="request">the request from the user</param>
 /// <param name="result">the result to be sent to the user</param>
 /// <param name="node">the node to evaluate</param>
 /// <returns>the output string</returns>
 private AIMLTagHandler GetBespokeTags(User user, Request request, Result result, XmlNode node)
 {
     if (this.CustomTags.ContainsKey(node.Name.ToLower()))
     {
         AIMLTagHandler customTagHandler = (AIMLTagHandler)this.CustomTags[node.Name.ToLower()];
         customTagHandler.User         = user;
         customTagHandler.Request      = request;
         customTagHandler.Result       = result;
         customTagHandler.templateNode = node;
         customTagHandler.Bot          = this;
         return(customTagHandler);
     }
     else
     {
         return(null);
     }
 }
        internal AIMLTagHandler GetTagHandler(User user, SubQuery query, Request request, Result result, XmlNode node,
                                              AIMLTagHandler parentTagHandlerU)
        {
            AltBot         targetBot = user.bot;
            AIMLTagHandler tag       = targetBot.GetTagHandler(node, query, request, result, user, true);

            if (query != null)
            {
                query.CurrentTagHandlerU = tag;
            }
            if (query != null)
            {
                query.CurrentNode = node;
            }
            if (tag == null)
            {
                writeToLog("NULL TAG " + node.OuterXml);
            }
            if (tag != null)
            {
                tag.SetParent(parentTagHandlerU);
                if (query != null)
                {
                    query.LastTagHandlerU = parentTagHandlerU ?? tag;
                }
                TemplateInfo ti = tag.templateInfo;
                if (ti == null && query != null)
                {
                    ti = query.CurrentTemplate;
                }
                if (ti == null && parentTagHandlerU != null)
                {
                    ti = parentTagHandlerU.GetTemplateInfo();
                }
                if (ti != null)
                {
                    tag.templateInfo = ti;
                }
                else
                {
                    //    writeToLog("DEBUG9 Missing templateInfo " + node.OuterXml);
                }
            }
            return(tag);
        }
        /// <summary>
        /// Should return the child tagHandler
        /// </summary>
        /// <param name="query"></param>
        /// <param name="request"></param>
        /// <param name="result"></param>
        /// <param name="templateNode"></param>
        /// <param name="sGuard"></param>
        /// <param name="createdOutput"></param>
        /// <param name="templateSucceeded"></param>
        /// <param name="parentHandlerU"></param>
        /// <param name="templateInfo"></param>
        /// <param name="copyChild"></param>
        /// <param name="copyParent"></param>
        /// <returns></returns>
        public AIMLTagHandler proccessResponse(SubQuery query,
                                               Request request, Result result,
                                               XmlNode templateNode, Unifiable sGuard,
                                               out bool createdOutput, out bool templateSucceeded,
                                               AIMLTagHandler parentHandlerU, TemplateInfo templateInfo,
                                               bool copyChild, bool copyParent)
        {
            //request.CurrentResult = result;
            query = query ?? request.CurrentQuery;
            if (request.CurrentQuery == null)
            {
                request.CurrentQuery = query;
            }
            if (templateInfo == null)
            {
                //  writeToLog("templateInfo is null " + templateNode);
            }
            templateInfo = templateInfo ?? query.CurrentTemplate;
            //request.CurrentQuery = query;
            if (!request.CanUseResultTemplate(templateInfo, result))
            {
                templateSucceeded = false;
                createdOutput     = false;
                return(null);
            }
            // now cant use it again
            if (templateInfo != null)
            {
                result.ResultTemplates.Add(templateInfo);
            }
            UndoStack undoStack = UndoStack.GetStackFor(query);

            try
            {
                var childTagHandler = proccessTemplate(query, request, result, templateNode, sGuard,
                                                       out createdOutput, out templateSucceeded,
                                                       parentHandlerU, templateInfo, copyChild, copyParent);
                return(childTagHandler);
            }
            finally
            {
                undoStack.UndoAll();
            }
        }
Пример #14
0
        // Token: 0x06000016 RID: 22 RVA: 0x000024C8 File Offset: 0x000014C8
        protected override string ProcessChange()
        {
            if (!(this.templateNode.Name.ToLower() == "person2"))
            {
                return(string.Empty);
            }
            if (this.templateNode.InnerText.Length > 0)
            {
                return(ApplySubstitutions.Substitute(this.bot, this.bot.Person2Substitutions, this.templateNode.InnerText));
            }
            XmlNode node = AIMLTagHandler.getNode("<star/>");
            star    star = new star(this.bot, this.user, this.query, this.request, this.result, node);

            this.templateNode.InnerText = star.Transform();
            if (this.templateNode.InnerText.Length > 0)
            {
                return(this.ProcessChange());
            }
            return(string.Empty);
        }
Пример #15
0
 public override float CanUnify(Unifiable with)
 {
     if (templateNode.NodeType == XmlNodeType.Text)
     {
         string srch = ToUpper(" " + with.ToValue(query) + " ");
         return((ToUpper(" " + templateNode.InnerText + " ").Equals(srch)) ? STAR_TRUE : STAR_FALSE);
     }
     if (templateNode.HasChildNodes)
     {
         {
             Unifiable rest = with;
             // recursively check
             foreach (XmlNode childNode in templateNode.ChildNodes)
             {
                 with = rest.First;
                 rest = rest.Rest;
                 try
                 {
                     if (childNode.NodeType == XmlNodeType.Text)
                     {
                         string srch = ToUpper(" " + with.ToValue(query) + " ");
                         return((ToUpper(" " + templateNode.InnerText + " ").Equals(srch))
                                    ? STAR_TRUE
                                    : STAR_FALSE);
                     }
                     AIMLTagHandler part = GetChildTagHandler(childNode);
                     if (part.CallCanUnify(with) > 0)
                     {
                         return(STAR_FALSE);
                     }
                 }
                 catch (Exception e)
                 {
                     AltBot.writeDebugLine("" + e);
                 }
             }
             return(IsNullOrEmpty(rest) ? STAR_TRUE : STAR_FALSE);
         }
     }
     return(IsNullOrEmpty(with) ? STAR_TRUE : STAR_FALSE);
 }
Пример #16
0
        // Token: 0x06000090 RID: 144 RVA: 0x0000616C File Offset: 0x0000516C
        public AIMLTagHandler getBespokeTags(User user, SubQuery query, Request request, Result result, XmlNode node)
        {
            if (!this.CustomTags.ContainsKey(node.Name.ToLower()))
            {
                return(null);
            }
            TagHandler     tagHandler     = this.CustomTags[node.Name.ToLower()];
            AIMLTagHandler aimltagHandler = tagHandler.Instantiate(this.LateBindingAssemblies);

            if (object.Equals(null, aimltagHandler))
            {
                return(null);
            }
            aimltagHandler.user         = user;
            aimltagHandler.query        = query;
            aimltagHandler.request      = request;
            aimltagHandler.result       = result;
            aimltagHandler.templateNode = node;
            aimltagHandler.bot          = this;
            return(aimltagHandler);
        }
Пример #17
0
        public override float CanUnify(Unifiable with)
        {
            string srch = with.ToValue(query);

            if (templateNode.NodeType == XmlNodeType.Text)
            {
                bool unifyWithTextNode = UnifyWithTextNode(templateNode, srch);
                return(unifyWithTextNode ? AND_TRUE : AND_FALSE);
            }
            if (templateNode.HasChildNodes)
            {
                // recursively check
                foreach (XmlNode childNode in templateNode.ChildNodes)
                {
                    try
                    {
                        if (childNode.NodeType == XmlNodeType.Text)
                        {
                            return(UnifyWithTextNode(childNode, srch) ? AND_TRUE : AND_FALSE);
                        }
                        AIMLTagHandler part = GetChildTagHandler(childNode);
                        if (part.CallCanUnify(with) > 0)
                        {
                            return(AND_FALSE);
                        }
                    }
                    catch (Exception e)
                    {
                        Proc.writeToLog(e);
                        writeToLogWarn("" + e);
                    }
                }
                return(AND_TRUE);
            }
            return(AND_TRUE);
        }
        public AIMLTagHandler proccessResponse000(SubQuery query, Request request, Result result,
                                                  XmlNode sOutput, Unifiable sGuard,
                                                  out bool createdOutput, out bool templateSucceeded,
                                                  AIMLTagHandler parentHandlerU, TemplateInfo templateInfo,
                                                  bool copyChild, bool copyParent)
        {
            AltBot Proc = query.TargetBot;

            //query.LastTagHandler = handler;
            bool isTraced = request.IsTraced || request.IsTraced || !request.GraphsAcceptingUserInput ||
                            (templateInfo != null && templateInfo.IsTraced);
            //XmlNode guardNode = AIMLTagHandler.getNode(s.Guard.InnerXml);
            bool usedGuard = sGuard != null && sGuard.PatternNode != null;

            sOutput = sOutput ?? templateInfo.ClonedOutput;
            string  output        = sOutput.OuterXml;
            XmlNode templateNode  = sOutput;
            bool    childOriginal = true;

            result.Started = true;
            if (usedGuard)
            {
                output = "<template>" + sGuard.PatternNode.OuterXml + " GUARDBOM " + output +
                         "</template>";
                templateNode = StaticAIMLUtils.getNodeAndSetSibling(false, output, false, false, sOutput);

                childOriginal = false;
            }

            bool           protectChild     = copyChild || childOriginal;
            bool           suspendingLimits = request.IsToplevelRequest || request.SuspendSearchLimits;
            AIMLTagHandler tagHandlerU      = GetTagHandler(request.Requester, query, request, result,
                                                            templateNode, parentHandlerU);
            string outputSentenceOut = processNode(templateNode, query,
                                                   request, result, request.Requester, parentHandlerU,
                                                   protectChild, copyParent, tagHandlerU, suspendingLimits, out templateSucceeded);

            templateSucceeded = !StaticAIMLUtils.IsFalse(outputSentenceOut);

            if (outputSentenceOut == null)
            {
                if (tagHandlerU == null)
                {
                    writeToLog("tagHandler = null " + output);
                }
                else
                {
                    bool success = false;
                    if (tagHandlerU.QueryHasSuceeded)
                    {
                        success = true;
                    }
                    if (tagHandlerU.QueryHasFailed)
                    {
                        success = false;
                    }
                    if (success)
                    {
                        writeToLog("Very BaD " + output);
                    }
                    else
                    {
                    }
                    templateSucceeded = false;
                    createdOutput     = false;
                    return(tagHandlerU);
                }
            }
            outputSentenceOut = outputSentenceOut ?? "";
            string left, outputSentence;

            if (!StaticAIMLUtils.SplitOff(outputSentenceOut, "GUARDBOM", out left, out outputSentence))
            {
                left           = null;
                outputSentence = outputSentenceOut;
            }
            if (sGuard == null || sGuard.PatternNode != null)
            {
                string o = Proc.ToEnglish(outputSentence);
                if (outputSentence.Trim().Length > 0)
                {
                    templateSucceeded = true;
                }
                if (Proc.IsOutputSentence(o, outputSentence))
                {
                    if (isTraced)
                    {
                        string aIMLLoaderParentTextAndSourceInfo = ParentTextAndSourceInfo(templateNode);
                        if (aIMLLoaderParentTextAndSourceInfo.Length > 300)
                        {
                            aIMLLoaderParentTextAndSourceInfo = TextFilter.ClipString(
                                aIMLLoaderParentTextAndSourceInfo, 300);
                        }
                        writeToLog("AIMLTRACE '{0}' IsOutputSentence={1}", o, aIMLLoaderParentTextAndSourceInfo);
                    }
                    createdOutput = true;
                    request.AddOutputSentences(templateInfo, o, result, request.TopLevelScore);
                }
                else
                {
                    createdOutput = false;
                }
                // @TODO @HACK @BUG isTraced is a HORRID flag here!
                if (false && !createdOutput && isTraced && request.GraphsAcceptingUserInput)
                {
                    if (templateInfo != null)
                    {
                        string fromStr = " from " + templateInfo.Graph;
                        if (!StaticAIMLUtils.IsSilentTag(templateNode))
                        {
                            writeToLog("SILENT '{0}' TEMPLATE={1}", o, ParentTextAndSourceInfo(templateNode) + fromStr);
                        }
                        request.DisableTemplateUntilFinished(templateInfo);
                    }
                    else
                    {
                        writeToLog("UNUSED '{0}' TEMPLATE={1}", o, ParentTextAndSourceInfo(templateNode));
                    }
                }

                return(tagHandlerU);
            }
            try
            {
                templateSucceeded = !StaticAIMLUtils.IsFalse(left);
                if (!templateSucceeded)
                {
                    createdOutput = false;
                    return(tagHandlerU);
                }
                string lang = StaticXMLUtils.GetAttribValue(sGuard.PatternNode, "lang", "cycl").ToLower();

                try
                {
                    Unifiable ss = Proc.SystemExecute(left, lang, request);
                    if (StaticAIMLUtils.IsFalse(ss) || StaticAIMLUtils.IsNullOrEmpty(ss))
                    {
                        if (isTraced)
                        {
                            writeToLog("GUARD FALSE '{0}' TEMPLATE={1}", request,
                                       ParentTextAndSourceInfo(templateNode));
                        }
                        templateSucceeded = false;
                        createdOutput     = false;
                        return(tagHandlerU);
                    }
                    else
                    {
                        templateSucceeded = true;
                    }
                }
                catch (ChatSignal e)
                {
                    throw;
                }
                catch (Exception e)
                {
                    Proc.writeToLog(e);
                    templateSucceeded = false;
                    createdOutput     = false;
                    return(tagHandlerU);
                }

                //part the BOM
                string o = Proc.ToEnglish(outputSentence);
                if (Proc.IsOutputSentence(o, outputSentence))
                {
                    if (isTraced)
                    {
                        writeToLog(query.Graph + ": GUARD SUCCESS '{0}' TEMPLATE={1}", o,
                                   ParentTextAndSourceInfo(templateNode));
                    }
                    templateSucceeded = true;
                    createdOutput     = true;
                    request.AddOutputSentences(templateInfo, o, result, request.TopLevelScore);
                    return(tagHandlerU);
                }
                else
                {
                    writeToLog("GUARD SKIP '{0}' TEMPLATE={1}", outputSentence,
                               ParentTextAndSourceInfo(templateNode));
                }
                templateSucceeded = false;
                createdOutput     = false;
                return(tagHandlerU);
            }
            catch (ChatSignal e)
            {
                throw;
            }
            catch (Exception ex)
            {
                Proc.writeToLog(ex);
                templateSucceeded = false;
                createdOutput     = false;
                return(tagHandlerU);
            }
        }
Пример #19
0
        // Token: 0x0600008F RID: 143 RVA: 0x00005AE0 File Offset: 0x00004AE0
        private string processNode(XmlNode node, SubQuery query, Request request, Result result, User user)
        {
            if (request.StartedOn.AddMilliseconds(request.bot.TimeOut) < DateTime.Now)
            {
                request.bot.writeToLog(string.Concat(new string[]
                {
                    "WARNING! Request timeout. User: "******" raw input: \"",
                    request.rawInput,
                    "\" processing template: \"",
                    query.Template,
                    "\""
                }));
                request.hasTimedOut = true;
                return(string.Empty);
            }
            string text = node.Name.ToLower();

            if (text == "template")
            {
                StringBuilder stringBuilder = new StringBuilder();
                if (node.HasChildNodes)
                {
                    foreach (object obj in node.ChildNodes)
                    {
                        XmlNode node2 = (XmlNode)obj;
                        stringBuilder.Append(this.processNode(node2, query, request, result, user));
                    }
                }
                return(stringBuilder.ToString());
            }
            AIMLTagHandler aimltagHandler = null;

            aimltagHandler = this.getBespokeTags(user, query, request, result, node);
            if (object.Equals(null, aimltagHandler))
            {
                string key;
                switch (key = text)
                {
                case "bot":
                    aimltagHandler = new bot(this, user, query, request, result, node);
                    goto IL_53F;

                case "condition":
                    aimltagHandler = new condition(this, user, query, request, result, node);
                    goto IL_53F;

                case "date":
                    aimltagHandler = new date(this, user, query, request, result, node);
                    goto IL_53F;

                case "formal":
                    aimltagHandler = new formal(this, user, query, request, result, node);
                    goto IL_53F;

                case "gender":
                    aimltagHandler = new gender(this, user, query, request, result, node);
                    goto IL_53F;

                case "get":
                    aimltagHandler = new get(this, user, query, request, result, node);
                    goto IL_53F;

                case "gossip":
                    aimltagHandler = new gossip(this, user, query, request, result, node);
                    goto IL_53F;

                case "id":
                    aimltagHandler = new id(this, user, query, request, result, node);
                    goto IL_53F;

                case "input":
                    aimltagHandler = new input(this, user, query, request, result, node);
                    goto IL_53F;

                case "javascript":
                    aimltagHandler = new javascript(this, user, query, request, result, node);
                    goto IL_53F;

                case "learn":
                    aimltagHandler = new learn(this, user, query, request, result, node);
                    goto IL_53F;

                case "lowercase":
                    aimltagHandler = new lowercase(this, user, query, request, result, node);
                    goto IL_53F;

                case "person":
                    aimltagHandler = new person(this, user, query, request, result, node);
                    goto IL_53F;

                case "person2":
                    aimltagHandler = new person2(this, user, query, request, result, node);
                    goto IL_53F;

                case "random":
                    aimltagHandler = new random(this, user, query, request, result, node);
                    goto IL_53F;

                case "sentence":
                    aimltagHandler = new sentence(this, user, query, request, result, node);
                    goto IL_53F;

                case "set":
                    aimltagHandler = new set(this, user, query, request, result, node);
                    goto IL_53F;

                case "size":
                    aimltagHandler = new size(this, user, query, request, result, node);
                    goto IL_53F;

                case "sr":
                    aimltagHandler = new sr(this, user, query, request, result, node);
                    goto IL_53F;

                case "srai":
                    aimltagHandler = new srai(this, user, query, request, result, node);
                    goto IL_53F;

                case "star":
                    aimltagHandler = new star(this, user, query, request, result, node);
                    goto IL_53F;

                case "system":
                    aimltagHandler = new system(this, user, query, request, result, node);
                    goto IL_53F;

                case "that":
                    aimltagHandler = new that(this, user, query, request, result, node);
                    goto IL_53F;

                case "thatstar":
                    aimltagHandler = new thatstar(this, user, query, request, result, node);
                    goto IL_53F;

                case "think":
                    aimltagHandler = new think(this, user, query, request, result, node);
                    goto IL_53F;

                case "topicstar":
                    aimltagHandler = new topicstar(this, user, query, request, result, node);
                    goto IL_53F;

                case "uppercase":
                    aimltagHandler = new uppercase(this, user, query, request, result, node);
                    goto IL_53F;

                case "version":
                    aimltagHandler = new version(this, user, query, request, result, node);
                    goto IL_53F;
                }
                aimltagHandler = null;
            }
IL_53F:
            if (object.Equals(null, aimltagHandler))
            {
                return(node.InnerText);
            }
            if (aimltagHandler.isRecursive)
            {
                if (node.HasChildNodes)
                {
                    foreach (object obj2 in node.ChildNodes)
                    {
                        XmlNode xmlNode = (XmlNode)obj2;
                        if (xmlNode.NodeType != XmlNodeType.Text)
                        {
                            xmlNode.InnerXml = this.processNode(xmlNode, query, request, result, user);
                        }
                    }
                }
                return(aimltagHandler.Transform());
            }
            string  str   = aimltagHandler.Transform();
            XmlNode node3 = AIMLTagHandler.getNode("<node>" + str + "</node>");

            if (node3.HasChildNodes)
            {
                StringBuilder stringBuilder2 = new StringBuilder();
                foreach (object obj3 in node3.ChildNodes)
                {
                    XmlNode node4 = (XmlNode)obj3;
                    stringBuilder2.Append(this.processNode(node4, query, request, result, user));
                }
                return(stringBuilder2.ToString());
            }
            return(node3.InnerXml);
        }
        public TagHtml RenderTagToHtml(string tagName, string outerTagContent, string innerTagContent)
        {
            StringBuilder sb       = new StringBuilder();
            string        dataText = "";

            switch (tagName)
            {
            case "button":
                if (outerTagContent.Contains("<postback>"))
                {
                    string dataPostback = new Regex("<postback>(.*)</postback>", RegexOptions.IgnoreCase).Match(outerTagContent).Groups[1].Value;
                    dataText = new Regex("<text>(.*)</text>", RegexOptions.IgnoreCase).Match(outerTagContent).Groups[1].Value;
                    sb.AppendLine(" <div class=\"_2zgz _2zgz_postback\">");
                    sb.AppendLine("      <div class=\"_4bqf _6biq _6bir\" tabindex=\"0\" role=\"button\" data-postback =\"" + dataPostback + "\" style=\"border-color:" + _color + " color:" + _color + "\">" + dataText + "</div>");
                    sb.AppendLine(" </div>");
                    _tagHtml.Body           = "";
                    _tagHtml.ButtonPostback = sb.ToString();
                }
                else if (outerTagContent.Contains("<url>"))
                {
                    dataText = new Regex("<text>(.*)</text>", RegexOptions.IgnoreCase).Match(outerTagContent).Groups[1].Value;
                    string dataUrl = new Regex("<url>(.*)</url>", RegexOptions.IgnoreCase).Match(outerTagContent).Groups[1].Value;
                    sb.AppendLine("<div class=\"_6ir5\">");
                    sb.AppendLine("     <div class=\"_4bqf _6ir3\">");
                    sb.AppendLine("          <a class=\"_6ir4 _6ir4_url\" target=\"_blank\" href=\"" + dataUrl + "\" style=\"color:" + _color + "\">" + dataText + "</a>");
                    sb.AppendLine("     </div>");
                    sb.AppendLine("</div>");

                    _tagHtml.Body = sb.ToString();
                }
                else if (outerTagContent.Contains("<menu>"))
                {
                    dataText = new Regex("<text>(.*)</text>", RegexOptions.IgnoreCase).Match(outerTagContent).Groups[1].Value;
                    string dataMenu = new Regex("<menu>(.*)</menu>", RegexOptions.IgnoreCase).Match(outerTagContent).Groups[1].Value;
                    //if (_isFlag)
                    //{
                    //	sb.AppendLine("<div class=\"_6isd _6ir5\">");
                    //}else
                    //{
                    //	sb.AppendLine("<div class=\"_6ir5\">");
                    //}
                    sb.AppendLine("<div class=\"_6ir5\">");
                    sb.AppendLine("     <div class=\"_4bqf _6ir3\">");
                    sb.AppendLine("          <a class=\"_6ir4 _6ir4_menu\" data-postback =\"" + dataMenu + "\" href=\"#\" style=\"color:" + _color + "\">" + dataText + "</a>");
                    sb.AppendLine("     </div>");
                    sb.AppendLine("</div>");
                    //_isFlag = false;
                    _tagHtml.Body = sb.ToString();
                }
                else if (outerTagContent.Contains("<module>"))
                {
                    dataText = new Regex("<text>(.*)</text>", RegexOptions.IgnoreCase).Match(outerTagContent).Groups[1].Value;
                    string dataModule = new Regex("<module>(.*)</module>", RegexOptions.IgnoreCase).Match(outerTagContent).Groups[1].Value;
                    //if (_isFlag)
                    //{
                    //	sb.AppendLine("<div class=\"_6isd _6ir5\">");
                    //}else
                    //{
                    //	sb.AppendLine("<div class=\"_6ir5\">");
                    //}
                    sb.AppendLine("<div class=\"_6ir5\">");
                    sb.AppendLine("     <div class=\"_4bqf _6ir3\">");
                    sb.AppendLine("          <a class=\"_6ir4 _6ir4_menu\" data-postback =\"" + dataModule + "\" href=\"#\" style=\"color:" + _color + "\">" + dataText + "</a>");
                    sb.AppendLine("     </div>");
                    sb.AppendLine("</div>");
                    //_isFlag = false;
                    _tagHtml.Body = sb.ToString();
                }
                break;

            case "link":
                dataText = new Regex("<text>(.*)</text>", RegexOptions.IgnoreCase).Match(outerTagContent).Groups[1].Value;
                string dataLink = new Regex("<url>(.*)</url>", RegexOptions.IgnoreCase).Match(outerTagContent).Groups[1].Value;
                sb.AppendLine("<div class=\"_6j0y\">");
                sb.AppendLine("    <a target=\"_blank\" href=\"" + dataLink + "\">");
                sb.AppendLine("           " + dataText + "");
                sb.AppendLine("    </a>");
                sb.AppendLine("</div>");
                _tagHtml.Body = sb.ToString();
                break;

            case "image":
                //Common.ReadString("Domain") host domain lay tu`appconfig cua domain cha truyen` vao`
                string dataImage = new Regex("<image>(.*)</image>", RegexOptions.IgnoreCase).Match(outerTagContent).Groups[1].Value;
                sb.AppendLine("<div class=\"_6j0s\" style=\"background-image:url(&quot;" + Common.ReadString("Domain") + dataImage + "&quot;); background-position: center center; height: 150px; width: 100%;\"></div>");
                _tagHtml.Body = sb.ToString();
                break;

            case "title":
                string dataTitle = new Regex("<title>(.*)</title>", RegexOptions.IgnoreCase).Match(outerTagContent).Groups[1].Value;
                sb.AppendLine("<div class=\"_6j0t _4ik4 _4ik5 _6j0t_title\" style=\"-webkit-line-clamp: 3;\">");
                sb.AppendLine("" + dataTitle + "");
                sb.AppendLine("</div>");
                _tagHtml.Body = sb.ToString();

                break;

            case "subtitle":
                string dataSubTitle = new Regex("<subtitle>(.*)</subtitle>", RegexOptions.IgnoreCase).Match(outerTagContent).Groups[1].Value;
                sb.Append("<div class=\"_6j0v _6j0v_subtitle\">");
                sb.AppendLine(" <div class=\"_6j0u _6j0w\">");
                sb.AppendLine("    " + dataSubTitle + "");
                sb.AppendLine(" </div>");
                sb.AppendLine(" <div class=\"_6j0u _6j0x _4ik4 _4ik5\" style=\"-webkit-line-clamp: 2;\">");
                sb.AppendLine("    <div>");
                sb.AppendLine("    " + dataSubTitle + "");
                sb.AppendLine("    </div>");
                sb.AppendLine(" </div>");
                sb.AppendLine(" </div>");
                _tagHtml.Body = sb.ToString();
                break;

            default:
                _tagHtml.Body = String.Empty;
                break;
            }
            if (tagName == "card")
            {
                XmlNode resultNode = AIMLTagHandler.getNode("<node>" + innerTagContent + "</node>");
                if (resultNode.HasChildNodes)
                {
                    StringBuilder sbBtnPostback = new StringBuilder();
                    StringBuilder sbCard        = new StringBuilder();
                    sbCard.AppendLine("<div class=\"_6j2i\">");
                    string htmlCard = "";
                    foreach (XmlNode cNode in resultNode.ChildNodes)
                    {
                        htmlCard = RenderTagToHtml(cNode.Name, cNode.OuterXml, "").Body;
                        if (cNode.Name == "title")
                        {
                            htmlCard = "<div class=\"_6j2g\">" + htmlCard;
                        }
                        if (cNode.Name == "link")
                        {
                            htmlCard = htmlCard + "</div>";
                        }
                        if (cNode.Name == "button")
                        {
                            if (cNode.OuterXml.Contains("<postback>"))
                            {
                                _tagHtml.TotalBtnPostback = _tagHtml.TotalBtnPostback + 1;
                            }
                        }
                        sbCard.AppendLine(htmlCard);
                        sbBtnPostback.AppendLine(RenderTagToHtml(cNode.Name, cNode.OuterXml, "").ButtonPostback);
                    }

                    sbCard.AppendLine("</div>");
                    _tagHtml.Body           = sbCard.ToString();
                    _tagHtml.ButtonPostback = sbBtnPostback.ToString();
                }
            }
            if (tagName == "carousel")
            {
                XmlNode       resultNode = AIMLTagHandler.getNode("<node>" + innerTagContent + "</node>");
                StringBuilder sbCarousel = new StringBuilder();
                if (resultNode.HasChildNodes)
                {
                    foreach (XmlNode cNode in resultNode.ChildNodes)
                    {
                        sbCarousel.AppendLine("<div class=\"_2zgz\"> <div class=\"_6j2h\">" + RenderTagToHtml(cNode.Name, cNode.OuterXml, cNode.InnerXml).Body + "</div></div>");
                        _tagHtml.TotalCarousel = _tagHtml.TotalCarousel + 1;
                    }
                    _tagHtml.Body = sbCarousel.ToString();
                }
            }
            return(_tagHtml);
        }
        /// <summary>
        /// Recursively evaluates the template nodes returned from the Proccessor
        /// </summary>
        /// <param name="node">the node to evaluate</param>
        /// <param name="query">the query that produced targetBot node</param>
        /// <param name="request">the request from the user</param>
        /// <param name="result">the result to be sent to the user</param>
        /// <param name="user">the user who originated the request</param>
        /// <returns>the output Unifiable</returns>
        public string processNodeVV(XmlNode node, SubQuery query,
                                    Request request, Result result, User user,
                                    AIMLTagHandler parentHandlerU, bool protectChild, bool copyParent,
                                    AIMLTagHandler tagHandlerU, out bool childSuccess)
        {
            AltBot TargetBot = tagHandlerU.bot;

            if (request != null)
            {
                TargetBot = request.TargetBot;
            }
            childSuccess = true;
            if (node == null)
            {
                string whyError = "ERROR null NODE " + tagHandlerU;
                writeToLog(whyError);
                throw new ChatSignalOverBudget(request, whyError);
            }
            if (node.NodeType == XmlNodeType.Text)
            {
                childSuccess = true;
                if (tagHandlerU != null)
                {
                    tagHandlerU.QueryHasSuceeded = true;
                }
                string s = StaticAIMLUtils.Trim(StaticAIMLUtils.TextNodeValue(node));
                if (!String.IsNullOrEmpty(s))
                {
                    return(StaticAIMLUtils.ValueText(s));
                }
                //return s;
            }
            if (tagHandlerU == null)
            {
                string whyError = "ERROR null THND " + node;
                childSuccess = false;
                writeToLog(whyError);
            }
            bool isTraced = (request != null && (request.IsTraced || !request.GraphsAcceptingUserInput)) ||
                            (query != null && query.IsTraced);

            // check for timeout (to avoid infinite loops)
            bool overBudget = false;

            if (request != null && request.IsComplete(result))
            {
                object gn = request.Graph;
                if (query != null)
                {
                    gn = query.Graph;
                }
                string s = StaticAIMLUtils.SafeFormat("WARNING! Request " + request.WhyComplete +
                                                      ". User: {0} raw input: {3} \"{1}\" processing {2} templates: \"{4}\"",
                                                      request.Requester.UserID, Unifiable.DescribeUnifiable(request.rawInput),
                                                      (query == null ? "-NOQUERY-" : query.Templates.Count.ToString()), gn, node);
                if (isTraced)
                {
                    request.writeToLog(s);
                }
                overBudget = true;
                if (!request.IsToplevelRequest)
                {
                    throw new ChatSignalOverBudget(request, s);
                }
            }


            // process the node
            if (ReferenceEquals(null, tagHandlerU))
            {
                childSuccess = true;
                if (node.NodeType == XmlNodeType.Comment)
                {
                    return(Unifiable.Empty);
                }
                if (node.NodeType == XmlNodeType.Text)
                {
                    string s = StaticAIMLUtils.Trim(StaticAIMLUtils.TextNodeValue(node));
                    if (String.IsNullOrEmpty(s))
                    {
                        return(Unifiable.Empty);
                    }
                    return(s);
                }
                // ReSharper disable ConditionIsAlwaysTrueOrFalse
                OutputDelegate del = (request != null) ? request.writeToLog : writeToLog;
                // ReSharper restore ConditionIsAlwaysTrueOrFalse
                if (overBudget)
                {
                    return(Unifiable.Empty);
                }
                string nodeInner = node.InnerXml;
                TargetBot.EvalAiml(node, request, del ?? TextPatternUtils.DEVNULL);
                return(node.InnerXml);
            }

            XmlNode oldNode         = node;
            bool    wasReadonlyNode = oldNode.IsReadOnly;

            // copy the node!?!
            if (protectChild)
            {
                copyParent = true;
                LineInfoElementImpl newnode = StaticAIMLUtils.CopyNode(node, copyParent);
                newnode.ReadOnly = false;
                node             = newnode;
            }

            if (overBudget)
            {
                tagHandlerU.Dispose();
                tagHandlerU  = null;
                childSuccess = true;
                return(Unifiable.Empty);
            }

            tagHandlerU.SetParent(parentHandlerU);
            //if (parent!=null) parent.AddChild(tagHandler);

            Unifiable cp = tagHandlerU.Transform();

            if (Unifiable.IsNullOrEmpty(cp) && (!tagHandlerU.QueryHasSuceeded || tagHandlerU.QueryHasFailed))
            {
                bool needsOneMoreTry = !request.SuspendSearchLimits &&
                                       (request.IsToplevelRequest /*|| result.ParentRequest.IsToplevelRequest*/);
                if (isTraced || needsOneMoreTry)
                {
                    //writeDebugLine("ERROR: Try Again since NULL " + tagHandler);
                    bool wsl = request.SuspendSearchLimits;
                    try
                    {
                        request.SuspendSearchLimits = true;
                        cp = tagHandlerU.Transform();
                        if (Unifiable.IsNull(cp))
                        {
                            childSuccess = false;
                            return(tagHandlerU.GetTemplateNodeInnerText());
                        }
                        if (false && Unifiable.IsNullOrEmpty(cp))
                        {
                            // trace the next line to see why
                            AIMLTagHandler handlerU = tagHandlerU;
                            TargetBot.TraceTest("ERROR: Try Again since NULL " + handlerU,
                                                () => { cp = handlerU.Transform(); });
                        }
                    }
                    finally
                    {
                        request.SuspendSearchLimits = wsl;
                    }
                }
            }
            if (tagHandlerU.QueryHasFailed)
            {
                childSuccess = false;
                return(tagHandlerU.FAIL);
            }
            childSuccess = !tagHandlerU.QueryHasFailed;
            if (!childSuccess)
            {
            }
            var st  = StaticAIMLUtils.IsSilentTag(node);
            var ine = Unifiable.IsNullOrEmpty(cp);

            if (!ine || st)
            {
                childSuccess = true;
                return(cp);
            }
            if (Unifiable.IsNull(cp))
            {
                cp = tagHandlerU.GetTemplateNodeInnerText();
                if (tagHandlerU.QueryHasSuceeded)
                {
                    childSuccess = true;
                    return(cp);
                }
                return(cp);
            }
            return(cp);
        }
Пример #22
0
        /// <summary>
        /// Recursively evaluates the template nodes returned from the bot
        /// </summary>
        /// <param name="node">the node to evaluate</param>
        /// <param name="query">the query that produced this node</param>
        /// <param name="request">the request from the user</param>
        /// <param name="result">the result to be sent to the user</param>
        /// <param name="user">the user who originated the request</param>
        /// <returns>the output string</returns>
        private string ProcessNode(XmlNode node, SubQuery query, Request request, Result result, User user)
        {
            // check for timeout (to avoid infinite loops)
            if (request.StartedOn.AddMilliseconds(_config.TimeOut) < DateTime.Now)
            {
                //_logger.LogWarning("Request timeout. User: "******" raw input: \"" + request.rawInput + "\" processing template: \""+query.Template+"\"");
                request.HasTimedOut = true;
                return(string.Empty);
            }

            // process the node
            string tagName = node.Name.ToLower();

            if (tagName == "template")
            {
                StringBuilder templateResult = new StringBuilder();
                if (node.HasChildNodes)
                {
                    // recursively check
                    foreach (XmlNode childNode in node.ChildNodes)
                    {
                        templateResult.Append(ProcessNode(childNode, query, request, result, user));
                    }
                }
                return(templateResult.ToString());
            }
            else
            {
                AIMLTagHandler tagHandler = _tagFactory.CreateTagHandler(tagName, this, user, query, request, result, node);
                if (object.Equals(null, tagHandler))
                {
                    return(node.InnerText);
                }
                else
                {
                    if (tagHandler.isRecursive)
                    {
                        if (node.HasChildNodes)
                        {
                            // recursively check
                            foreach (XmlNode childNode in node.ChildNodes)
                            {
                                if (childNode.NodeType != XmlNodeType.Text)
                                {
                                    childNode.InnerXml = ProcessNode(childNode, query, request, result, user);
                                }
                            }
                        }
                        return(tagHandler.Transform());
                    }
                    else
                    {
                        string  resultNodeInnerXML = tagHandler.Transform();
                        XmlNode resultNode         = AIMLTagHandler.GetNode("<node>" + resultNodeInnerXML + "</node>");
                        if (resultNode.HasChildNodes)
                        {
                            StringBuilder recursiveResult = new StringBuilder();
                            // recursively check
                            foreach (XmlNode childNode in resultNode.ChildNodes)
                            {
                                recursiveResult.Append(ProcessNode(childNode, query, request, result, user));
                            }
                            return(recursiveResult.ToString());
                        }
                        else
                        {
                            return(resultNode.InnerXml);
                        }
                    }
                }
            }
        }
Пример #23
0
        /// <summary>
        /// Given a request containing user input, produces a result from the bot
        /// </summary>
        /// <param name="request">the request from the user</param>
        /// <returns>the result to be output to the user</returns>
        public Result Chat(Request request)
        {
            Result result = new Result(request);

            if (_config.isAcceptingUserInput)
            {
                // Normalize the input
                ReniBot.AimlEngine.Normalize.SplitIntoSentences splitter = new ReniBot.AimlEngine.Normalize.SplitIntoSentences(_config);
                string[] rawSentences = splitter.Transform(request.RawInput);
                foreach (string sentence in rawSentences)
                {
                    result.InputSentences.Add(sentence);
                    string topic      = _botUserService.GetTopic(request.UserId);
                    string lastOutput = _userResultService.GetLastOutput(request.UserId);
                    string path       = _loader.GeneratePath(sentence, lastOutput, topic, true);
                    result.NormalizedPaths.Add(path);
                }

                // grab the templates for the various sentences from the graphmaster
                foreach (string path in result.NormalizedPaths)
                {
                    Utils.SubQuery query = new SubQuery(path);
                    query.Template     = _graphmaster.Evaluate(path, query, request, MatchState.UserInput, new StringBuilder(), _config.TimeOut);
                    result.HasTimedOut = request.HasTimedOut;
                    result.SubQueries.Add(query);
                }

                // process the templates into appropriate output
                foreach (SubQuery query in result.SubQueries)
                {
                    if (query.Template.Length > 0)
                    {
                        try
                        {
                            XmlNode templateNode   = AIMLTagHandler.GetNode(query.Template);
                            string  outputSentence = ProcessNode(templateNode, query, request, result, new User(_predicateService, _userResultService, _requestService)
                            {
                                UserId = request.UserId
                            });
                            if (outputSentence.Length > 0)
                            {
                                result.OutputSentences.Add(outputSentence);
                            }
                        }
                        catch (Exception e)
                        {
                            if (_config.WillCallHome)
                            {
                                PhoneHome(e.Message, request);
                            }
                            _logger.LogWarning("A problem was encountered when trying to process the input: " + request.RawInput + " with the template: \"" + query.Template + "\"");
                        }
                    }
                }
            }
            else
            {
                result.OutputSentences.Add(_config.NotAcceptingUserInputMessage);
            }

            // populate the Result object
            result.Duration = DateTime.Now - request.StartedOn;
            _userResultService.Add(result.Duration.Milliseconds, result.HasTimedOut, result.RawOutput, result.RequestId, result.UserId);

            return(result);
        }
Пример #24
0
        /// <summary>
        /// Recursively evaluates the template nodes returned from the bot
        /// </summary>
        /// <param name="node">the node to evaluate</param>
        /// <param name="request">the request from the user</param>
        /// <param name="result">the result to be sent to the user</param>
        /// <param name="user">the user who originated the request</param>
        /// <returns>the output string</returns>
        private string ProcessNode(XmlNode node, Request request, Result result, User user)
        {
            StringBuilder newInnerText = new StringBuilder();

            if (node.HasChildNodes)
            {
                // recursively check
                foreach (XmlNode childNode in node.ChildNodes)
                {
                    childNode.InnerText = this.ProcessNode(childNode, request, result, user);
                }
            }

            // process the node itself
            AIMLTagHandler tagHandler = null;

            switch (node.Name.ToLower())
            {
            case "bot":
                tagHandler = new BotTag(this, user, request, result, node);
                break;

            case "condition":
                tagHandler = new ConditionTag(this, user, request, result, node);
                break;

            case "date":
                tagHandler = new DateTag(this, user, request, result, node);
                break;

            case "formal":
                tagHandler = new FormalTag(this, user, request, result, node);
                break;

            case "gender":
                tagHandler = new GenderTag(this, user, request, result, node);
                break;

            case "get":
                tagHandler = new GetTag(this, user, request, result, node);
                break;

            case "gossip":
                tagHandler = new GossipTag(this, user, request, result, node);
                break;

            case "id":
                tagHandler = new IdTag(this, user, request, result, node);
                break;

            case "input":
                tagHandler = new InputTag(this, user, request, result, node);
                break;

            case "javascript":
                tagHandler = new JavascriptTag(this, user, request, result, node);
                break;

            case "learn":
                tagHandler = new LearnTag(this, user, request, result, node);
                break;

            case "lowercase":
                tagHandler = new LowercaseTag(this, user, request, result, node);
                break;

            case "person":
                tagHandler = new PersonTag(this, user, request, result, node);
                break;

            case "person2":
                tagHandler = new Person2Tag(this, user, request, result, node);
                break;

            case "random":
                tagHandler = new RandomTag(this, user, request, result, node);
                break;

            case "sentence":
                tagHandler = new SentenceTag(this, user, request, result, node);
                break;

            case "set":
                tagHandler = new SetTag(this, user, request, result, node);
                break;

            case "size":
                tagHandler = new SizeTag(this, user, request, result, node);
                break;

            case "sr":
                tagHandler = new SrTag(this, user, request, result, node);
                break;

            case "srai":
                tagHandler = new SraiTag(this, user, request, result, node);
                break;

            case "star":
                tagHandler = new StarTag(this, user, request, result, node);
                break;

            case "system":
                tagHandler = new SystemTag(this, user, request, result, node);
                break;

            case "that":
                tagHandler = new ThatTag(this, user, request, result, node);
                break;

            case "thatstar":
                tagHandler = new ThatStarTag(this, user, request, result, node);
                break;

            case "think":
                tagHandler = new ThinkTag(this, user, request, result, node);
                break;

            case "topicstar":
                tagHandler = new TopicStarTag(this, user, request, result, node);
                break;

            case "uppercase":
                tagHandler = new UppercaseTag(this, user, request, result, node);
                break;

            case "version":
                tagHandler = new VersionTag(this, user, request, result, node);
                break;

            default:
                tagHandler = this.GetBespokeTags(user, request, result, node);
                break;
            }
            if (object.Equals(null, tagHandler))
            {
                return(node.InnerText);
            }
            else
            {
                return(tagHandler.Transform());
            }
        }
Пример #25
0
        /// <summary>
        /// Recursively evaluates the template nodes returned from the bot
        /// </summary>
        /// <param name="node">the node to evaluate</param>
        /// <param name="query">the query that produced this node</param>
        /// <param name="request">the request from the user</param>
        /// <param name="result">the result to be sent to the user</param>
        /// <param name="user">the user who originated the request</param>
        /// <returns>the output string</returns>
        private string ProcessNode(XmlNode node, SubQuery query, Request request, Result result, User user)
        {
            // check for timeout (to avoid infinite loops)
            if (request.StartedOn.AddMilliseconds(request.Bot.TimeOut) < DateTime.Now)
            {
                request.Bot.WriteToLog("WARNING! Request timeout. User: "******" raw input: \"" + request.RawInput + "\" processing template: \"" + query.Template + "\"");
                request.HasTimedOut = true;
                return(string.Empty);
            }

            // process the node
            string tagName = node.Name.ToLower();

            if (tagName == "template")
            {
                StringBuilder templateResult = new StringBuilder();
                if (node.HasChildNodes)
                {
                    // recursively check
                    foreach (XmlNode childNode in node.ChildNodes)
                    {
                        templateResult.Append(ProcessNode(childNode, query, request, result, user));
                    }
                }
                return(templateResult.ToString());
            }
            else
            {
                AIMLTagHandler tagHandler = null;
                tagHandler = getBespokeTags(user, query, request, result, node);
                if (Equals(null, tagHandler))
                {
                    switch (tagName)
                    {
                    case "bot":
                        tagHandler = new AIMLTagHandlers.Bot(this, user, query, request, result, node);
                        break;

                    case "condition":
                        tagHandler = new AIMLTagHandlers.Condition(this, user, query, request, result, node);
                        break;

                    case "date":
                        tagHandler = new AIMLTagHandlers.Date(this, user, query, request, result, node);
                        break;

                    case "formal":
                        tagHandler = new AIMLTagHandlers.Formal(this, user, query, request, result, node);
                        break;

                    case "gender":
                        tagHandler = new AIMLTagHandlers.Gender(this, user, query, request, result, node);
                        break;

                    case "get":
                        tagHandler = new AIMLTagHandlers.Get(this, user, query, request, result, node);
                        break;

                    case "gossip":
                        tagHandler = new AIMLTagHandlers.Gossip(this, user, query, request, result, node);
                        break;

                    case "id":
                        tagHandler = new AIMLTagHandlers.Id(this, user, query, request, result, node);
                        break;

                    case "input":
                        tagHandler = new AIMLTagHandlers.Input(this, user, query, request, result, node);
                        break;

                    case "javascript":
                        tagHandler = new AIMLTagHandlers.Javascript(this, user, query, request, result, node);
                        break;

                    case "learn":
                        tagHandler = new AIMLTagHandlers.Learn(this, user, query, request, result, node);
                        break;

                    case "lowercase":
                        tagHandler = new AIMLTagHandlers.Lowercase(this, user, query, request, result, node);
                        break;

                    case "person":
                        tagHandler = new AIMLTagHandlers.Person(this, user, query, request, result, node);
                        break;

                    case "person2":
                        tagHandler = new AIMLTagHandlers.Person2(this, user, query, request, result, node);
                        break;

                    case "random":
                        tagHandler = new AIMLTagHandlers.Random(this, user, query, request, result, node);
                        break;

                    case "sentence":
                        tagHandler = new AIMLTagHandlers.Sentence(this, user, query, request, result, node);
                        break;

                    case "set":
                        tagHandler = new AIMLTagHandlers.Set(this, user, query, request, result, node);
                        break;

                    case "size":
                        tagHandler = new AIMLTagHandlers.Size(this, user, query, request, result, node);
                        break;

                    case "sr":
                        tagHandler = new AIMLTagHandlers.Sr(this, user, query, request, result, node);
                        break;

                    case "srai":
                        tagHandler = new AIMLTagHandlers.Srai(this, user, query, request, result, node);
                        break;

                    case "star":
                        tagHandler = new AIMLTagHandlers.Star(this, user, query, request, result, node);
                        break;

                    case "system":
                        tagHandler = new AIMLTagHandlers.System(this, user, query, request, result, node);
                        break;

                    case "that":
                        tagHandler = new AIMLTagHandlers.That(this, user, query, request, result, node);
                        break;

                    case "thatstar":
                        tagHandler = new AIMLTagHandlers.ThatStar(this, user, query, request, result, node);
                        break;

                    case "think":
                        tagHandler = new AIMLTagHandlers.Think(this, user, query, request, result, node);
                        break;

                    case "topicstar":
                        tagHandler = new AIMLTagHandlers.TopicStar(this, user, query, request, result, node);
                        break;

                    case "uppercase":
                        tagHandler = new AIMLTagHandlers.Uppercase(this, user, query, request, result, node);
                        break;

                    case "version":
                        tagHandler = new AIMLTagHandlers.Version(this, user, query, request, result, node);
                        break;

                    default:
                        tagHandler = null;
                        break;
                    }
                }
                if (Equals(null, tagHandler))
                {
                    return(node.InnerText);
                }
                else
                {
                    if (tagHandler.IsRecursive)
                    {
                        if (node.HasChildNodes)
                        {
                            // recursively check
                            foreach (XmlNode childNode in node.ChildNodes)
                            {
                                if (childNode.NodeType != XmlNodeType.Text)
                                {
                                    childNode.InnerXml = ProcessNode(childNode, query, request, result, user);
                                }
                            }
                        }
                        return(tagHandler.Transform());
                    }
                    else
                    {
                        string  resultNodeInnerXML = tagHandler.Transform();
                        XmlNode resultNode         = AIMLTagHandler.GetNode("<node>" + resultNodeInnerXML + "</node>");
                        if (resultNode.HasChildNodes)
                        {
                            StringBuilder recursiveResult = new StringBuilder();
                            // recursively check
                            foreach (XmlNode childNode in resultNode.ChildNodes)
                            {
                                recursiveResult.Append(ProcessNode(childNode, query, request, result, user));
                            }
                            return(recursiveResult.ToString());
                        }
                        else
                        {
                            return(resultNode.InnerXml);
                        }
                    }
                }
            }
        }
        internal AIMLTagHandler GetTagHandlerU(User user, SubQuery query, Request request, Result result, XmlNode node, bool liText)
        {
            AIMLTagHandler tagHandlerU   = getBespokeTags(user, query, request, result, node);
            string         nodeNameLower = StaticAIMLUtils.ToLower(node.LocalName);
            AltBot         targetBot     = query.TargetBot;

            if (Equals(null, tagHandlerU))
            {
                switch (nodeNameLower)
                {
                case "template":
                case "answer":     //CML
                    tagHandlerU = new template(targetBot, user, query, request, result, node);
                    break;

                case "aiml":
                case "cml":     //CML
                    tagHandlerU = new aiml(targetBot, user, query, request, result, node);
                    break;

                case "aimlexec":
                case "eval":
                    tagHandlerU = new aimlexec(targetBot, user, query, request, result, node);
                    break;

                case "vars":
                case "root":
                case "predicates":     //CML
                    tagHandlerU = new root(targetBot, user, query, request, result, node, (() => query.TargetSettings));
                    break;

                case "properties":
                case "bots":
                    tagHandlerU = new root(targetBot, user, query, request, result, node,
                                           (() => request.TargetBot.GlobalSettings));
                    break;

                case "substitutions":
                    tagHandlerU = new root(targetBot, user, query, request, result, node,
                                           (() => request.TargetBot.InputSubstitutions));
                    break;

                case "topic":
                case "conversation":     //CML
                    tagHandlerU = new topic(targetBot, user, query, request, result, node);
                    break;

                case "category":
                case "conv":     //CML
                    tagHandlerU = new category(targetBot, user, query, request, result, node);
                    break;

                case "and":
                    tagHandlerU = new and(targetBot, user, query, request, result, node);
                    break;

                case "or":
                    tagHandlerU = new or(targetBot, user, query, request, result, node);
                    break;

                case "optional":
                    tagHandlerU = new optional(targetBot, user, query, request, result, node);
                    break;

                case "isa":
                    tagHandlerU = new isa(targetBot, user, query, request, result, node);
                    break;

                case "bot":
                    tagHandlerU = new bot(targetBot, user, query, request, result, node);
                    break;

                case "condition":
                case "options":     //cml
                    tagHandlerU = new condition_aima(targetBot, user, query, request, result, node);
                    break;

                case "li":
                    if (liText)
                    {
                        tagHandlerU = new liif(targetBot, user, query, request, result, node);
                    }
                    break;

                case "if":
                    tagHandlerU = new liif(targetBot, user, query, request, result, node);
                    break;

                case "personf":
                    tagHandlerU = new format(targetBot, user, query, request, result, node,
                                             new Func <string, string>(HttpUtility.UrlEncode),
                                             null);
                    break;

                case "date":
                    tagHandlerU = new date(targetBot, user, query, request, result, node);
                    break;

                case "formal":
                    tagHandlerU = new formal(targetBot, user, query, request, result, node);
                    break;

                case "gender":
                    tagHandlerU = new gender(targetBot, user, query, request, result, node);
                    break;

                case "get":
                    tagHandlerU = new get(targetBot, user, query, request, result, node);
                    break;

                case "gossip":
                    tagHandlerU = new gossip(targetBot, user, query, request, result, node);
                    break;

                case "get_ip":
                case "id":
                    tagHandlerU = new id(targetBot, user, query, request, result, node);
                    break;

                case "inputreq":
                    tagHandlerU = new inputreq(targetBot, user, query, request, result, node);
                    break;

                case "request":
                    tagHandlerU = new input(targetBot, user, query, request, result, node, 1);
                    break;

                case "input":
                    tagHandlerU = new input(targetBot, user, query, request, result, node, 1);
                    break;

                case "justthat":     // <input index="2"/>
                    tagHandlerU = new input(targetBot, user, query, request, result, node, 2);
                    break;

                case "beforethat":     // <input index="3"/>
                    tagHandlerU = new input(targetBot, user, query, request, result, node, 3);
                    break;

#if !(__MonoCS__)
                case "javascript":
                    tagHandlerU = new javascript(targetBot, user, query, request, result, node);
                    break;
#endif
                case "learn":
                case "load":
                case "noload":     // the commented version of <load>
                    tagHandlerU = new learn(targetBot, user, query, request, result, node);
                    break;

                case "lowercase":
                    tagHandlerU = new lowercase(targetBot, user, query, request, result, node);
                    break;

                case "person":
                    tagHandlerU = new substitute(targetBot, user, query, request, result, node);
                    break;

                case "person2":
                    tagHandlerU = new substitute(targetBot, user, query, request, result, node);
                    break;

                case "random":
                    tagHandlerU = new random(targetBot, user, query, request, result, node);
                    break;

                case "sentence":
                    tagHandlerU = new sentence(targetBot, user, query, request, result, node);
                    break;

                case "set":
                    tagHandlerU = new set(targetBot, user, query, request, result, node);
                    break;

                case "size":
                case "getsize":
                    tagHandlerU = new size(targetBot, user, query, request, result, node);
                    break;

                case "sr":
                    tagHandlerU = new sr(targetBot, user, query, request, result, node);
                    break;

                case "srai_odd":
                    tagHandlerU = new srai_odd(targetBot, user, query, request, result, node);
                    break;

                case "star":
                    tagHandlerU = new star(targetBot, user, query, request, result, node);
                    break;

                case "system":
                    tagHandlerU = new system(targetBot, user, query, request, result, node);
                    break;

                case "that":     //default <that index="1,1"/>
                    tagHandlerU = new that(targetBot, user, query, request, result, node, 1);
                    break;

                case "justbeforethat":     //treated as <that index="2,1"/>
                    tagHandlerU = new that(targetBot, user, query, request, result, node, 2);
                    break;

                case "response":     //treated as <that index="1,1"/>
                    tagHandlerU = new that(targetBot, user, query, request, result, node, 2);
                    break;

                case "thatstar":
                    tagHandlerU = new thatstar(targetBot, user, query, request, result, node);
                    break;

                case "think":
                    tagHandlerU = new think(targetBot, user, query, request, result, node);
                    break;

                case "topicstar":
                    tagHandlerU = new topicstar(targetBot, user, query, request, result, node);
                    break;

                case "uppercase":
                    tagHandlerU = new uppercase(targetBot, user, query, request, result, node);
                    break;

                case "version":
                case "getversion":
                    tagHandlerU = new version(targetBot, user, query, request, result, node);
                    break;

                case "cycsystem":
                    tagHandlerU = new cycsystem(targetBot, user, query, request, result, node);
                    break;

                case "cycretract":
                    tagHandlerU = new cycretract(targetBot, user, query, request, result, node);
                    break;

                case "cycassert":
                    tagHandlerU = new cycassert(targetBot, user, query, request, result, node);
                    break;

                case "cycterm":
                    tagHandlerU = new cycterm(targetBot, user, query, request, result, node);
                    break;

                case "cycquery":
                    tagHandlerU = new cycquery(targetBot, user, query, request, result, node);
                    break;

                case "cyccondition":
                    tagHandlerU = new cyccondition(targetBot, user, query, request, result, node);
                    break;

                case "cycphrase":
                    tagHandlerU = new cycphrase(targetBot, user, query, request, result, node);
                    break;

                case "cycparaphrase":
                    tagHandlerU = new cycphrase(targetBot, user, query, request, result, node);
                    break;

                case "guard":
                    tagHandlerU = new guard(targetBot, user, query, request, result, node);
                    break;

                case "guardstar":
                    tagHandlerU = new guardstar(targetBot, user, query, request, result, node);
                    break;

                case "cycrandom":
                    tagHandlerU = new cycrandom(targetBot, user, query, request, result, node);
                    break;

                case "tscore":
                    tagHandlerU = new tscore(targetBot, user, query, request, result, node);
                    break;

                case "space":
                    tagHandlerU = new space(targetBot, user, query, request, result, node);
                    break;

                case "markov":
                    tagHandlerU = new markov(targetBot, user, query, request, result, node);
                    break;

                case "soundcode":
                    tagHandlerU = new soundcode(targetBot, user, query, request, result, node);
                    break;

                // MSM
                case "msm":
                    tagHandlerU = new msm(targetBot, user, query, request, result, node);
                    break;

                case "processmsm":
                    tagHandlerU = new process_msm(targetBot, user, query, request, result, node);
                    break;

                case "setstate":
                    tagHandlerU = new setstate(targetBot, user, query, request, result, node);
                    break;

                case "state":
                    tagHandlerU = new state(targetBot, user, query, request, result, node);
                    break;

                case "transition":
                    tagHandlerU = new transition(targetBot, user, query, request, result, node);
                    break;

                case "setevidence":
                    tagHandlerU = new setevidence(targetBot, user, query, request, result, node);
                    break;

                case "evidenceassoc":
                    tagHandlerU = new evidence_assoc(targetBot, user, query, request, result, node);
                    break;

                case "evidencepattern":
                    tagHandlerU = new evidence_pattern(targetBot, user, query, request, result, node);
                    break;

                case "evidencestate":
                    tagHandlerU = new evidencestate(targetBot, user, query, request, result, node);
                    break;

                case "dependentmachine":
                    tagHandlerU = new dependentmachine(targetBot, user, query, request, result, node);
                    break;

                case "responsetopic":
                    tagHandlerU = new response_topic(targetBot, user, query, request, result, node);
                    break;

                case "push":
                    tagHandlerU = new push(targetBot, user, query, request, result, node);
                    break;

                case "pop":
                    tagHandlerU = new pop(targetBot, user, query, request, result, node);
                    break;

                case "peekstack":
                    tagHandlerU = new peekstack(targetBot, user, query, request, result, node);
                    break;

                case "lex":
                    tagHandlerU = new lex(targetBot, user, query, request, result, node);
                    break;

                case "lexset":
                    tagHandlerU = new lexset(targetBot, user, query, request, result, node);
                    break;

                case "lexis":
                    tagHandlerU = new lexis(targetBot, user, query, request, result, node);
                    break;

                case "dbpush":
                    tagHandlerU = new dbpush(targetBot, user, query, request, result, node);
                    break;

                case "dbquery":
                    tagHandlerU = new dbquery(targetBot, user, query, request, result, node);
                    break;

                case "dbupdate":
                    tagHandlerU = new dbupdate(targetBot, user, query, request, result, node);
                    break;

                case "dbdelete":
                    tagHandlerU = new dbdelete(targetBot, user, query, request, result, node);
                    break;

                case "dbload":
                    tagHandlerU = new dbload(targetBot, user, query, request, result, node);
                    break;


                case "regex":
                    tagHandlerU = new regex(targetBot, user, query, request, result, node);
                    break;

                case "bind":     // <bind>#$isa</bind>
                    tagHandlerU = new bind(targetBot, user, query, request, result, node);
                    break;

                case "#text":
                    if (!liText)
                    {
                        return(null);
                    }
                    return(new verbatum(node.Value, targetBot, user, query, request, result, node));

                case "#comment":
                    return(new verbatum(node.OuterXml, targetBot, user, query, request, result, node));

                case "br":
                    return(new verbatum("\n", targetBot, user, query, request, result, node));

                case "pre":
                    return(new verbatum(StaticXMLUtils.InnerXmlText(node), targetBot, user, query, request, result, node));

                case "p":
                    return(new verbatum("\n\n", targetBot, user, query, request, result, node));

                case "meta":
                    return(new verbatum(node.OuterXml, targetBot, user, query, request, result, node));

                default:
                    break;
                }
            }
            if (tagHandlerU != null)
            {
                return(tagHandlerU);
            }
            if (StaticAIMLUtils.IsHtmlTag(node.Name))
            {
                return(new recursiveVerbatum(node, targetBot, user, query, request, result, node, true));
            }
            if (tagHandlerU == null)
            {
                // "bot", "favorite", "fav"
                foreach (KeyValuePair <string, string> prefix in new[]
                {
                    new KeyValuePair <string, string>("get_", "get"),
                    new KeyValuePair <string, string>("set_", "set"),
                    new KeyValuePair <string, string>("bot_", "bot"),
                    new KeyValuePair <string, string>("favorite_", "bot"),
                    new KeyValuePair <string, string>("favorite", "bot"),
                    new KeyValuePair <string, string>("fav_", "bot"),
                    new KeyValuePair <string, string>("fav", "bot"),

                    new KeyValuePair <string, string>("get", "get"),
                    new KeyValuePair <string, string>("set", "set"),
                    new KeyValuePair <string, string>("bot", "bot"),
                })
                {
                    if (nodeNameLower.StartsWith(prefix.Key) && node.Name.Length > prefix.Key.Length)
                    {
                        string               name    = node.Name.Substring(prefix.Key.Length);
                        XmlNode              pn      = node.ParentNode;
                        LineInfoElementImpl  newnode = StaticXMLUtils.CopyNode(prefix.Value, node, false);
                        XmlAttributeLineInfo atr     = (XmlAttributeLineInfo)newnode.OwnerDocument.CreateAttribute("name");
                        atr.ReadOnly = false;
                        atr.Value    = name;
                        newnode.Attributes.Append(atr);
                        if (node.Name.ToLower() != newnode.Name.ToLower())
                        {
                            writeToLog("AIMLLOADER: converted " + node.OuterXml + " -> " + newnode.OuterXml);
                            return(targetBot.GetTagHandler(newnode, query, request, result, user, liText));
                        }
                        writeToLog("AIMLLOADER: ! convert " + node.OuterXml + " -> " + newnode.OuterXml);
                    }
                }
            }
            if (tagHandlerU != null)
            {
                return(tagHandlerU);
            }
            if (nodeNameLower == "name")
            {
                return(new bot(targetBot, user, query, request, result, node));
            }

            tagHandlerU = new lazyClosure(targetBot, user, query, request, result, node);
            writeToLog("AIMLLOADER:  lazyClosure: " + node.OuterXml);
            return(tagHandlerU);
        }
        /// <summary>
        /// Recursively evaluates the template nodes returned from the Proccessor
        /// </summary>
        /// <param name="node">the node to evaluate</param>
        /// <param name="query">the query that produced targetBot node</param>
        /// <param name="request">the request from the user</param>
        /// <param name="result">the result to be sent to the user</param>
        /// <param name="user">the user who originated the request</param>
        /// <returns>the output Unifiable</returns>
        public string processNode(XmlNode node, SubQuery query,
                                  Request request, Result result, User user,
                                  AIMLTagHandler parentHandlerU, bool protectChild, bool copyParent,
                                  AIMLTagHandler nodeHandlerU, bool suspendLimits, out bool templateSucceeded)
        {
            Request originalSalientRequest = Request.GetOriginalSalientRequest(request);
            bool    osrExists          = originalSalientRequest != null;
            var     wasSuspendRestrati = request == null || request.SuspendSearchLimits;

            templateSucceeded = true;
            if (request != null)
            {
                request.SuspendSearchLimits = suspendLimits;
            }
            Dictionary <Unifiable, Unifiable> sraiMark = null;

            if (osrExists && ChatOptions.UseSraiLimitersBasedOnTextContent)
            {
                sraiMark = originalSalientRequest.CreateSRAIMark();
            }
            try
            {
                bool   childSuccess;
                string outputSentence = processNodeVV(node, query,
                                                      request, result, user, parentHandlerU,
                                                      protectChild, copyParent, nodeHandlerU, out childSuccess);
                if (!childSuccess)
                {
                    templateSucceeded = false;
                }
                if (Unifiable.IsNull(outputSentence))
                {
                    //outputSentence = tagHandler.GetTemplateNodeInnerText();
                    templateSucceeded = false;
                    return(outputSentence);
                }
                if (!Unifiable.IsNullOrEmpty(outputSentence))
                {
                    return(outputSentence);
                }
                if (StaticAIMLUtils.IsSilentTag(node) && !Unifiable.IsEMPTY(outputSentence))
                {
                    return("");
                }
                if (nodeHandlerU.FinalResultValid)
                {
                    return(nodeHandlerU.FinalResult);
                }
                return(outputSentence);
            }
            finally
            {
                if (osrExists && ChatOptions.UseSraiLimitersBasedOnTextContent)
                {
                    originalSalientRequest.ResetSRAIResults(sraiMark);
                }
                if (request != null)
                {
                    request.SuspendSearchLimits = wasSuspendRestrati;
                }
            }
        }
Пример #28
0
        /// <summary>
        /// Recursively evaluates the template nodes returned from the bot
        /// </summary>
        /// <param name="node">the node to evaluate</param>
        /// <param name="query">the query that produced this node</param>
        /// <param name="request">the request from the user</param>
        /// <param name="result">the result to be sent to the user</param>
        /// <param name="user">the user who originated the request</param>
        /// <returns>the output string</returns>
        private string processNode(XmlNode node, SubQuery query, Request request, Result result, User user)
        {
            // check for timeout (to avoid infinite loops)
            if (request.StartedOn.AddMilliseconds(request.bot.TimeOut) < DateTime.Now)
            {
                request.bot.writeToLog("WARNING! Request timeout. User: "******" raw input: \"" + request.rawInput + "\" processing template: \"" + query.Template + "\"");
                request.hasTimedOut = true;
                return(string.Empty);
            }

            StringBuilder newInnerText = new StringBuilder();

            if (node.HasChildNodes)
            {
                // recursively check
                foreach (XmlNode childNode in node.ChildNodes)
                {
                    childNode.InnerText = this.processNode(childNode, query, request, result, user);
                }
            }

            // process the node itself
            AIMLTagHandler tagHandler = null;

            switch (node.Name.ToLower())
            {
            case "bot":
                tagHandler = new AIMLTagHandlers.bot(this, user, query, request, result, node);
                break;

            case "condition":
                tagHandler = new AIMLTagHandlers.condition(this, user, query, request, result, node);
                break;

            case "date":
                tagHandler = new AIMLTagHandlers.date(this, user, query, request, result, node);
                break;

            case "formal":
                tagHandler = new AIMLTagHandlers.formal(this, user, query, request, result, node);
                break;

            case "gender":
                tagHandler = new AIMLTagHandlers.gender(this, user, query, request, result, node);
                break;

            case "get":
                tagHandler = new AIMLTagHandlers.get(this, user, query, request, result, node);
                break;

            case "gossip":
                tagHandler = new AIMLTagHandlers.gossip(this, user, query, request, result, node);
                break;

            case "id":
                tagHandler = new AIMLTagHandlers.id(this, user, query, request, result, node);
                break;

            case "input":
                tagHandler = new AIMLTagHandlers.input(this, user, query, request, result, node);
                break;

            case "javascript":
                tagHandler = new AIMLTagHandlers.javascript(this, user, query, request, result, node);
                break;

            case "learn":
                tagHandler = new AIMLTagHandlers.learn(this, user, query, request, result, node);
                break;

            case "lowercase":
                tagHandler = new AIMLTagHandlers.lowercase(this, user, query, request, result, node);
                break;

            case "person":
                tagHandler = new AIMLTagHandlers.person(this, user, query, request, result, node);
                break;

            case "person2":
                tagHandler = new AIMLTagHandlers.person2(this, user, query, request, result, node);
                break;

            case "random":
                tagHandler = new AIMLTagHandlers.random(this, user, query, request, result, node);
                break;

            case "sentence":
                tagHandler = new AIMLTagHandlers.sentence(this, user, query, request, result, node);
                break;

            case "set":
                tagHandler = new AIMLTagHandlers.set(this, user, query, request, result, node);
                break;

            case "size":
                tagHandler = new AIMLTagHandlers.size(this, user, query, request, result, node);
                break;

            case "sr":
                tagHandler = new AIMLTagHandlers.sr(this, user, query, request, result, node);
                break;

            case "srai":
                tagHandler = new AIMLTagHandlers.srai(this, user, query, request, result, node);
                break;

            case "star":
                tagHandler = new AIMLTagHandlers.star(this, user, query, request, result, node);
                break;

            case "system":
                tagHandler = new AIMLTagHandlers.system(this, user, query, request, result, node);
                break;

            case "that":
                tagHandler = new AIMLTagHandlers.that(this, user, query, request, result, node);
                break;

            case "thatstar":
                tagHandler = new AIMLTagHandlers.thatstar(this, user, query, request, result, node);
                break;

            case "think":
                tagHandler = new AIMLTagHandlers.think(this, user, query, request, result, node);
                break;

            case "topicstar":
                tagHandler = new AIMLTagHandlers.topicstar(this, user, query, request, result, node);
                break;

            case "uppercase":
                tagHandler = new AIMLTagHandlers.uppercase(this, user, query, request, result, node);
                break;

            case "version":
                tagHandler = new AIMLTagHandlers.version(this, user, query, request, result, node);
                break;

            default:
                tagHandler = this.getBespokeTags(user, query, request, result, node);
                break;
            }
            if (object.Equals(null, tagHandler))
            {
                return(node.InnerText);
            }
            else
            {
                return(tagHandler.Transform());
            }
        }
        static public Unifiable GetSettingForType(string subject, SubQuery query, ISettingsDictionary dict, string name, out string realName, string gName, Unifiable defaultVal, out bool succeed, XmlNode node)
        {
            Request             request    = query.Request;
            OutputDelegate      writeToLog = request.writeToLog ?? TextPatternUtils.DEVNULL;
            AltBot              TargetBot  = request.TargetBot;
            ISettingsDictionary udict;
            string              dictName = AIMLTagHandler.GetNameOfDict(query, subject ?? dict.NameSpace, node, out udict);
            // try to use a global blackboard predicate
            User gUser = TargetBot.ExemplarUser;

            defaultVal = StaticXMLUtils.GetAttribValue(node, "default,defaultValue", defaultVal);
            gName      = StaticXMLUtils.GetAttribValue(node, "global_name", gName);

            string realName0;


            var vv = ScriptManager.GetGroup(query.TargetBot.ObjectRequester, dictName, name);
            {
                if (vv != null)
                {
                    if (vv.Count == 0)
                    {
                        succeed  = true;
                        realName = name;
                        return("");
                    }
                    succeed  = true;
                    realName = name;
                    foreach (var e in vv)
                    {
                        return(Unifiable.Create(e));
                    }
                }
            }
            Unifiable resultGet = SettingsDictionaryReal.grabSettingDefaultDict(udict, name, out realName0);

            if (ReferenceEquals(resultGet, null))
            {
                realName  = null;
                resultGet = Unifiable.NULL;
            }
            // if ((!String.IsNullOrEmpty(result)) && (!result.IsWildCard())) return result; // we have a local one

            String realNameG;
            // try to use a global blackboard predicate
            Unifiable gResult = SettingsDictionaryReal.grabSettingDefaultDict(gUser.Predicates, gName, out realNameG);

            if ((Unifiable.IsMissing(resultGet)) && (!Unifiable.IsMissing(gResult)))
            {
                // result=nothing, gResult=something => return gResult
                writeToLog("SETTINGS OVERRIDE " + gResult);
                succeed  = true;
                realName = realNameG;
                // return gResult;
            }
            string sresultGet = resultGet.ToValue(query);

            // if Unknown or empty
            if (UseLuceneForGet && Unifiable.IsMissing(sresultGet))
            {
                Unifiable userName = udict.grabSetting("id");
                if (Unifiable.IsNullOrEmpty(userName))
                {
                    writeToLog("ERROR IsNullOrEmpty id in " + udict.NameSpace);
                }
                ITripleStore userbotLuceneIndexer = (ITripleStore)query.Request.TargetBot.TripleStore;
                string       resultLucene         = userbotLuceneIndexer.queryTriple(userName, name, node);
                if (!string.IsNullOrEmpty(resultLucene))
                {
                    succeed  = true;
                    realName = name;
                    return(resultLucene);
                }
            }


            if (sresultGet != null)
            {
                if (sresultGet.ToUpper() == "UNKNOWN")
                {
                    succeed  = false;
                    realName = null;
                    return(sresultGet + " " + name);
                }
                else if (Unifiable.IsEMPTY(resultGet))
                {
                    succeed  = true;
                    realName = name;
                    return(resultGet);
                }
                else if (Unifiable.IsUnknown(resultGet))
                {
                    succeed  = false;
                    realName = name;
                    return(resultGet);
                }
            }
            if (!String.IsNullOrEmpty(sresultGet))
            {
                succeed  = true;
                realName = realName0;
                query.GetDictValue++;
                if (!IsNullOrEmpty(gResult))
                {
                    if (resultGet.IsWildCard)
                    {
                        realName = realNameG;
                        // result=*, gResult=something => return gResult
                        return(gResult);
                    }
                    // result=something, gResult=something => return result
                    return(resultGet);
                }
                else
                {
                    // result=something, gResult=nothing => return result
                    return(resultGet);
                }
            }
            if (defaultVal == null)
            {
                succeed  = false;
                realName = null;
                return(defaultVal);
            }
            // default => return defaultVal
            succeed  = true;
            realName = realName0;
            return(ReturnSetSetting(udict, name, defaultVal));
            //return defaultVal;
        }
Пример #30
0
        /// <summary>
        /// Given a request containing user input, produces a result from the bot
        /// </summary>
        /// <param name="request">the request from the user</param>
        /// <returns>the result to be output to the user</returns>
        public Result Chat(Request request)
        {
            Result result      = new Result(request.user, this, request);
            bool   IsAddResult = true;

            if (this.isAcceptingUserInput)
            {
                // Normalize the input
                AIMLLoader loader = new AIMLLoader(this);
                AIMLbot.Normalize.SplitIntoSentences splitter = new AIMLbot.Normalize.SplitIntoSentences(this);
                string[] rawSentences = splitter.Transform(request.rawInput);
                foreach (string sentence in rawSentences)
                {
                    result.InputSentences.Add(sentence);
                    string path = loader.generatePath(sentence, request.user.getLastBotOutput(), request.user.Topic, true);
                    result.NormalizedPaths.Add(path);
                }

                // grab the templates for the various sentences from the graphmaster
                foreach (string path in result.NormalizedPaths)
                {
                    Utils.SubQuery query = new SubQuery(path);
                    query.Template = this.Graphmaster.evaluate(path, query, request, MatchState.UserInput, new StringBuilder());
                    result.SubQueries.Add(query);
                }

                // process the templates into appropriate output
                foreach (SubQuery query in result.SubQueries)
                {
                    if (query.Template.Length > 0)
                    {
                        try
                        {
                            XmlNode templateNode   = AIMLTagHandler.getNode(query.Template);
                            string  outputSentence = this.processNode(templateNode, query, request, result, request.user);
                            if (outputSentence.Length > 0)
                            {
                                if (outputSentence.Contains("[notadd]"))
                                {
                                    outputSentence = outputSentence.Replace("[notadd]", "");
                                    IsAddResult    = false;
                                }
                                result.OutputSentences.Add(outputSentence);
                            }
                        }
                        catch (Exception e)
                        {
                            if (this.WillCallHome)
                            {
                                this.phoneHome(e.Message, request);
                            }
                            this.writeToLog("WARNING! A problem was encountered when trying to process the input: " + request.rawInput + " with the template: \"" + query.Template + "\"");
                        }
                    }
                }
            }
            else
            {
                result.OutputSentences.Add(this.NotAcceptingUserInputMessage);
            }

            // populate the Result object
            result.Duration = DateTime.Now - request.StartedOn;
            if (IsAddResult)
            {
                request.user.addResult(result);
            }
            return(result);
        }