ChestShop-3/src/main/java/com/Acrobot/ChestShop/Listeners/PreShopCreation/PriceChecker.java
Phoenix616 df76347697 Improve sign price corrections
This includes a new price_precision config entry to set the amount of decimal places to allow on a shop sign (set to 2 by default). Thanks to @andrewkm for this idea.
It also fixes an issue where a zero inside the decimal places was removed instead of it's end and also removes the point and zeros from prices that only have trailing zeros to avoid confusion (e.g. in languages that use the decimal point for thousands)
2018-09-05 23:07:35 +01:00

83 lines
2.6 KiB
Java

package com.Acrobot.ChestShop.Listeners.PreShopCreation;
import com.Acrobot.Breeze.Utils.PriceUtil;
import com.Acrobot.ChestShop.Configuration.Properties;
import com.Acrobot.ChestShop.Events.PreShopCreationEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import static com.Acrobot.Breeze.Utils.PriceUtil.isPrice;
import static com.Acrobot.ChestShop.Events.PreShopCreationEvent.CreationOutcome.INVALID_PRICE;
import static com.Acrobot.ChestShop.Signs.ChestShopSign.PRICE_LINE;
/**
* @author Acrobot
*/
public class PriceChecker implements Listener {
@EventHandler(priority = EventPriority.LOWEST)
public static void onPreShopCreation(PreShopCreationEvent event) {
String line = event.getSignLine(PRICE_LINE).toUpperCase();
if (Properties.PRICE_PRECISION <= 0) {
line = line.replaceAll("\\.\\d*", ""); //remove too many decimal places
} else {
line = line.replaceAll("(\\.\\d{0," + Properties.PRICE_PRECISION + "})\\d*", "$1"); //remove too many decimal places
}
line = line.replaceAll("(\\.\\d*[1-9])0+", "$1"); //remove trailing zeroes
line = line.replaceAll("(\\d)\\.0+(\\D|$)", "$1$2"); //remove point and zeroes from strings that only have trailing zeros
String[] part = line.split(":");
if (part.length > 1 && (isInvalid(part[0]) ^ isInvalid(part[1]))) {
line = line.replace(':', ' ');
part = new String[]{line};
}
if (part[0].split(" ").length > 2) {
event.setOutcome(INVALID_PRICE);
return;
}
if (line.indexOf('B') != line.lastIndexOf('B') || line.indexOf('S') != line.lastIndexOf('S')) {
event.setOutcome(INVALID_PRICE);
return;
}
if (isPrice(part[0])) {
line = "B " + line;
}
if (part.length > 1 && isPrice(part[1])) {
line += " S";
}
if (line.length() > 15) {
line = line.replace(" ", "");
}
if (line.length() > 15) {
event.setOutcome(INVALID_PRICE);
return;
}
event.setSignLine(PRICE_LINE, line);
if (!PriceUtil.hasBuyPrice(line) && !PriceUtil.hasSellPrice(line)) {
event.setOutcome(INVALID_PRICE);
}
}
private static boolean isInvalid(String part) {
char characters[] = {'B', 'S'};
for (char character : characters) {
if (part.contains(Character.toString(character))) {
return !PriceUtil.hasPrice(part, character);
}
}
return false;
}
}