diff --git a/pom.xml b/pom.xml
index 82c025a..5439e4d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2,7 +2,7 @@
4.0.0
com.extendedclip.papi.expansion.javascript
javascript-expansion
- 1.3.1-dev-${BUILD_NUMBER}
+ 1.4.0-dev-1
PAPI-Expansion-Javascript
PlaceholderAPI expansion for javascript placeholders
diff --git a/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptExpansion.java b/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptExpansion.java
index 607335d..cff7002 100644
--- a/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptExpansion.java
+++ b/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptExpansion.java
@@ -40,19 +40,13 @@ import org.bukkit.entity.Player;
public class JavascriptExpansion extends PlaceholderExpansion implements Cacheable, Configurable {
private ScriptEngine engine = null;
-
private String engineType = "javascript";
-
private JavascriptPlaceholdersConfig config;
-
private final Set scripts = new HashSet();
-
private final String VERSION = getClass().getPackage().getImplementationVersion();
@Override
public boolean register() {
-
-
engineType = getString("engine", "javascript");
if (engine == null) {
@@ -67,21 +61,24 @@ public class JavascriptExpansion extends PlaceholderExpansion implements Cacheab
}
config = new JavascriptPlaceholdersConfig(this);
-
config.loadPlaceholders();
-
- return PlaceholderAPI.registerPlaceholderHook(getIdentifier(), this);
+ return super.register();
}
@Override
public void clear() {
+ if (!scripts.isEmpty()) {
+ scripts.stream().forEach(s -> {
+ s.saveData();
+ s.cleanup();
+ });
+ }
scripts.clear();
engine = null;
}
@Override
public String onPlaceholderRequest(Player p, String identifier) {
-
if (p == null) {
return "";
}
@@ -91,20 +88,19 @@ public class JavascriptExpansion extends PlaceholderExpansion implements Cacheab
}
for (JavascriptPlaceholder script : scripts) {
-
if (identifier.startsWith(script.getIdentifier() + "_")) {
+
identifier = identifier.replace(script.getIdentifier() + "_", "");
+
if (identifier.indexOf(",") == -1) {
return script.evaluate(engine, p, identifier);
} else {
return script.evaluate(engine, p, identifier.split(","));
}
-
} else if (identifier.equalsIgnoreCase(script.getIdentifier())) {
return script.evaluate(engine, p);
}
}
-
return null;
}
@@ -135,7 +131,6 @@ public class JavascriptExpansion extends PlaceholderExpansion implements Cacheab
}
public boolean addJavascriptPlaceholder(JavascriptPlaceholder p) {
-
if (p == null) {
return false;
}
@@ -144,7 +139,6 @@ public class JavascriptExpansion extends PlaceholderExpansion implements Cacheab
scripts.add(p);
return true;
}
-
for (JavascriptPlaceholder pl : scripts) {
if (pl.getIdentifier().equalsIgnoreCase(p.getIdentifier())) {
diff --git a/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptPlaceholder.java b/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptPlaceholder.java
index f34e65e..08f96e4 100644
--- a/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptPlaceholder.java
+++ b/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptPlaceholder.java
@@ -20,9 +20,17 @@
*/
package com.extendedclip.papi.expansion.javascript;
+import java.io.File;
+import java.io.IOException;
+import java.util.Map.Entry;
+import java.util.Set;
+
import javax.script.ScriptEngine;
import javax.script.ScriptException;
+import org.bukkit.configuration.InvalidConfigurationException;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import me.clip.placeholderapi.PlaceholderAPI;
@@ -40,8 +48,15 @@ public class JavascriptPlaceholder {
private JavascriptReturnType type;
+ private PlaceholderData data = null;
+
+ private File dataFile;
+
+ private FileConfiguration cfg;
+
+ private final String FILEDIR = PlaceholderAPIPlugin.getInstance().getDataFolder() + File.separator + "expansions" + File.separator + "javascript_data";
+
public JavascriptPlaceholder(String identifier, JavascriptReturnType type, String expression, String trueResult, String falseResult) {
-
if (type == null) {
throw new IllegalArgumentException("Javascript placeholder type must set as 'boolean' or 'string'!");
}
@@ -53,23 +68,97 @@ public class JavascriptPlaceholder {
} else if (expression == null) {
throw new IllegalArgumentException("Javascript placeholder expression must not be null!");
}
-
- this.identifier = identifier;
+ this.identifier = identifier;
this.expression = expression;
if (type == JavascriptReturnType.BOOLEAN) {
-
if (trueResult == null) {
throw new IllegalArgumentException("Javascript boolean placeholder must contain a true_result!");
} else if (falseResult == null) {
throw new IllegalArgumentException("Javascript boolean placeholder must contain a false_result!");
}
-
this.trueResult = trueResult;
-
this.falseResult = falseResult;
-
+ }
+
+ File dir = new File(FILEDIR);
+
+ try {
+ if (!dir.exists()) {
+ dir.mkdirs();
+ }
+ } catch (SecurityException e) {
+ e.printStackTrace();
+ }
+
+ dataFile = new File(FILEDIR, identifier + "_data.yml");
+ }
+
+ public boolean loadData() {
+ cfg = new YamlConfiguration();
+
+ if (!dataFile.exists()) {
+ return false;
+ }
+ try {
+ cfg.load(dataFile);
+ } catch (IOException e) {
+ e.printStackTrace();
+ return false;
+ } catch (InvalidConfigurationException e) {
+ e.printStackTrace();
+ return false;
+ }
+
+ final Set keys = cfg.getKeys(true);
+
+ if (keys == null || keys.isEmpty()) {
+ return false;
+ }
+
+ boolean save = false;
+
+ PlaceholderData data = new PlaceholderData();
+
+ for (String k : keys) {
+ data.set(k, cfg.get(k));
+ cfg.set(k, null);
+ save = true;
+ }
+
+ if (!data.isEmpty()) {
+ this.setData(data);
+ }
+
+ if (save) {
+ try {
+ cfg.save(dataFile);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return save;
+ }
+
+ public boolean saveData() {
+ if (data == null || data.isEmpty()) {
+ return false;
+ }
+
+ if (cfg == null) {
+ return false;
+ }
+
+ for (Entry d : data.getData().entrySet()) {
+ cfg.set(d.getKey(), d.getValue());
+ }
+
+ try {
+ cfg.save(dataFile);
+ return true;
+ } catch (IOException e) {
+ return false;
}
}
@@ -97,19 +186,20 @@ public class JavascriptPlaceholder {
String exp = PlaceholderAPI.setPlaceholders(p, expression);
try {
-
String[] c = null;
if (args != null && args.length > 0) {
-
for (int i = 0 ; i < args.length ; i++) {
if (args[i] == null || args[i].isEmpty()) {
continue;
}
+
String s = PlaceholderAPI.setBracketPlaceholders(p, args[i]);
+
if (c == null) {
c = new String[args.length];
}
+
c[i] = s;
}
}
@@ -120,6 +210,8 @@ public class JavascriptPlaceholder {
engine.put("args", c);
+ engine.put("Data", getData());
+
engine.put("BukkitPlayer", p);
Object result = engine.eval(exp);
@@ -149,4 +241,23 @@ public class JavascriptPlaceholder {
}
return "invalid javascript";
}
+
+ public PlaceholderData getData() {
+ if (data == null) {
+ data = new PlaceholderData();
+ }
+ return data;
+ }
+
+ public void setData(PlaceholderData data) {
+ this.data = data;
+ }
+
+ public void cleanup() {
+ if (this.data != null) {
+ this.data.clear();
+ this.data = null;
+ }
+ this.cfg = null;
+ }
}
diff --git a/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptPlaceholdersConfig.java b/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptPlaceholdersConfig.java
index ecdcb68..292585d 100644
--- a/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptPlaceholdersConfig.java
+++ b/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptPlaceholdersConfig.java
@@ -255,6 +255,9 @@ public class JavascriptPlaceholdersConfig {
if (added) {
plugin.getLogger().info("Javascript " + type.getType() + " placeholder %javascript_" + identifier + "% has been loaded!");
+ if (pl.loadData()) {
+ plugin.getLogger().info("Loaded data for: %javascript_" + identifier + "%");
+ }
} else {
plugin.getLogger().warning("Javascript " + type.getType() + " placeholder %javascript_" + identifier + "% is a duplicate!");
}
diff --git a/src/main/java/com/extendedclip/papi/expansion/javascript/PlaceholderData.java b/src/main/java/com/extendedclip/papi/expansion/javascript/PlaceholderData.java
new file mode 100644
index 0000000..56f6c35
--- /dev/null
+++ b/src/main/java/com/extendedclip/papi/expansion/javascript/PlaceholderData.java
@@ -0,0 +1,44 @@
+package com.extendedclip.papi.expansion.javascript;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class PlaceholderData {
+
+ private Map map = new HashMap<>();
+
+ public PlaceholderData(Map data) {
+ this.map = data;
+ }
+
+ public PlaceholderData() {
+ }
+
+ public Map getData() {
+ return map;
+ }
+
+ public void clear() {
+ map.clear();
+ }
+
+ public boolean exists(String key) {
+ return map.containsKey(key);
+ }
+
+ public Object get(String key) {
+ return map.get(key);
+ }
+
+ public boolean remove(String key) {
+ return map.remove(key) != null;
+ }
+
+ public void set(String key, Object value) {
+ map.put(key, value);
+ }
+
+ public boolean isEmpty() {
+ return map.isEmpty();
+ }
+}