Example #1
0
        /// <summary>
        /// Responds to a prompt and handles the prompt's return value. Non-null responses should usually call this instead of calling Respond manually.
        /// </summary>
        /// <param name="input">User's response to the prompt.</param>
        /// <param name="prompt">Prompt being responded to.</param>
        /// <param name="toPrompt">Internal 'position' of the prompt being responded to in this.prompts</param>
        private void RespondToPrompt(string input, HeldPrompt prompt, int toPrompt = -1)
        {
            HeldPrompt next;

            try
            {
                next = prompt.Respond(input); //Skip prompt number + space
            }
            catch (Exception e)
            {
                //TODO: Error logging
                sendMessage("An error has occurred while processing your input: ^n" + e.ToString());
                if (!prompt.IsStillValid())
                {
                    if (this.mainPrompt == prompt)
                    {
                        sendMessage("Logging out to get back to a working state.");
                        LogOut();
                    }
                    else
                    {
                        sendMessage("Aborting broken prompt " + toPrompt);
                        this.RemovePrompt(prompt);
                    }
                }
                return;
            }
            if (next != null && !this.clearingPrompts)
            {
                lock (this.prompts)
                {
                    if (toPrompt != -1 && this.prompts[toPrompt] == prompt)
                    {
                        this.prompts[toPrompt] = next;
                        next.OnTransition();
                    }
                    else if (toPrompt == -1 && this.mainPrompt == prompt)
                    {
                        this.mainPrompt = next;
                        next.OnTransition();
                    }
                    else
                    {
                        this.Prompt(next);
                    }
                }
            }
        }
Example #2
0
 private void ClearPrompts()
 {
     this.clearingPrompts = true;
     lock (this.prompts)
     {
         HeldPrompt next;
         for (int i = 0; i < prompts.Length; i++)
         {
             next = prompts[i];
             if (next != null && next.IsStillValid())
             {
                 next.Respond(null);
             }
             prompts[i] = null;
         }
         if (mainPrompt != null && mainPrompt.IsStillValid())
         {
             mainPrompt.Respond(null);
         }
     }
     this.clearingPrompts = false;
 }
Example #3
0
        private bool trySpecificPrompt(string input)
        {
            string[] words       = input.Split(' ');
            int      promptIndex = words[0].IndexOf('.');

            if (promptIndex == -1)
            {
                return(false);
            }
            int toPrompt;

            if (!Int32.TryParse(words[0].Substring(0, promptIndex), out toPrompt))
            {
                return(false);
            }
            //words[0] = words[0].Substring(promptIndex + 1);
            HeldPrompt prompt = this.GetPrompt(toPrompt);

            if (prompt == null)
            {
                this.sendMessage(toPrompt.ToString() + " is not a valid prompt index. Do not start a message with something like \"1.\" without an associated prompt.");
            }
            else if (!prompt.IsStillValid())
            {
                this.sendMessage("That prompt has recently expired.");
                this.RemovePrompt(toPrompt);
            }
            else if (words.Length == 1)
            {
                this.sendMessage(prompt.PromptMessage);
            }
            else
            {
                RespondToPrompt(input.Substring(promptIndex + 1), prompt, toPrompt);
            }
            return(true);
        }