/*
* ReActions, Minecraft bukkit plugin
* (c)2012-2017, fromgate, fromgate@gmail.com
* http://dev.bukkit.org/server-mods/reactions/
*
* This file is part of ReActions.
*
* ReActions is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ReActions is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ReActions. If not, see <http://www.gnorg/licenses/>.
*
*/
package me.fromgate.reactions.util;
import me.fromgate.reactions.ReActions;
import me.fromgate.reactions.event.EventManager;
import me.fromgate.reactions.util.message.M;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Variables {
private static Map<String, String> vars = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
private static Map<String, String> tempvars = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
private final static Pattern VARP = Pattern.compile("(?i).*%varp?:\\S+%.*");
private final static Pattern FLOAT_0 = Pattern.compile("^[0-9]+\\.0$");
private final static Pattern NUMBER = Pattern.compile("-?[0-9]+(.[0-9]+)?");
private static String varId(Player player, String var) {
return (player == null ? "general." + var : player.getName() + "." + var);
}
private static String varId(String player, String var) {
return (player.isEmpty() ? "general." + var : player + "." + var);
}
public static void setVar(String player, String var, String value) {
String prevVal = Variables.getVar(player, var, "");
vars.put(varId(player, var), value);
save();
EventManager.raiseVariableEvent(var, player, value, prevVal);
}
public static void setVar(Player player, String var, String value) {
String prevVal = Variables.getVar(player, var, "");
vars.put(varId(player, var), value);
save();
EventManager.raiseVariableEvent(var, player == null ? "" : player.getName(), value, prevVal);
}
public static void clearVar(Player player, String var) {
String prevVal = Variables.getVar(player, var, "");
String id = varId(player, var);
if (vars.containsKey(id)) vars.remove(id);
save();
EventManager.raiseVariableEvent(var, player == null ? "" : player.getName(), "", prevVal);
}
public static boolean clearVar(String player, String var) {
String prevVal = Variables.getVar(player, var, "");
String id = varId(player, var);
if (!vars.containsKey(id)) return false;
vars.remove(id);
save();
EventManager.raiseVariableEvent(var, player, "", prevVal);
return true;
}
public static String getVar(String player, String var, String defvar) {
String id = varId(player, var);
if (vars.containsKey(id)) return vars.get(id);
return defvar;
}
public static String getVar(Player player, String var, String defvar) {
String id = varId(player, var);
if (vars.containsKey(id)) return vars.get(id);
return defvar;
}
public static boolean cmpVar(String playerName, String var, String cmpvalue) {
String id = varId(playerName, var);
if (!vars.containsKey(id)) return false;
String value = getVar(playerName, var, "");
if (isNumber(cmpvalue, value)) return (Double.parseDouble(cmpvalue) == Double.parseDouble(value));
return value.equalsIgnoreCase(cmpvalue);
}
public static boolean cmpGreaterVar(String playerName, String var, String cmpvalue) {
String id = varId(playerName, var);
if (!vars.containsKey(id)) return false;
if (!isNumber(vars.get(id), cmpvalue)) return false;
return Double.parseDouble(vars.get(id)) > Double.parseDouble(cmpvalue);
}
public static boolean cmpLowerVar(String playerName, String var, String cmpvalue) {
String id = varId(playerName, var);
if (!vars.containsKey(id)) return false;
if (!isNumber(vars.get(id), cmpvalue)) return false;
return Double.parseDouble(vars.get(id)) < Double.parseDouble(cmpvalue);
}
public static boolean existVar(String playerName, String var) {
return (vars.containsKey(varId(playerName, var)));
}
public static boolean incVar(Player player, String var) {
return incVar(player, var, 1);
}
public static boolean incVar(String player, String var) {
return incVar(player, var, 1);
}
public static boolean decVar(Player player, String var) {
return incVar(player, var, -1);
}
public static boolean decVar(String player, String var) {
return incVar(player, var, -1);
}
public static boolean incVar(Player player, String var, double addValue) {
return incVar(player == null ? "" : player.getName(), var, addValue);
}
public static boolean incVar(String player, String var, double addValue) {
String id = varId(player, var);
if (!vars.containsKey(id)) setVar(player, var, "0");
String valueStr = vars.get(id);
if (!isNumber(valueStr)) return false;
setVar(player, var, String.valueOf(Double.parseDouble(valueStr) + addValue));
return true;
}
public static boolean decVar(String player, String var, double decValue) {
return incVar(player, var, decValue * (-1));
}
public static boolean decVar(Player player, String var, double decValue) {
return incVar(player, var, decValue * (-1));
}
public static boolean mergeVar(Player player, String var, String stringToMerge, boolean spaceDivider) {
String space = spaceDivider ? " " : "";
String id = varId(player, var);
if (!vars.containsKey(id)) setVar(player, var, "");
setVar(player, var, getVar(player, var, "") + space + stringToMerge);
return false;
}
public static void save() {
try {
YamlConfiguration cfg = new YamlConfiguration();
File f = new File(ReActions.instance.getDataFolder() + File.separator + "variables.yml");
if (f.exists()) f.delete();
f.createNewFile();
for (String key : vars.keySet())
cfg.set(key, vars.get(key));
cfg.save(f);
} catch (Exception ignored) {
}
}
public static void load() {
vars.clear();
try {
YamlConfiguration cfg = new YamlConfiguration();
File f = new File(ReActions.instance.getDataFolder() + File.separator + "variables.yml");
if (!f.exists()) return;
cfg.load(f);
for (String key : cfg.getKeys(true)) {
if (!key.contains(".")) continue;
vars.put(key, cfg.getString(key));
}
} catch (Exception ignored) {
}
}
public static String replacePlaceholders(Player player, String str) {
if (!VARP.matcher(str).matches()) return str;
String newStr = str;
for (String key : vars.keySet()) {
String replacement = vars.get(key);
replacement = FLOAT_0.matcher(replacement).matches() ? Integer.toString((int) Double.parseDouble(replacement)) : Matcher.quoteReplacement(replacement);
if (key.startsWith("general.")) {
String id = id = key.substring(8); // key.replaceFirst("general\\.", "");
newStr = newStr.replaceAll(new StringBuilder("(?i)%var:").append(Pattern.quote(id)).append("%").toString(), replacement);
} else {
if (player != null && key.matches(Util.join("(?i)^", player.getName(), "\\..*"))) {
String id = key.replaceAll(Util.join("(?i)^", player.getName(), "\\."), "");
newStr = newStr.replaceAll(new StringBuilder("(?i)%varp:").append(Pattern.quote(id)).append("%").toString(), replacement);
}
newStr = newStr.replaceAll(new StringBuilder("(?i)%varp?:").append(Pattern.quote(key)).append("%").toString(), replacement);
}
}
return newStr;
}
/*
* Temporary variables - replacement for place holders
*/
public static String replaceTempVars(String str) {
if (str.isEmpty()) return str;
String newStr = str;
for (String key : tempvars.keySet()) {
String replacement = tempvars.get(key);
replacement = FLOAT_0.matcher(replacement).matches() ? Integer.toString((int) Double.parseDouble(replacement)) : Matcher.quoteReplacement(replacement);
newStr = newStr.replaceAll("(?i)%" + key + "%", replacement);
}
return newStr;
}
public static void setTempVars(Param params) {
if (params == null || params.isEmpty()) return;
for (String key : params.keySet()) {
setTempVar(key, params.getParam(key));
}
}
public static void setTempVar(String varId, String value) {
tempvars.put(varId, value);
}
public static void clearTempVar(String varId) {
if (tempvars.containsKey(varId)) vars.remove(varId);
}
public static void clearAllTempVar() {
tempvars.clear();
}
public static String getTempVar(String varId) {
return getTempVar(varId, "");
}
public static String getTempVar(String varId, String defvar) {
if (tempvars.containsKey(varId)) return tempvars.get(varId);
return defvar;
}
public static void printList(CommandSender sender, int pageNum, String mask) {
int linesPerPage = (sender instanceof Player) ? 15 : 10000;
List<String> varList = new ArrayList<>();
for (String key : vars.keySet()) {
if (mask.isEmpty() || key.contains(mask)) {
varList.add(key + " : " + vars.get(key));
}
}
M.printPage(sender, varList, M.MSG_VARLIST, pageNum, linesPerPage);
}
public static boolean isNumber(String... str) {
if (str.length == 0) return false;
for (String s : str)
if (!NUMBER.matcher(s).matches()) return false;
return true;
}
public static boolean matchVar(String playerName, String var, String value) {
String id = varId(playerName, var);
if (!vars.containsKey(id)) return false;
String varValue = vars.get(id);
return varValue.matches(value);
}
public static Param getTempVars() {
return new Param(tempvars);
}
}