Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.extendedclip.papi.expansion.javascript</groupId>
<artifactId>javascript-expansion</artifactId>
<version>1.5.4</version>
<version>1.6.0-SNAPSHOT</version>
<name>PAPI-Expansion-Javascript</name>
<description>PlaceholderAPI expansion for javascript placeholders</description>

Expand All @@ -21,13 +21,13 @@
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.15.2-R0.1-SNAPSHOT</version>
<version>1.16.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.10.5</version>
<version>2.10.9</version>
<scope>provided</scope>
</dependency>
</dependencies>
Expand All @@ -37,7 +37,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<version>3.2.0</version>
<configuration>
<finalName>${name}</finalName>
<archive>
Expand All @@ -51,7 +51,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<version>3.8.1</version>
<configuration>
<target>1.8</target>
<source>1.8</source>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
package com.extendedclip.papi.expansion.javascript;

import jdk.nashorn.api.scripting.ScriptObjectMirror;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.MemorySection;

import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;

public class ExpansionUtils {

public static final String DEFAULT_ENGINE = "nashorn";
public static final String PREFIX = "[PAPI] [Javascript-Expansion] ";
private static final Logger logger = Bukkit.getLogger();

public static void sendMsg(CommandSender sender, String... msg) {
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', Arrays.stream(msg).filter(Objects::nonNull).collect(Collectors.joining("\n"))));
}

public static void warnLog(String log, Throwable throwable) {
warnLog(log, throwable, true);
}

public static void infoLog(final String log) {
infoLog(log, true);
}

public static void infoLog(String log, boolean canPrefix) {
String prefix = "";
if (canPrefix) prefix = PREFIX;
logger.info(prefix + log);
}

public static void warnLog(String log, Throwable throwable, boolean canPrefix) {
String prefix = "";
if (canPrefix) prefix = PREFIX;
if (throwable == null) {
logger.log(Level.WARNING, prefix + log);
} else logger.log(Level.WARNING, prefix + log, throwable);
}

public static void errorLog(String log, Throwable throwable) {
errorLog(log, throwable, true);
}

public static void errorLog(String log, Throwable throwable, boolean canPrefix) {
String prefix = "";
if (canPrefix) prefix = PREFIX;
if (throwable == null) {
logger.log(Level.SEVERE, prefix + log);
} else {
logger.log(Level.SEVERE, prefix + log, throwable);
}
}

// Only support for Nashorn engine!
protected static Object jsonToJava(Object jsObj) {
if (jsObj instanceof ScriptObjectMirror) {
ScriptObjectMirror jsObjectMirror = (ScriptObjectMirror) jsObj;
if (jsObjectMirror.isArray()) {
List<Object> list = new ArrayList<>();
for (Map.Entry<String, Object> entry : jsObjectMirror.entrySet()) {
list.add(jsonToJava(entry.getValue()));
}
return list;
} else {
Map<String, Object> map = new HashMap<>();
for (Map.Entry<String, Object> entry : jsObjectMirror.entrySet()) {
map.put(entry.getKey(), jsonToJava(entry.getValue()));
}
return map;
}
} else {
return jsObj;
}
}

protected static Object ymlToJavaObj(Object obj) {
if (obj instanceof MemorySection) {
MemorySection ymlMem = (MemorySection) obj;
if (ymlMem.isList(ymlMem.getCurrentPath())) {
ArrayList<Object> list = new ArrayList<>();
for (String entry : ymlMem.getKeys(true)) {
list.add(ymlToJavaObj(ymlMem.get(entry)));
}
return list;
} else {
Map<String, Object> map = new HashMap<>();
for (String entry : ymlMem.getKeys(true)) {
map.put(entry, ymlToJavaObj(ymlMem.get(entry)));
}
return map;
}
} else {
return obj;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -26,37 +26,42 @@
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command;
import org.bukkit.command.CommandMap;
import org.jetbrains.annotations.NotNull;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import java.lang.reflect.Field;
import java.util.*;
import java.util.logging.Level;
import java.util.stream.Collectors;

public class JavascriptExpansion extends PlaceholderExpansion implements Cacheable, Configurable {

private ScriptEngine globalEngine = null;

private JavascriptPlaceholdersConfig config;
private final Set<JavascriptPlaceholder> scripts = new HashSet<>();
private final String VERSION = getClass().getPackage().getImplementationVersion();
private final Set<JavascriptPlaceholder> scripts;
private final String VERSION;
private static JavascriptExpansion instance;
private boolean debug;
private GithubScriptManager githubManager;
private JavascriptExpansionCommands commands;
private CommandMap commandMap;
private String argument_split;

public JavascriptExpansion() {
instance = this;
this.VERSION = getClass().getPackage().getImplementationVersion();
this.scripts = new HashSet<>();

try {
final Field field = Bukkit.getServer().getClass().getDeclaredField("commandMap");
field.setAccessible(true);
commandMap = (CommandMap) field.get(Bukkit.getServer());
} catch (NoSuchFieldException | IllegalAccessException e) {
getPlaceholderAPI().getLogger().log(Level.SEVERE, "[JavaScript Expansion] An error occurred while accessing CommandMap.", e);
ExpansionUtils.errorLog("An error occurred while accessing CommandMap.", e, true);
}
}

Expand All @@ -77,24 +82,35 @@ public String getVersion() {

@Override
public boolean register() {
String defaultEngine = ExpansionUtils.DEFAULT_ENGINE;

if (globalEngine == null) {
try {
globalEngine = new ScriptEngineManager().getEngineByName(getString("engine", "nashorn"));
globalEngine = new ScriptEngineManager(null).getEngineByName(getString("engine", defaultEngine));
} catch (NullPointerException ex) {
getPlaceholderAPI().getLogger().warning("[JavaScript Expansion] Javascript engine type was invalid! Defaulting to 'nashorn'");
globalEngine = new ScriptEngineManager().getEngineByName("nashorn");
ExpansionUtils.warnLog("Javascript engine type was invalid! Defaulting to '" + defaultEngine + "'", null);
globalEngine = new ScriptEngineManager(null).getEngineByName(defaultEngine);
}
}

argument_split = getString("argument_split", ",");
if (argument_split.equals("_")) {
argument_split = ",";
ExpansionUtils.warnLog("Underscore character will not be allowed for splitting. Defaulting to ',' for this", null);
}

debug = (boolean) get("debug", false);
config = new JavascriptPlaceholdersConfig(this);
config.loadPlaceholders();

int amountLoaded = config.loadPlaceholders();
ExpansionUtils.infoLog(amountLoaded + " script" + plural(amountLoaded) + " loaded!");


if (debug) {
getPlaceholderAPI().getLogger().info("[JavaScript Expansion] Java version: " + System.getProperty("java.version"));
final ScriptEngineManager manager = new ScriptEngineManager();
ExpansionUtils.infoLog("Java version: " + System.getProperty("java.version"));
final ScriptEngineManager manager = new ScriptEngineManager(null);
final List<ScriptEngineFactory> factories = manager.getEngineFactories();
getPlaceholderAPI().getLogger().info("Displaying all script engine factories.");
ExpansionUtils.infoLog("Displaying all script engine factories.", false);

for (ScriptEngineFactory factory : factories) {
System.out.println(factory.getEngineName());
Expand All @@ -107,7 +123,7 @@ public boolean register() {
}
}

if ((Boolean) get("github_script_downloads", false)) {
if ((boolean) get("github_script_downloads", false)) {
githubManager = new GithubScriptManager(this);
githubManager.fetch();
}
Expand Down Expand Up @@ -136,16 +152,16 @@ public void clear() {
}

@Override
public String onRequest(OfflinePlayer player, String identifier) {
public String onRequest(OfflinePlayer player, @NotNull String identifier) {
if (player == null || scripts.size() == 0) {
return "";
}

for (JavascriptPlaceholder script : scripts) {
if (identifier.startsWith(script.getIdentifier() + "_")) {
identifier = identifier.replace(script.getIdentifier() + "_", "");
identifier = identifier.replaceFirst(script.getIdentifier() + "_", "");

return !identifier.contains(",") ? script.evaluate(player, identifier) : script.evaluate(player, identifier.split(","));
return !identifier.contains(argument_split) ? script.evaluate(player, identifier) : script.evaluate(player, identifier.split(argument_split));
}

if (identifier.equalsIgnoreCase(script.getIdentifier())) {
Expand Down Expand Up @@ -174,9 +190,9 @@ public boolean addJSPlaceholder(JavascriptPlaceholder placeholder) {
return true;
}

public Set<JavascriptPlaceholder> getJSPlaceholders() {
return scripts;
}
// public Set<JavascriptPlaceholder> getJSPlaceholders() {
// return scripts;
// }

public List<String> getLoadedIdentifiers() {
return scripts.stream()
Expand Down Expand Up @@ -208,12 +224,13 @@ public Map<String, Object> getDefaults() {
final Map<String, Object> defaults = new HashMap<>();
defaults.put("engine", "javascript");
defaults.put("debug", false);
defaults.put("argument_split", ",");
defaults.put("github_script_downloads", false);

return defaults;
}

protected int reloadScripts() {
public int reloadScripts() {
scripts.forEach(script -> {
script.saveData();
script.cleanup();
Expand All @@ -236,19 +253,39 @@ public void setGithubScriptManager(GithubScriptManager manager) {
this.githubManager = manager;
}

@SuppressWarnings("UnusedReturnValue")
private boolean unregisterCommand() {
return commandMap != null && commands != null && commands.unregister(commandMap);
private void unregisterCommand() {
if (commandMap != null && commands != null) {

try {
final Field f = commandMap.getClass().getDeclaredField("knownCommands");
f.setAccessible(true);
Map<String, Command> knownCmds = (Map<String, Command>) f.get(commandMap);
knownCmds.remove(commands.getName());
for (String alias : commands.getAliases()) {
if (knownCmds.containsKey(alias) && knownCmds.get(alias).toString().contains(commands.getName())) {
knownCmds.remove(alias);
}
}

} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}

commands.unregister(commandMap);
}
}

@SuppressWarnings("UnusedReturnValue")
private boolean registerCommand() {
private void registerCommand() {
if (commandMap == null) {
return false;
return;
}

commands = new JavascriptExpansionCommands(this);
commandMap.register("papi" + commands.getName(), commands);
return commands.isRegistered();
commands.isRegistered();
}

private String plural(final int amount) {
return amount > 1 ? "s" : "";
}
}
Loading