package me.fromgate.reactions.placeholders; import me.fromgate.reactions.flags.Flags; import me.fromgate.reactions.util.Variables; import me.fromgate.reactions.util.message.M; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Placeholders { private final static Pattern PATTERN_RAW = Pattern.compile("%raw:((%\\w+%)|(%\\w+:\\w+%)|(%\\w+:\\S+%))%"); private final static Pattern PATTERN_ANY = Pattern.compile("(%\\w+%)|(%\\w+:\\w+%)|(%\\w+:\\S+%)"); private static List<Placeholder> placeholders = new ArrayList<>(); public static void init() { add(new PlaceholderPlayer()); add(new PlaceholderMoney()); add(new PlaceholderRandom()); add(new PlaceholderTime()); add(new PlaceholderCalc()); } public static boolean add(Placeholder ph) { if (ph == null) return false; if (ph.getKeys().length == 0) return false; if (ph.getId().equalsIgnoreCase("UNKNOWN")) return false; placeholders.add(ph); return true; } public static String replacePlaceholderButRaw(Player player, String string) { String result = string; List<String> raws = new ArrayList<>(); Matcher matcher = PATTERN_RAW.matcher(result); StringBuffer sb = new StringBuffer(); int count = 0; while (matcher.find()) { raws.add(matcher.group().replaceAll("(^%raw:)|(%$)", "")); matcher.appendReplacement(sb, "~~~[[[RAW" + count + "]]]~~~"); count++; } matcher.appendTail(sb); result = replacePlaceholders(player, sb.toString()); if (!raws.isEmpty()) { for (int i = 0; i < raws.size(); i++) { result = result.replace("~~~[[[RAW" + i + "]]]~~~", raws.get(i)); } } return result; } private static String replacePlaceholders(Player player, String string) { String result = string; result = Variables.replaceTempVars(result); result = Variables.replacePlaceholders(player, result); Matcher matcher = PATTERN_ANY.matcher(result); StringBuffer sb = new StringBuffer(); String group; String replacement; while (matcher.find()) { group = new StringBuilder("%") .append(replacePlaceholders(player, matcher.group().replaceAll("(^%)|(%$)", ""))) .append("%").toString(); replacement = replacePlaceholder(player, group); matcher.appendReplacement(sb, Matcher.quoteReplacement(replacement == null ? group : replacement)); } matcher.appendTail(sb); result = sb.toString(); if (!string.equals(result)) result = replacePlaceholders(player, result); return result; } private final static Pattern PH_W_S = Pattern.compile("(%\\w+:\\S+%)"); private static String replacePlaceholder(Player player, String field) { String key = field.replaceAll("^%", "").replaceAll("%$", ""); String value = ""; if (PH_W_S.matcher(field).matches()) { value = field.replaceAll("^%\\w+:", "").replaceAll("%$", ""); key = key.replaceAll(Pattern.quote(":" + value) + "$", ""); } for (Placeholder ph : placeholders) { if (ph.checkKey(key)) return ph.processPlaceholder(player, key, value); } return field; } public static void listPlaceholders(CommandSender sender, int pageNum) { List<String> phList = new ArrayList<>(); for (Placeholder ph : placeholders) { for (String phKey : ph.getKeys()) { if (phKey.toLowerCase().equals(phKey)) continue; M desc = M.getByName("placeholder_" + phKey); if (desc == null) { M.LNG_FAIL_PLACEHOLDER_DESC.log(phKey); } else { phList.add("&6" + phKey + "&3: &a" + desc.getText("NOCOLOR")); } } } for (Flags f : Flags.values()) { if (f != Flags.TIME && f != Flags.CHANCE) continue; String name = f.name(); M desc = M.getByName("placeholder_" + name); if (desc == null) { M.LNG_FAIL_PLACEHOLDER_DESC.log(name); } else { phList.add("&6" + name + "&3: &a" + desc.getText("NOCOLOR")); } } phList.add("&6VAR&3: &a" + M.PLACEHOLDER_VAR.getText("NOCOLOR")); phList.add("&6SIGN_LOC, SIGN_LINE1,.. SIGN_LINE4&3: &a" + M.PLACEHOLDER_SIGNACT.getText("NOCOLOR")); phList.add("&6ARG0, ARG1, ARG2...&3: &a" + M.PLACEHOLDER_COMMANDACT.getText("NOCOLOR")); M.printPage(sender, phList, M.MSG_PLACEHOLDERLISTTITLE, pageNum, sender instanceof Player ? 10 : 1000); } }