001 package org.bukkit.conversations;
002
003 import org.bukkit.ChatColor;
004
005 /**
006 * ValidatingPrompt is the base class for any prompt that requires validation.
007 * ValidatingPrompt will keep replaying the prompt text until the user enters
008 * a valid response.
009 */
010 public abstract class ValidatingPrompt implements Prompt {
011 public ValidatingPrompt() {
012 super();
013 }
014
015 /**
016 * Accepts and processes input from the user and validates it. If
017 * validation fails, this prompt is returned for re-execution, otherwise
018 * the next Prompt in the prompt graph is returned.
019 *
020 * @param context Context information about the conversation.
021 * @param input The input text from the user.
022 * @return This prompt or the next Prompt in the prompt graph.
023 */
024 public Prompt acceptInput(ConversationContext context, String input) {
025 if (isInputValid(context, input)) {
026 return acceptValidatedInput(context, input);
027 } else {
028 String failPrompt = getFailedValidationText(context, input);
029 if (failPrompt != null) {
030 context.getForWhom().sendRawMessage(ChatColor.RED + failPrompt);
031 }
032 // Redisplay this prompt to the user to re-collect input
033 return this;
034 }
035 }
036
037 /**
038 * Ensures that the prompt waits for the user to provide input.
039 *
040 * @param context Context information about the conversation.
041 * @return True.
042 */
043 public boolean blocksForInput(ConversationContext context) {
044 return true;
045 }
046
047 /**
048 * Override this method to check the validity of the player's input.
049 *
050 * @param context Context information about the conversation.
051 * @param input The player's raw console input.
052 * @return True or false depending on the validity of the input.
053 */
054 protected abstract boolean isInputValid(ConversationContext context, String input);
055
056 /**
057 * Override this method to accept and processes the validated input from
058 * the user. Using the input, the next Prompt in the prompt graph should
059 * be returned.
060 *
061 * @param context Context information about the conversation.
062 * @param input The validated input text from the user.
063 * @return The next Prompt in the prompt graph.
064 */
065 protected abstract Prompt acceptValidatedInput(ConversationContext context, String input);
066
067 /**
068 * Optionally override this method to display an additional message if the
069 * user enters an invalid input.
070 *
071 * @param context Context information about the conversation.
072 * @param invalidInput The invalid input provided by the user.
073 * @return A message explaining how to correct the input.
074 */
075 protected String getFailedValidationText(ConversationContext context, String invalidInput) {
076 return null;
077 }
078 }