package io.github.lucaseasedup.logit.command.wizard; import static io.github.lucaseasedup.logit.message.MessageHelper.t; import io.github.lucaseasedup.logit.profile.field.Field; import io.github.lucaseasedup.logit.profile.field.FloatField; import io.github.lucaseasedup.logit.profile.field.IntegerField; import io.github.lucaseasedup.logit.profile.field.SetField; import io.github.lucaseasedup.logit.profile.field.StringField; import java.util.List; import org.bukkit.command.CommandSender; public final class ProfileEditWizard extends Wizard { public ProfileEditWizard(CommandSender sender, String playerName) { super(sender, Step.VIEW); this.playerName = playerName; this.fields = getProfileManager().getDefinedFields(); } @Override protected void onCreate() { viewProfile(null); if (!fields.isEmpty()) { updateStep(Step.CHOOSE_ACTION); } else { sendMessage(t("wizard.orangeHorizontalLine")); cancelWizard(); } } @Override protected void onMessage(String message) { if (getCurrentStep() == Step.CHOOSE_ACTION) { if (message.equalsIgnoreCase("done")) { sendMessage(t("wizard.orangeHorizontalLine")); cancelWizard(); } else if (message.toLowerCase().startsWith("edit ")) { String numberString = message.replaceAll("^edit\\s+", ""); int number; try { number = Integer.parseInt(numberString); } catch (NumberFormatException ex) { sendMessage(t("profile.edit.unknownField")); return; } if (number > fields.size() || number <= 0) { sendMessage(t("profile.edit.unknownField")); return; } field = fields.get(number - 1); sendFieldEditingPrompt(); updateStep(Step.ENTER_FIELD_VALUE); } else if (message.toLowerCase().startsWith("erase ")) { String numberString = message.replaceAll("^erase\\s+", ""); int number; try { number = Integer.parseInt(numberString); } catch (NumberFormatException ex) { sendMessage(t("profile.edit.unknownField")); return; } if (number > fields.size() || number <= 0) { sendMessage(t("profile.edit.unknownField")); return; } field = fields.get(number - 1); getProfileManager().removeProfileObject( playerName, field.getName() ); viewProfile(field.getName()); updateStep(Step.CHOOSE_ACTION); } else { sendMessage(t("profile.edit.unknownAction")); } } else if (getCurrentStep() == Step.ENTER_FIELD_VALUE) { if (field instanceof StringField) { StringField stringField = (StringField) field; if (message.length() < stringField.getMinLength()) { sendMessage(t("profile.edit.stringTooShort") .replace("{0}", field.getName()) .replace("{1}", String.valueOf(stringField.getMinLength()))); return; } if (message.length() > stringField.getMaxLength()) { sendMessage(t("profile.edit.stringTooLong") .replace("{0}", field.getName()) .replace("{1}", String.valueOf(stringField.getMaxLength()))); return; } getProfileManager().setProfileString(playerName, field.getName(), message); } else if (field instanceof IntegerField) { IntegerField integerField = (IntegerField) field; int value; try { value = Integer.parseInt(message); } catch (NumberFormatException ex) { sendMessage(t("profile.edit.invalidValue") .replace("{0}", message)); return; } if (value < integerField.getMinValue()) { sendMessage(t("profile.edit.numberTooSmall") .replace("{0}", field.getName()) .replace("{1}", String.valueOf(integerField.getMinValue()))); return; } if (value > integerField.getMaxValue()) { sendMessage(t("profile.edit.numberTooBig") .replace("{0}", field.getName()) .replace("{1}", String.valueOf(integerField.getMaxValue()))); return; } getProfileManager().setProfileInteger(playerName, field.getName(), value); } else if (field instanceof FloatField) { FloatField floatField = (FloatField) field; double value; try { value = Double.parseDouble(message); } catch (NumberFormatException ex) { sendMessage(t("profile.edit.invalidValue") .replace("{0}", message)); return; } if (value < floatField.getMinValue()) { sendMessage(t("profile.edit.numberTooSmall") .replace("{0}", field.getName()) .replace("{1}", String.valueOf(floatField.getMinValue()))); return; } if (value > floatField.getMaxValue()) { sendMessage(t("profile.edit.numberTooBig") .replace("{0}", field.getName()) .replace("{1}", String.valueOf(floatField.getMaxValue()))); return; } getProfileManager().setProfileFloat(playerName, field.getName(), value); } else if (field instanceof SetField) { SetField setField = (SetField) field; String trimmedMessage = message.trim(); if (!setField.isAccepted(trimmedMessage)) { sendMessage(t("profile.edit.invalidValue") .replace("{0}", message)); return; } getProfileManager().setProfileString(playerName, field.getName(), trimmedMessage); } else { throw new RuntimeException("Unknown field type: " + field.getClass().getSimpleName()); } viewProfile(field.getName()); updateStep(Step.CHOOSE_ACTION); } } private void viewProfile(String updatedFieldName) { sendMessage(""); sendMessage(t("profile.edit.header") .replace("{0}", playerName)); sendMessage(t("wizard.orangeHorizontalLine")); if (fields.isEmpty()) { sendMessage(t("profile.edit.noFields")); } else { int i = 1; for (Field field : fields) { Object value = getProfileManager() .getProfileObject(playerName, field.getName()); if (value == null) { value = ""; } if (field.getName().equals(updatedFieldName)) { sendMessage(t("profile.edit.updatedField") .replace("{0}", String.valueOf(i)) .replace("{1}", field.getName()) .replace("{2}", value.toString())); } else { sendMessage(t("profile.edit.field") .replace("{0}", String.valueOf(i)) .replace("{1}", field.getName()) .replace("{2}", value.toString())); } i++; } sendMessage(""); sendMessage(t("profile.edit.chooseAction")); } } private void sendFieldEditingPrompt() { if (field instanceof StringField) { sendMessage(t("profile.edit.enterFieldValue.string") .replace("{0}", field.getName())); } else if (field instanceof IntegerField) { sendMessage(t("profile.edit.enterFieldValue.integer") .replace("{0}", field.getName())); } else if (field instanceof FloatField) { sendMessage(t("profile.edit.enterFieldValue.float") .replace("{0}", field.getName())); } else if (field instanceof SetField) { SetField setField = (SetField) field; StringBuilder values = new StringBuilder(); for (String value : setField.getAcceptedValues()) { if (values.length() > 0) { values.append(t("profile.edit.enterFieldValue.set.separator")); } values.append(t("profile.edit.enterFieldValue.set.value") .replace("{0}", value)); } sendMessage(t("profile.edit.enterFieldValue.set") .replace("{0}", field.getName()) .replace("{1}", values.toString())); } else { throw new RuntimeException("Unknown field type: " + field.getClass().getSimpleName()); } } public static enum Step { VIEW, CHOOSE_ACTION, EDIT_FIELD, ENTER_FIELD_VALUE, ERASE_FIELD, } private final String playerName; private final List<Field> fields; private Field field; }