Offline player supporrt

This commit is contained in:
extendedclip 2020-03-09 12:34:51 -04:00
parent 28d35230bc
commit c7d421a9a4
3 changed files with 525 additions and 508 deletions

View File

@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>com.extendedclip.papi.expansion.javascript</groupId> <groupId>com.extendedclip.papi.expansion.javascript</groupId>
<artifactId>javascript-expansion</artifactId> <artifactId>javascript-expansion</artifactId>
<version>1.4.2</version> <version>1.5.0</version>
<name>PAPI-Expansion-Javascript</name> <name>PAPI-Expansion-Javascript</name>
<description>PlaceholderAPI expansion for javascript placeholders</description> <description>PlaceholderAPI expansion for javascript placeholders</description>
@ -13,7 +13,7 @@
</repository> </repository>
<repository> <repository>
<id>placeholderapi</id> <id>placeholderapi</id>
<url>http://repo.extendedclip.com/content/repositories/placeholderapi/</url> <url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url>
</repository> </repository>
</repositories> </repositories>
@ -21,13 +21,13 @@
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId> <artifactId>spigot-api</artifactId>
<version>1.12.2-R0.1-SNAPSHOT</version> <version>1.14.1-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>me.clip</groupId> <groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId> <artifactId>placeholderapi</artifactId>
<version>LATEST</version> <version>2.10.2</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
</dependencies> </dependencies>

View File

@ -28,13 +28,15 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import javax.script.ScriptEngine; import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager; import javax.script.ScriptEngineManager;
import me.clip.placeholderapi.expansion.Cacheable; import me.clip.placeholderapi.expansion.Cacheable;
import me.clip.placeholderapi.expansion.Configurable; import me.clip.placeholderapi.expansion.Configurable;
import me.clip.placeholderapi.expansion.PlaceholderExpansion; import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import me.clip.placeholderapi.util.Msg;
import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
@ -56,6 +58,8 @@ public class JavascriptExpansion extends PlaceholderExpansion implements Cacheab
instance = this; instance = this;
} }
private boolean debug = false;
/* /*
* I am just testing the waters here because there is no command system for expansions... * I am just testing the waters here because there is no command system for expansions...
*/ */
@ -78,32 +82,36 @@ public class JavascriptExpansion extends PlaceholderExpansion implements Cacheab
// default command // default command
if (!msg.contains(" ")) { if (!msg.contains(" ")) {
Msg.msg(p, "&7Javascript expansion v: &f" + getVersion()); msg(p, "&7Javascript expansion v: &f" + getVersion());
Msg.msg(p, "&7Created by: &f" + getAuthor()); msg(p, "&7Created by: &f" + getAuthor());
Msg.msg(p, "&fWiki: &ahttps://github.com/PlaceholderAPI-Expansions/Javascript-Expansion/wiki"); msg(p, "&fWiki: &ahttps://github.com/PlaceholderAPI-Expansions/Javascript-Expansion/wiki");
Msg.msg(p, "&r"); msg(p, "&r");
Msg.msg(p, "&7/papijsp reload &7- &fReload your javascripts without reloading PlaceholderAPI"); msg(p, "&7/papijsp reload &7- &fReload your javascripts without reloading PlaceholderAPI");
Msg.msg(p, "&7/papijsp list &7- &fList loaded script identifiers."); msg(p, "&7/papijsp list &7- &fList loaded script identifiers.");
return; return;
} }
if (msg.equals("/papijsp reload")) { if (msg.equals("/papijsp reload")) {
Msg.msg(p, "&aReloading..."); msg(p, "&aReloading...");
int l = this.reloadScripts(); int l = this.reloadScripts();
Msg.msg(p, l + " &7script" + (l == 1 ? "" : "s")+ " loaded"); msg(p, l + " &7script" + (l == 1 ? "" : "s")+ " loaded");
return; return;
} }
if (msg.equals("/papijsp list")) { if (msg.equals("/papijsp list")) {
List<String> loaded = this.getLoadedIdentifiers(); List<String> loaded = this.getLoadedIdentifiers();
Msg.msg(p, loaded.size() + " &7script" + (loaded.size() == 1 ? "" : "s")+ " loaded"); msg(p, loaded.size() + " &7script" + (loaded.size() == 1 ? "" : "s")+ " loaded");
Msg.msg(p, String.join(", ", loaded)); msg(p, String.join(", ", loaded));
return; return;
} }
event.getPlayer().sendMessage("&cIncorrect usage &7- &f/papijsp"); event.getPlayer().sendMessage("&cIncorrect usage &7- &f/papijsp");
} }
public void msg(Player p, String text) {
p.sendMessage(ChatColor.translateAlternateColorCodes('&', text));
}
@Override @Override
public String getAuthor() { public String getAuthor() {
return "clip"; return "clip";
@ -128,15 +136,31 @@ public class JavascriptExpansion extends PlaceholderExpansion implements Cacheab
public boolean register() { public boolean register() {
if (globalEngine == null) { if (globalEngine == null) {
try { try {
globalEngine = new ScriptEngineManager().getEngineByName(getString("engine", "javascript")); globalEngine = new ScriptEngineManager().getEngineByName(getString("engine", "nashorn"));
} catch (NullPointerException ex) { } catch (NullPointerException ex) {
getPlaceholderAPI().getLogger().warning("Javascript engine type was invalid! Defaulting to 'javascript'"); getPlaceholderAPI().getLogger().warning("Javascript engine type was invalid! Defaulting to 'nashorn'");
globalEngine = new ScriptEngineManager().getEngineByName("javascript"); globalEngine = new ScriptEngineManager().getEngineByName("nashorn");
} }
} }
debug = (boolean) get("debug", false);
config = new JavascriptPlaceholdersConfig(this); config = new JavascriptPlaceholdersConfig(this);
config.loadPlaceholders(); config.loadPlaceholders();
if (debug) {
System.out.println("Java version: " + System.getProperty("java.version"));
ScriptEngineManager manager = new ScriptEngineManager();
List<ScriptEngineFactory> factories = manager.getEngineFactories();
System.out.println("displaying all script engine factories:");
for (ScriptEngineFactory factory : factories) {
System.out.println("Engine name: " + factory.getEngineName());
System.out.println("version: " + factory.getEngineVersion());
System.out.println("lang name: " + factory.getLanguageName());
System.out.println("lang version: " + factory.getLanguageVersion());
System.out.println("extensions: " + factory.getExtensions());
System.out.println("mime types: " + factory.getMimeTypes());
System.out.println("names: " + factory.getNames());
}
}
return super.register(); return super.register();
} }
@ -152,7 +176,7 @@ public class JavascriptExpansion extends PlaceholderExpansion implements Cacheab
} }
@Override @Override
public String onPlaceholderRequest(Player p, String identifier) { public String onRequest( OfflinePlayer p, String identifier) {
if (p == null) { if (p == null) {
return ""; return "";
} }
@ -218,6 +242,7 @@ public class JavascriptExpansion extends PlaceholderExpansion implements Cacheab
public Map<String, Object> getDefaults() { public Map<String, Object> getDefaults() {
Map<String, Object> def = new HashMap<String, Object>(); Map<String, Object> def = new HashMap<String, Object>();
def.put("engine", "javascript"); def.put("engine", "javascript");
def.put("debug", false);
return def; return def;
} }

View File

@ -23,183 +23,175 @@ package com.extendedclip.papi.expansion.javascript;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.Set; import java.util.Set;
import javax.script.ScriptEngine; import javax.script.ScriptEngine;
import javax.script.ScriptException; import javax.script.ScriptException;
import me.clip.placeholderapi.PlaceholderAPI;
import me.clip.placeholderapi.PlaceholderAPIPlugin;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import me.clip.placeholderapi.PlaceholderAPI;
import me.clip.placeholderapi.PlaceholderAPIPlugin;
public class JavascriptPlaceholder { public class JavascriptPlaceholder {
private ScriptEngine engine = null; private ScriptEngine engine = null;
private String identifier;
private String script;
private ScriptData data = null;
private File dataFile;
private FileConfiguration cfg;
private String identifier; private final String FILEDIR = PlaceholderAPIPlugin.getInstance().getDataFolder() + File.separator + "javascripts"+ File.separator + "javascript_data";
private String script; public JavascriptPlaceholder(ScriptEngine engine, String identifier, String script) {
Validate.notNull(engine, "ScriptEngine can not be null");
Validate.notNull(identifier, "Identifier can not be null");
Validate.notNull(script, "script can not be null");
this.engine = engine;
this.identifier = identifier;
this.script = script;
File dir = new File(FILEDIR);
private ScriptData data = null; try {
if (!dir.exists()) {
dir.mkdirs();
}
} catch (SecurityException e) {
e.printStackTrace();
}
data = new ScriptData();
dataFile = new File(FILEDIR, identifier + "_data.yml");
engine.put("Data", data);
engine.put("BukkitServer", Bukkit.getServer());
engine.put("Expansion", JavascriptExpansion.getInstance());
engine.put("Placeholder", this);
}
private File dataFile; public String getIdentifier() {
return identifier;
}
private FileConfiguration cfg; public String getScript() {
return script;
}
private final String FILEDIR = PlaceholderAPIPlugin.getInstance().getDataFolder() + File.separator + "javascripts" + File.separator + "javascript_data"; public String evaluate(OfflinePlayer p, String... args) {
String exp = PlaceholderAPI.setPlaceholders(p, script);
public JavascriptPlaceholder(ScriptEngine engine, String identifier, String script) { try {
Validate.notNull(engine, "ScriptEngine can not be null"); String[] c = null;
Validate.notNull(identifier, "Identifier can not be null");
Validate.notNull(script, "script can not be null");
this.engine = engine;
this.identifier = identifier;
this.script = script;
File dir = new File(FILEDIR);
try { if (args != null && args.length > 0) {
if (!dir.exists()) { for (int i = 0; i < args.length; i++) {
dir.mkdirs(); if (args[i] == null || args[i].isEmpty()) {
} continue;
} catch (SecurityException e) { }
e.printStackTrace();
}
data = new ScriptData();
dataFile = new File(FILEDIR, identifier + "_data.yml");
engine.put("Data", data);
engine.put("BukkitServer", Bukkit.getServer());
engine.put("Expansion", JavascriptExpansion.getInstance());
engine.put("Placeholder", this);
}
public String getIdentifier() { String s = PlaceholderAPI.setBracketPlaceholders(p, args[i]);
return identifier;
}
public String getScript() { if (c == null) {
return script; c = new String[args.length];
} }
public String evaluate(Player p, String... args) { c[i] = s;
String exp = PlaceholderAPI.setPlaceholders(p, script);
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;
}
}
if (c == null) {
c = new String[]{};
}
engine.put("args", c);
engine.put("BukkitPlayer", p);
Object result = engine.eval(exp);
return result != null ? PlaceholderAPI.setBracketPlaceholders(p, result.toString()) : "";
} catch (ScriptException ex) {
ex.printStackTrace();
} }
return "Script error"; }
}
public ScriptData getData() { if (c == null) {
// this should never be null but just in case setData(null) is called c = new String[]{};
if (data == null) { }
data = new ScriptData();
}
return data;
}
public void setData(ScriptData data) { engine.put("args", c);
this.data = data; engine.put("BukkitPlayer", p != null && p.isOnline() ? p.getPlayer() : null);
} engine.put("OfflinePlayer", p);
Object result = engine.eval(exp);
return result != null ? PlaceholderAPI.setBracketPlaceholders(p, result.toString()) : "";
} catch (ScriptException ex) {
ex.printStackTrace();
}
return "Script error";
}
public boolean loadData() { public ScriptData getData() {
// this should never be null but just in case setData(null) is called
if (data == null) {
data = new ScriptData();
}
return data;
}
cfg = new YamlConfiguration(); public void setData(ScriptData data) {
this.data = data;
}
if (!dataFile.exists()) { public boolean loadData() {
return false;
}
try {
cfg.load(dataFile);
} catch (IOException e) {
e.printStackTrace();
return false;
} catch (InvalidConfigurationException e) {
e.printStackTrace();
return false;
}
final Set<String> keys = cfg.getKeys(true); cfg = new YamlConfiguration();
if (keys == null || keys.isEmpty()) { if (!dataFile.exists()) {
return false; return false;
} }
try {
cfg.load(dataFile);
} catch (IOException e) {
e.printStackTrace();
return false;
} catch (InvalidConfigurationException e) {
e.printStackTrace();
return false;
}
if (data == null) { final Set<String> keys = cfg.getKeys(true);
data = new ScriptData();
} else {
data.clear();
}
keys.stream().forEach(k -> { if (keys == null || keys.isEmpty()) {
data.set(k, cfg.get(k)); return false;
}); }
if (!data.isEmpty()) { if (data == null) {
this.setData(data); data = new ScriptData();
return true; } else {
} data.clear();
return false; }
}
public boolean saveData() { keys.stream().forEach(k -> {
if (data == null || data.isEmpty()) { data.set(k, cfg.get(k));
return false; });
}
if (cfg == null) { if (!data.isEmpty()) {
return false; this.setData(data);
} return true;
}
return false;
}
data.getData().entrySet().forEach(e -> { public boolean saveData() {
cfg.set(e.getKey(), e.getValue()); if (data == null || data.isEmpty()) {
}); return false;
}
try { if (cfg == null) {
cfg.save(dataFile); return false;
return true; }
} catch (IOException e) {
return false;
}
}
public void cleanup() { data.getData().entrySet().forEach(e -> {
if (this.data != null) { cfg.set(e.getKey(), e.getValue());
this.data.clear(); });
this.data = null;
} try {
this.cfg = null; cfg.save(dataFile);
} return true;
} catch (IOException e) {
return false;
}
}
public void cleanup() {
if (this.data != null) {
this.data.clear();
this.data = null;
}
this.cfg = null;
}
} }