diff --git a/pom.xml b/pom.xml index c2cf52e..335137c 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.extendedclip.papi.expansion.javascript javascript-expansion - 1.5.3 + 1.5.4 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 d141dbd..c9cf214 100644 --- a/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptExpansion.java +++ b/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptExpansion.java @@ -21,16 +21,6 @@ package com.extendedclip.papi.expansion.javascript; import com.extendedclip.papi.expansion.javascript.cloud.GithubScriptManager; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import javax.script.ScriptEngine; -import javax.script.ScriptEngineFactory; -import javax.script.ScriptEngineManager; import me.clip.placeholderapi.expansion.Cacheable; import me.clip.placeholderapi.expansion.Configurable; import me.clip.placeholderapi.expansion.PlaceholderExpansion; @@ -38,222 +28,232 @@ import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandMap; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineFactory; +import javax.script.ScriptEngineManager; +import java.lang.reflect.Field; +import java.util.*; + public class JavascriptExpansion extends PlaceholderExpansion implements Cacheable, Configurable { - private ScriptEngine globalEngine = null; + private ScriptEngine globalEngine = null; - private JavascriptPlaceholdersConfig config; - private final Set scripts = new HashSet<>(); - private final String VERSION = getClass().getPackage().getImplementationVersion(); - private static JavascriptExpansion instance; - private boolean debug; - private GithubScriptManager githubManager; - private JavascriptExpansionCommands commands; - private CommandMap commandMap; + private JavascriptPlaceholdersConfig config; + private final Set scripts = new HashSet<>(); + private final String VERSION = getClass().getPackage().getImplementationVersion(); + private static JavascriptExpansion instance; + private boolean debug; + private GithubScriptManager githubManager; + private JavascriptExpansionCommands commands; + private CommandMap commandMap; - public JavascriptExpansion() { - instance = this; - try { - final Field f = Bukkit.getServer().getClass().getDeclaredField("commandMap"); - f.setAccessible(true); - commandMap = (CommandMap) f.get(Bukkit.getServer()); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public String getAuthor() { - return "clip"; - } - - @Override - public String getIdentifier() { - return "javascript"; - } - - @Override - public String getPlugin() { - return null; - } - - @Override - public String getVersion() { - return VERSION; - } - - @Override - public boolean register() { - if (globalEngine == null) { - try { - globalEngine = new ScriptEngineManager().getEngineByName(getString("engine", "nashorn")); - } catch (NullPointerException ex) { - getPlaceholderAPI().getLogger() - .warning("Javascript engine type was invalid! Defaulting to 'nashorn'"); - globalEngine = new ScriptEngineManager().getEngineByName("nashorn"); - } + public JavascriptExpansion() { + instance = this; + try { + final Field f = Bukkit.getServer().getClass().getDeclaredField("commandMap"); + f.setAccessible(true); + commandMap = (CommandMap) f.get(Bukkit.getServer()); + } catch (Exception e) { + e.printStackTrace(); + } } - debug = (boolean) get("debug", false); - config = new JavascriptPlaceholdersConfig(this); - config.loadPlaceholders(); - - if (debug) { - System.out.println("Java version: " + System.getProperty("java.version")); - final ScriptEngineManager manager = new ScriptEngineManager(); - final List factories = manager.getEngineFactories(); - System.out.println("Displaying all script engine factories."); - - for (ScriptEngineFactory factory : factories) { - System.out.println(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: ." + String.join(", .", factory.getExtensions())); - System.out.println(" Mime types: " + String.join(", ", factory.getMimeTypes())); - System.out.println(" Names: " + String.join(", ", factory.getNames())); - } + @Override + public String getAuthor() { + return "clip"; } - if ((Boolean) get("github_script_downloads", false)) { - githubManager = new GithubScriptManager(this); - githubManager.fetch(); + @Override + public String getIdentifier() { + return "javascript"; } - registerCommand(); - return super.register(); - } - - @Override - public void clear() { - unregisterCommand(); - scripts.forEach(s -> { - s.saveData(); - s.cleanup(); - }); - - if (githubManager != null) { - githubManager.clear(); - githubManager = null; + @Override + public String getPlugin() { + return null; } - scripts.clear(); - globalEngine = null; - instance = null; - } - - @Override - public String onRequest(OfflinePlayer p, String identifier) { - if (p == null) { - return ""; + @Override + public String getVersion() { + return VERSION; } - if (scripts.isEmpty()) { - return null; + @Override + public boolean register() { + if (globalEngine == null) { + try { + globalEngine = new ScriptEngineManager().getEngineByName(getString("engine", "nashorn")); + } catch (NullPointerException ex) { + getPlaceholderAPI().getLogger().warning("Javascript engine type was invalid! Defaulting to 'nashorn'"); + globalEngine = new ScriptEngineManager().getEngineByName("nashorn"); + } + } + + debug = (boolean) get("debug", false); + config = new JavascriptPlaceholdersConfig(this); + config.loadPlaceholders(); + + if (debug) { + System.out.println("Java version: " + System.getProperty("java.version")); + final ScriptEngineManager manager = new ScriptEngineManager(); + final List factories = manager.getEngineFactories(); + System.out.println("Displaying all script engine factories."); + + for (ScriptEngineFactory factory : factories) { + System.out.println(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: ." + String.join(", .", factory.getExtensions())); + System.out.println(" Mime types: " + String.join(", ", factory.getMimeTypes())); + System.out.println(" Names: " + String.join(", ", factory.getNames())); + } + } + + if ((Boolean) get("github_script_downloads", false)) { + githubManager = new GithubScriptManager(this); + githubManager.fetch(); + } + + registerCommand(); + return super.register(); } - for (JavascriptPlaceholder script : scripts) { - if (identifier.startsWith(script.getIdentifier() + "_")) { - identifier = identifier.replace(script.getIdentifier() + "_", ""); - return !identifier.contains(",") ? script.evaluate(p, identifier) - : script.evaluate(p, identifier.split(",")); - } else if (identifier.equalsIgnoreCase(script.getIdentifier())) { - return script.evaluate(p); - } - } - return null; - } + @Override + public void clear() { + unregisterCommand(); + scripts.forEach(s -> { + s.saveData(); + s.cleanup(); + }); - public boolean addJSPlaceholder(JavascriptPlaceholder p) { - if (p == null) { - return false; + if (githubManager != null) { + githubManager.clear(); + githubManager = null; + } + + scripts.clear(); + globalEngine = null; + instance = null; } - if (scripts.isEmpty()) { - scripts.add(p); - return true; + @Override + public String onRequest(OfflinePlayer p, String identifier) { + if (p == null) { + return ""; + } + + if (scripts.isEmpty()) { + return null; + } + + for (JavascriptPlaceholder script : scripts) { + if (identifier.startsWith(script.getIdentifier() + "_")) { + identifier = identifier.replace(script.getIdentifier() + "_", ""); + return !identifier.contains(",") ? script.evaluate(p, identifier) + : script.evaluate(p, identifier.split(",")); + } else if (identifier.equalsIgnoreCase(script.getIdentifier())) { + return script.evaluate(p); + } + } + return null; } - if (scripts.stream().filter(s -> s.getIdentifier().equalsIgnoreCase(p.getIdentifier())) - .findFirst().orElse(null) != null) { - return false; + public boolean addJSPlaceholder(JavascriptPlaceholder p) { + if (p == null) { + return false; + } + + if (scripts.isEmpty()) { + scripts.add(p); + return true; + } + + if (scripts.stream().filter(s -> s.getIdentifier().equalsIgnoreCase(p.getIdentifier())) + .findFirst().orElse(null) != null) { + return false; + } + + scripts.add(p); + return true; } - scripts.add(p); - return true; - } - - public Set getJSPlaceholders() { - return scripts; - } - - public List getLoadedIdentifiers() { - List l = new ArrayList<>(); - scripts.forEach(s -> l.add(s.getIdentifier())); - return l; - } - - public JavascriptPlaceholder getJSPlaceholder(String identifier) { - return scripts.stream().filter(s -> s.getIdentifier().equalsIgnoreCase(identifier)).findFirst() - .orElse(null); - } - - public int getAmountLoaded() { - return scripts.size(); - } - - public ScriptEngine getGlobalEngine() { - return globalEngine; - } - - public JavascriptPlaceholdersConfig getConfig() { - return config; - } - - @Override - public Map getDefaults() { - Map def = new HashMap<>(); - def.put("engine", "javascript"); - def.put("debug", false); - def.put("github_script_downloads", false); - return def; - } - - protected int reloadScripts() { - scripts.forEach(s -> { - s.saveData(); - s.cleanup(); - }); - scripts.clear(); - config.reload(); - return config.loadPlaceholders(); - } - - public static JavascriptExpansion getInstance() { - return instance; - } - - public GithubScriptManager getGithubScriptManager() { - return githubManager; - } - - public void setGithubScriptManager(GithubScriptManager manager) { - this.githubManager = manager; - } - - private boolean unregisterCommand() { - if (commandMap == null || commands == null) { - return false; + public Set getJSPlaceholders() { + return scripts; } - return commands.unregister(commandMap); - } - private boolean registerCommand() { - if (commandMap == null) { - return false; + public List getLoadedIdentifiers() { + List l = new ArrayList<>(); + scripts.forEach(s -> l.add(s.getIdentifier())); + return l; + } + + public JavascriptPlaceholder getJSPlaceholder(String identifier) { + return scripts.stream() + .filter(s -> s.getIdentifier().equalsIgnoreCase(identifier)) + .findFirst() + .orElse(null); + } + + public int getAmountLoaded() { + return scripts.size(); + } + + public ScriptEngine getGlobalEngine() { + return globalEngine; + } + + public JavascriptPlaceholdersConfig getConfig() { + return config; + } + + @Override + public Map getDefaults() { + Map def = new HashMap<>(); + def.put("engine", "javascript"); + def.put("debug", false); + def.put("github_script_downloads", false); + return def; + } + + protected int reloadScripts() { + scripts.forEach(s -> { + s.saveData(); + s.cleanup(); + }); + scripts.clear(); + config.reload(); + return config.loadPlaceholders(); + } + + public static JavascriptExpansion getInstance() { + return instance; + } + + public GithubScriptManager getGithubScriptManager() { + return githubManager; + } + + public void setGithubScriptManager(GithubScriptManager manager) { + this.githubManager = manager; + } + + @SuppressWarnings("UnusedReturnValue") + private boolean unregisterCommand() { + if (commandMap == null || commands == null) { + return false; + } + return commands.unregister(commandMap); + } + + @SuppressWarnings("UnusedReturnValue") + private boolean registerCommand() { + if (commandMap == null) { + return false; + } + + commands = new JavascriptExpansionCommands(this); + commandMap.register("papi" + commands.getName(), commands); + return commands.isRegistered(); } - commands = new JavascriptExpansionCommands(this); - commandMap.register("papi" + commands.getName(), commands); - return commands.isRegistered(); - } } diff --git a/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptExpansionCommands.java b/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptExpansionCommands.java index 08d7e45..4756d47 100644 --- a/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptExpansionCommands.java +++ b/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptExpansionCommands.java @@ -23,20 +23,23 @@ package com.extendedclip.papi.expansion.javascript; import com.extendedclip.papi.expansion.javascript.cloud.GithubScript; import com.extendedclip.papi.expansion.javascript.cloud.GithubScriptManager; import me.clip.placeholderapi.PlaceholderAPIPlugin; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.util.StringUtil; -import java.util.Arrays; -import java.util.List; -import java.util.Set; +import java.io.File; +import java.util.*; import java.util.stream.Collectors; public class JavascriptExpansionCommands extends Command { - private JavascriptExpansion expansion; + private final JavascriptExpansion expansion; private final String PERMISSION = "placeholderapi.js.admin"; - private String command; + private final String command; public JavascriptExpansionCommands(JavascriptExpansion expansion) { super("jsexpansion"); @@ -47,6 +50,44 @@ public class JavascriptExpansionCommands extends Command { this.setPermission(PERMISSION); } + @Override + public List tabComplete(CommandSender sender, String alias, String[] args) throws IllegalArgumentException { + if (!sender.hasPermission(PERMISSION)) { + return Collections.emptyList(); + } + + final List commands = new ArrayList<>(Arrays.asList("list", "parse", "reload")); + final List completion = new ArrayList<>(); + + if (expansion.getGithubScriptManager() != null) { + commands.add(0, "git"); + } + + if (args.length == 1) { + return StringUtil.copyPartialMatches(args[0], commands, completion); + } + + if (args[0].equalsIgnoreCase("git")) { + if (expansion.getGithubScriptManager() == null) { + return Collections.emptyList(); + } + + if (args.length == 2) { + return StringUtil.copyPartialMatches(args[1], Arrays.asList("download", "enable", "info", "list", "refresh"), completion); + } + + if (args.length == 3 && args[1].equalsIgnoreCase("download")) { + if (expansion.getGithubScriptManager().getAvailableScripts() == null) { + return Collections.emptyList(); + } + + return StringUtil.copyPartialMatches(args[2], expansion.getGithubScriptManager().getAvailableScripts().stream().map(GithubScript::getName).collect(Collectors.toList()), completion); + } + } + + return Collections.emptyList(); + } + @Override public boolean execute(CommandSender sender, String label, String[] args) { if (!sender.hasPermission(PERMISSION)) { @@ -60,16 +101,17 @@ public class JavascriptExpansionCommands extends Command { "&eCreated by: &f" + expansion.getAuthor(), "&eWiki: &fhttps://github.com/PlaceholderAPI/Javascript-Expansion/wiki", "&r", - "&e/" + command + " reload &7- &fReload your javascripts without reloading PlaceholderAPI", - "&e/" + command + " list &7- &fList loaded script identifiers." + "&e/" + command + " reload &7- &fReload your javascripts without reloading PlaceholderAPI.", + "&e/" + command + " list &7- &fList loaded script identifiers.", + "&e/" + command + " parse [me/player] [code] &7- &fTest JavaScript code in chat." ); if (expansion.getGithubScriptManager() != null) { msg(sender, "&e/" + command + " git refresh &7- &fRefresh available Github scripts", - "&e/" + command + " git download &7- &fDownload a script from the js expansion github.", + "&e/" + command + " git download [name] &7- &fDownload a script from the js expansion github.", "&e/" + command + " git list &7- &fList available scripts in the js expansion github.", - "&e/" + command + " git info (name) &7- &fGet the description and url of a specific script." + "&e/" + command + " git info [name] &7- &fGet the description and url of a specific script." ); } @@ -77,30 +119,14 @@ public class JavascriptExpansionCommands extends Command { } switch (args[0].toLowerCase()) { - case "reload": { - msg(sender, "&aJavascriptExpansion reloading..."); - final int scripts = expansion.reloadScripts(); - msg(sender, scripts + " &7script" + plural(scripts) + " loaded"); - return true; - } - - case "list": { - final List loaded = expansion.getLoadedIdentifiers(); - msg(sender, - loaded.size() + " &7script" + plural(loaded.size()) + " loaded.", - String.join(", ", loaded) - ); - return true; - } - case "git": { if (expansion.getGithubScriptManager() == null) { - msg(sender, "&8This feature is disabled in the PlaceholderAPI config."); + msg(sender, "&cThis feature is disabled in the PlaceholderAPI config."); return true; } if (args.length < 2) { - msg(sender, "&cIncorrect usage!"); + msg(sender, "&cIncorrect usage! Type '&f/" + command + "&c' for more help."); return true; } @@ -123,14 +149,14 @@ public class JavascriptExpansionCommands extends Command { case "info": { if (args.length < 3) { - msg(sender, "&4Incorrect usage! &f/" + command + " git info "); + msg(sender, "&cIncorrect usage! &f/" + command + " git info [name]"); return true; } final GithubScript script = manager.getScript(args[2]); if (script == null) { - msg(sender, "&4The script &f" + args[2] + " &4does not exist!"); + msg(sender, "&cThe script &f" + args[2] + " &cdoes not exist!"); return true; } @@ -146,54 +172,108 @@ public class JavascriptExpansionCommands extends Command { case "download": { if (args.length < 3) { - msg(sender, "&4Incorrect usage! &f/" + command + " git download "); + msg(sender, "&cIncorrect usage! &f/" + command + " git download [name]"); return true; } final GithubScript script = manager.getScript(args[2]); if (script == null) { - msg(sender, "&4The script &f" + args[2] + " &4does not exist!"); + msg(sender, "&cThe script &f" + args[2] + " &cdoes not exist!"); + return true; + } + + if (new File(expansion.getGithubScriptManager().getJavascriptsFolder(), script.getName() + ".js").exists()) { + msg(sender, "&cCould not download " + script.getName() + " because a file with the same name already exist in the javascripts folder."); return true; } manager.downloadScript(script); - msg(sender, "&6Download started... &eCheck the scripts folder in a moment..."); + msg(sender, "&aDownload started. &eCheck the scripts folder in a moment..."); return true; } - case "enabled": - if (args.length < 3) { - msg(sender, "&4Incorrect usage! &f/" + command + " git enabled "); - return true; - } + case "enabled": + if (args.length < 3) { + msg(sender, "&cIncorrect usage! &f/" + command + " git enabled [true/false]"); + return true; + } - Boolean enabled = Boolean.parseBoolean(args[2]); - PlaceholderAPIPlugin papi = expansion.getPlaceholderAPI(); - papi.getConfig().set("expansions." + this.getName() + ".github_script_downloads", enabled); - papi.saveConfig(); - papi.reloadConfig(); - if (!enabled) { - if (expansion.getGithubScriptManager() != null) { - expansion.getGithubScriptManager().clear(); - expansion.setGithubScriptManager(null); - } - } else { - if (expansion.getGithubScriptManager() == null) { - expansion.setGithubScriptManager(new GithubScriptManager(expansion)); - } - expansion.getGithubScriptManager().fetch(); - } - msg(sender, "&6Git script downloads set to: &e" + enabled); - return true; + final boolean enabled = Boolean.parseBoolean(args[2]); + final PlaceholderAPIPlugin papi = expansion.getPlaceholderAPI(); + + papi.getConfig().set("expansions." + this.getName() + ".github_script_downloads", enabled); + papi.saveConfig(); + papi.reloadConfig(); + + if (!enabled) { + if (expansion.getGithubScriptManager() != null) { + expansion.getGithubScriptManager().clear(); + expansion.setGithubScriptManager(null); + } + } else { + if (expansion.getGithubScriptManager() == null) { + expansion.setGithubScriptManager(new GithubScriptManager(expansion)); + } + expansion.getGithubScriptManager().fetch(); + } + + msg(sender, "&6Git script downloads set to: &e" + enabled); + return true; default: { - msg(sender, "&4Incorrect usage! &f/" + command + " &7for more help."); + msg(sender, "&cIncorrect usage! Type '&f/" + command + "&c' for more help."); return true; } } } + case "list": { + final List loaded = expansion.getLoadedIdentifiers(); + msg(sender, + loaded.size() + " &7script" + plural(loaded.size()) + " loaded.", + String.join(", ", loaded) + ); + return true; + } + + case "parse": { + if (args.length < 3) { + msg(sender, "&cIncorrect usage! &f/" + command + " parse [me/player] [code]"); + return true; + } + + final String script = String.join(" ", Arrays.copyOfRange(args, 2, args.length)); + final JavascriptPlaceholder placeholder = new JavascriptPlaceholder(expansion.getGlobalEngine(), "parse-command", String.join(" ", script)); + + if ("me".equalsIgnoreCase(args[1])) { + if (!(sender instanceof Player)) { + msg(sender, "&cOnly players can run this command!"); + return true; + } + + sender.sendMessage(placeholder.evaluate((Player) sender)); + return true; + } + + final OfflinePlayer player = Bukkit.getOfflinePlayer(args[1]); + + if (!player.hasPlayedBefore() || player.getName() == null) { + msg(sender, "&cUnknown player " + args[1]); + return true; + } + + sender.sendMessage(placeholder.evaluate(player)); + return true; + } + + case "reload": { + msg(sender, "&aJavascriptExpansion reloading..."); + final int scripts = expansion.reloadScripts(); + msg(sender, scripts + " &7script" + plural(scripts) + " loaded"); + return true; + } + default: { return true; } @@ -209,6 +289,6 @@ public class JavascriptExpansionCommands extends Command { return; } - Arrays.stream(text).forEach(line -> sender.sendMessage(ChatColor.translateAlternateColorCodes('&', line))); + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', Arrays.stream(text).filter(Objects::nonNull).collect(Collectors.joining("\n")))); } } 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 46416e5..0c6cb6b 100644 --- a/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptPlaceholder.java +++ b/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptPlaceholder.java @@ -26,7 +26,6 @@ import org.apache.commons.lang.Validate; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.configuration.InvalidConfigurationException; -import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import javax.script.ScriptEngine; @@ -34,16 +33,17 @@ import javax.script.ScriptException; import java.io.File; import java.io.IOException; import java.util.Set; +import java.util.logging.Level; public class JavascriptPlaceholder { private final String DIRECTORY = PlaceholderAPIPlugin.getInstance().getDataFolder() + "/javascripts/javascript_data"; - private ScriptEngine engine; - private String identifier; - private String script; - private ScriptData data; - private File dataFile; - private FileConfiguration config; + private final ScriptEngine engine; + private final String identifier; + private final String script; + private ScriptData scriptData; + private final File dataFile; + private YamlConfiguration yaml; public JavascriptPlaceholder(ScriptEngine engine, String identifier, String script) { Validate.notNull(engine, "ScriptEngine can not be null"); @@ -55,13 +55,13 @@ public class JavascriptPlaceholder { this.script = script; final File directory = new File(DIRECTORY); - if (directory.exists()) { + if (!directory.exists()) { directory.mkdirs(); } - data = new ScriptData(); - dataFile = new File(DIRECTORY, identifier + "_data.yml"); - engine.put("Data", data); + scriptData = new ScriptData(); + dataFile = new File(directory, identifier + "_data.yml"); + engine.put("Data", scriptData); engine.put("BukkitServer", Bukkit.getServer()); engine.put("Expansion", JavascriptExpansion.getInstance()); engine.put("Placeholder", this); @@ -99,60 +99,70 @@ public class JavascriptPlaceholder { } engine.put("args", arguments); - engine.put("BukkitPlayer", player != null && player.isOnline() ? player.getPlayer() : null); + + if (player != null && player.isOnline()) { + engine.put("BukkitPlayer", player.getPlayer()); + engine.put("Player", player.getPlayer()); + } + engine.put("OfflinePlayer", player); Object result = engine.eval(exp); return result != null ? PlaceholderAPI.setBracketPlaceholders(player, result.toString()) : ""; } catch (ScriptException ex) { - System.out.println(ex.getMessage()); - ex.printStackTrace(); + PlaceholderAPIPlugin.getInstance().getLogger().log(Level.SEVERE, "[JavaScript] An error occurred while executing the script '" + identifier + "'", ex); } - return "Script error"; + return "Script error! (check console)"; } public ScriptData getData() { // this should never be null but just in case setData(null) is called - if (data == null) { - data = new ScriptData(); + if (scriptData == null) { + scriptData = new ScriptData(); } - return data; + return scriptData; } public void setData(ScriptData data) { - this.data = data; + this.scriptData = data; } public boolean loadData() { - config = new YamlConfiguration(); + yaml = new YamlConfiguration(); + dataFile.getParentFile().mkdirs(); if (!dataFile.exists()) { - return false; + try { + dataFile.createNewFile(); + } catch (IOException e) { + PlaceholderAPIPlugin.getInstance().getLogger().log(Level.SEVERE, "[JavaScript Expansion] An error occurred while creating data file for " + getIdentifier(), e); + return false; + } } try { - config.load(dataFile); + yaml.load(dataFile); } catch (IOException | InvalidConfigurationException e) { - e.printStackTrace(); + PlaceholderAPIPlugin.getInstance().getLogger().log(Level.SEVERE, "[JavaScript Expansion] An error occurred while loading for " + getIdentifier(), e); return false; } - final Set keys = config.getKeys(true); + final Set keys = yaml.getKeys(true); if (keys.size() == 0) { return false; } - if (data == null) { - data = new ScriptData(); + if (scriptData == null) { + scriptData = new ScriptData(); } else { - data.clear(); + scriptData.clear(); } - keys.forEach(key -> data.set(key, config.get(key))); + keys.forEach(key -> scriptData.set(key, yaml.get(key))); - if (!data.isEmpty()) { - this.setData(data); + if (!scriptData.isEmpty()) { + this.setData(scriptData); return true; } @@ -160,30 +170,27 @@ public class JavascriptPlaceholder { } public boolean saveData() { - if (data == null || data.isEmpty()) { + if (scriptData == null || scriptData.isEmpty() || yaml == null) { return false; } - if (config == null) { - return false; - } - - data.getData().forEach((key, value) -> config.set(key, value)); + scriptData.getData().forEach((key, value) -> yaml.set(key, value)); try { - config.save(dataFile); + yaml.save(dataFile); return true; } catch (IOException e) { + PlaceholderAPIPlugin.getInstance().getLogger().log(Level.SEVERE, "[JavaScript Expansion] An error occurred while saving data for " + getIdentifier(), e); return false; } } public void cleanup() { - if (this.data != null) { - this.data.clear(); - this.data = null; + if (this.scriptData != null) { + this.scriptData.clear(); + this.scriptData = null; } - this.config = null; + this.yaml = 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 cf943a2..54e97dc 100644 --- a/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptPlaceholdersConfig.java +++ b/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptPlaceholdersConfig.java @@ -113,42 +113,42 @@ public class JavascriptPlaceholdersConfig { return 0; } - File dir = new File(plugin.getDataFolder() + File.separator + "javascripts"); + final File directory = new File(plugin.getDataFolder(), "javascripts"); try { - if (!dir.exists()) { - dir.mkdirs(); - plugin.getLogger().info("Creating directory: plugins/PlaceholderAPI/javascripts"); + if (!directory.exists()) { + directory.mkdirs(); + plugin.getLogger().info("[JavaScript Expansion] Creating directory: " + directory.getPath()); } } catch (SecurityException e) { - plugin.getLogger().severe("Could not create directory: plugins/PlaceholderAPI/javascripts"); + plugin.getLogger().log(Level.SEVERE, "[JavaScript Expansion] Could not create directory: " + directory.getPath(), e); } for (String identifier : config.getKeys(false)) { if (!config.contains(identifier + ".file") || config.getString(identifier + ".file") == null) { - plugin.getLogger().warning("Javascript placeholder: " + identifier + " does not have a file specified"); + plugin.getLogger().warning("[JavaScript Expansion] Javascript placeholder: " + identifier + " does not have a file specified"); continue; } File scriptFile = new File(plugin.getDataFolder() + "/javascripts", config.getString(identifier + ".file")); if (!scriptFile.exists()) { - plugin.getLogger().info(scriptFile.getName() + " does not exist. Creating file..."); + plugin.getLogger().info("[JavaScript Expansion] " +scriptFile.getName() + " does not exist. Creating file..."); try { scriptFile.createNewFile(); - plugin.getLogger().info(scriptFile.getName() - + " created! Add your javascript to this file and use /placeholderapi reload to load it!"); + plugin.getLogger().info("[JavaScript Expansion] " + scriptFile.getName() + " created! Add your javascript to this file and use '/jsexpansion reload' to load it!"); } catch (IOException e) { - e.printStackTrace(); + plugin.getLogger().log(Level.SEVERE, "[JavaScript Expansion] An error occurred while creating " + scriptFile.getName(), e); } + continue; } String script = getContents(scriptFile); if (script == null || script.isEmpty()) { - plugin.getLogger().warning("File: " + scriptFile.getName() + " for javascript placeholder: " + identifier + " is empty"); + plugin.getLogger().warning("[JavaScript Expansion] File: " + scriptFile.getName() + " for javascript placeholder: " + identifier + " is empty"); continue; } @@ -160,27 +160,27 @@ public class JavascriptPlaceholdersConfig { try { engine = new ScriptEngineManager().getEngineByName(config.getString(identifier + ".engine", "nashorn")); } catch (NullPointerException e) { - plugin.getLogger().warning("ScriptEngine type for javascript placeholder: " + identifier + " is invalid! Defaulting to global"); + plugin.getLogger().warning("[JavaScript Expansion] ScriptEngine type for javascript placeholder: " + identifier + " is invalid! Defaulting to global"); engine = ex.getGlobalEngine(); } } if (engine == null) { - plugin.getLogger().warning("Failed to set ScriptEngine for javascript placeholder: " + identifier); + plugin.getLogger().warning("[JavaScript Expansion] Failed to set ScriptEngine for javascript placeholder: " + identifier); continue; } - final JavascriptPlaceholder pl = new JavascriptPlaceholder(engine, identifier, script); - final boolean added = ex.addJSPlaceholder(pl); + final JavascriptPlaceholder placeholder = new JavascriptPlaceholder(engine, identifier, script); + final boolean added = ex.addJSPlaceholder(placeholder); if (added) { - if (pl.loadData()) { - plugin.getLogger().info("Loaded data for javascript placeholder: " + identifier); + if (placeholder.loadData()) { + plugin.getLogger().info("[JavaScript Expansion] Loaded data for javascript placeholder: " + identifier); } - plugin.getLogger().info("%javascript_" + identifier + "% has been loaded!"); + plugin.getLogger().info("[JavaScript Expansion] %javascript_" + identifier + "% has been loaded!"); } else { - plugin.getLogger().warning("Javascript placeholder %javascript_" + identifier + "% is a duplicate!"); + plugin.getLogger().warning("[JavaScript Expansion] Javascript placeholder %javascript_" + identifier + "% is a duplicate!"); } } diff --git a/src/main/java/com/extendedclip/papi/expansion/javascript/cloud/GithubScript.java b/src/main/java/com/extendedclip/papi/expansion/javascript/cloud/GithubScript.java index 8eef051..e1b5dda 100644 --- a/src/main/java/com/extendedclip/papi/expansion/javascript/cloud/GithubScript.java +++ b/src/main/java/com/extendedclip/papi/expansion/javascript/cloud/GithubScript.java @@ -22,7 +22,11 @@ package com.extendedclip.papi.expansion.javascript.cloud; public class GithubScript { - private String name, version, author, description, url; + private final String name; + private final String version; + private final String author; + private final String description; + private final String url; public GithubScript(String name, String version, String author, String description, String url) { this.name = name; diff --git a/src/main/java/com/extendedclip/papi/expansion/javascript/cloud/GithubScriptManager.java b/src/main/java/com/extendedclip/papi/expansion/javascript/cloud/GithubScriptManager.java index 81b9d62..4d22c68 100644 --- a/src/main/java/com/extendedclip/papi/expansion/javascript/cloud/GithubScriptManager.java +++ b/src/main/java/com/extendedclip/papi/expansion/javascript/cloud/GithubScriptManager.java @@ -29,18 +29,21 @@ import java.io.*; import java.net.URL; import java.util.ArrayList; import java.util.List; +import java.util.Objects; +import java.util.logging.Level; +import java.util.stream.Collectors; public class GithubScriptManager { private JavascriptExpansion expansion; - private String javascriptsFolder; + private final String JAVASCRIPTS_FOLDER; private List availableScripts; private final String MASTER_LIST_URL = "https://raw.githubusercontent.com/PlaceholderAPI/Javascript-Expansion/master/scripts/master_list.json"; private final Gson GSON = new Gson(); public GithubScriptManager(JavascriptExpansion expansion) { this.expansion = expansion; - javascriptsFolder = expansion.getPlaceholderAPI().getDataFolder() + JAVASCRIPTS_FOLDER = expansion.getPlaceholderAPI().getDataFolder() + File.separator + "javascripts" + File.separator; @@ -51,42 +54,37 @@ public class GithubScriptManager { } public void fetch() { - Bukkit.getScheduler().runTaskAsynchronously(expansion.getPlaceholderAPI(), new Runnable() { - @Override - public void run() { - String json = getContents(MASTER_LIST_URL); - if (json.isEmpty()) { - return; - } - availableScripts = GSON.fromJson(json, new TypeToken>() { - }.getType()); + Bukkit.getScheduler().runTaskAsynchronously(expansion.getPlaceholderAPI(), () -> { + final String json = getContents(MASTER_LIST_URL); + + if (json.isEmpty()) { + return; } + + availableScripts = GSON.fromJson(json, new TypeToken>() {}.getType()); }); } + @SuppressWarnings("ResultOfMethodCallIgnored") public void downloadScript(GithubScript script) { - Bukkit.getScheduler().runTaskAsynchronously(expansion.getPlaceholderAPI(), new Runnable() { - @Override - public void run() { - List contents = read(script.getUrl()); - if (contents == null || contents.isEmpty()) { - return; - } - File f = new File(javascriptsFolder, script.getName() + ".js"); - try (PrintStream out = new PrintStream(new FileOutputStream(f))) { - contents.forEach(l -> out.println(l)); - } catch (FileNotFoundException e) { - e.printStackTrace(); - return; - } - Bukkit.getScheduler().runTask(expansion.getPlaceholderAPI(), new Runnable() { - @Override - public void run() { - expansion.getConfig().load().set(script.getName() + ".file", script.getName() + ".js"); - expansion.getConfig().save(); - } - }); + Bukkit.getScheduler().runTaskAsynchronously(expansion.getPlaceholderAPI(), () -> { + final List contents = read(script.getUrl()); + + if (contents.isEmpty()) { + return; } + + try (final PrintStream out = new PrintStream(new FileOutputStream(new File(JAVASCRIPTS_FOLDER, script.getName() + ".js")))) { + contents.forEach(out::println); + } catch (FileNotFoundException e) { + expansion.getPlaceholderAPI().getLogger().log(Level.SEVERE, "An error occurred while downloading " + script.getName(), e); + return; + } + + Bukkit.getScheduler().runTask(expansion.getPlaceholderAPI(), () -> { + expansion.getConfig().load().set(script.getName() + ".file", script.getName() + ".js"); + expansion.getConfig().save(); + }); }); } @@ -94,17 +92,19 @@ public class GithubScriptManager { return String.join("", read(url)); } - private List read(String url) { - - List lines = new ArrayList<>(); - - try (BufferedReader reader = new BufferedReader( - new InputStreamReader(new URL(url).openStream()))) { + private List read(final String url) { + final List lines = new ArrayList<>(); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(new URL(url).openStream()))) { + lines.addAll(reader.lines().filter(Objects::nonNull).collect(Collectors.toList())); + /* String inputLine; + while ((inputLine = reader.readLine()) != null) { lines.add(inputLine); } + + */ } catch (Exception ex) { ex.printStackTrace(); } @@ -116,10 +116,18 @@ public class GithubScriptManager { return availableScripts; } - public GithubScript getScript(String name) { - if (availableScripts == null) return null; - return availableScripts.stream().filter(s -> { - return s.getName().equalsIgnoreCase(name); - }).findFirst().orElse(null); + public GithubScript getScript(final String name) { + if (availableScripts == null) { + return null; + } + + return availableScripts.stream() + .filter(s -> s.getName().equalsIgnoreCase(name)) + .findFirst() + .orElse(null); + } + + public String getJavascriptsFolder() { + return JAVASCRIPTS_FOLDER; } }