/// <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); } } } }
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; }
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); }