001 package org.bukkit.conversations; 002 003 import org.apache.commons.lang.math.NumberUtils; 004 005 /** 006 * NumericPrompt is the base class for any prompt that requires a {@link 007 * Number} response from the user. 008 */ 009 public abstract class NumericPrompt extends ValidatingPrompt{ 010 public NumericPrompt() { 011 super(); 012 } 013 014 @Override 015 protected boolean isInputValid(ConversationContext context, String input) { 016 return NumberUtils.isNumber(input) && isNumberValid(context, NumberUtils.createNumber(input)); 017 } 018 019 /** 020 * Override this method to do further validation on the numeric player 021 * input after the input has been determined to actually be a number. 022 * 023 * @param context Context information about the conversation. 024 * @param input The number the player provided. 025 * @return The validity of the player's input. 026 */ 027 protected boolean isNumberValid(ConversationContext context, Number input) { 028 return true; 029 } 030 031 @Override 032 protected Prompt acceptValidatedInput(ConversationContext context, String input) { 033 try 034 { 035 return acceptValidatedInput(context, NumberUtils.createNumber(input)); 036 } catch (NumberFormatException e) { 037 return acceptValidatedInput(context, NumberUtils.INTEGER_ZERO); 038 } 039 } 040 041 /** 042 * Override this method to perform some action with the user's integer 043 * response. 044 * 045 * @param context Context information about the conversation. 046 * @param input The user's response as a {@link Number}. 047 * @return The next {@link Prompt} in the prompt graph. 048 */ 049 protected abstract Prompt acceptValidatedInput(ConversationContext context, Number input); 050 051 @Override 052 protected String getFailedValidationText(ConversationContext context, String invalidInput) { 053 if (NumberUtils.isNumber(invalidInput)) { 054 return getFailedValidationText(context, NumberUtils.createNumber(invalidInput)); 055 } else { 056 return getInputNotNumericText(context, invalidInput); 057 } 058 } 059 060 /** 061 * Optionally override this method to display an additional message if the 062 * user enters an invalid number. 063 * 064 * @param context Context information about the conversation. 065 * @param invalidInput The invalid input provided by the user. 066 * @return A message explaining how to correct the input. 067 */ 068 protected String getInputNotNumericText(ConversationContext context, String invalidInput) { 069 return null; 070 } 071 072 /** 073 * Optionally override this method to display an additional message if the 074 * user enters an invalid numeric input. 075 * 076 * @param context Context information about the conversation. 077 * @param invalidInput The invalid input provided by the user. 078 * @return A message explaining how to correct the input. 079 */ 080 protected String getFailedValidationText(ConversationContext context, Number invalidInput) { 081 return null; 082 } 083 }