ajarcomputers/src/main/java/dev/exhq/ajarc/vm/JsVm.java
2024-07-22 02:54:29 +02:00

53 lines
1.5 KiB
Java

package dev.exhq.ajarc.vm;
import delight.nashornsandbox.NashornSandbox;
import delight.nashornsandbox.NashornSandboxes;
import delight.nashornsandbox.internal.JsSanitizer;
import dev.exhq.ajarc.Ajar;
import dev.exhq.ajarc.computer.ComputerBlockEntity;
import dev.exhq.ajarc.computer.ComputerTerminal;
import net.minecraft.client.Minecraft;
import org.apache.commons.io.IOUtils;
import javax.script.ScriptException;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Map;
public class JsVm {
private final NashornSandbox sandbox;
public JsVm(ComputerBlockEntity entity) {
sandbox = NashornSandboxes.create();
sandbox.inject("screen", new ScreenHelper(entity));
}
public record ScreenHelper(ComputerBlockEntity entity) {
public void setScreenSize(int rows, int cols) {
entity.setTerminal(ComputerTerminal.ofSize(rows, cols));
}
}
public int add(int left, int right) {
String text;
try {
var stream = Minecraft.getInstance()
.getResourceManager()
.getResourceOrThrow(Ajar.identifier("script.js"))
.open();
text = IOUtils.toString(stream, StandardCharsets.UTF_8);
} catch (IOException e) {
throw new RuntimeException(e);
}
var bindings = sandbox.createBindings();
bindings.put("left", left);
bindings.put("right", right);
try {
sandbox.eval(text, bindings);
} catch (ScriptException e) {
throw new RuntimeException(e);
}
return (int) (double) bindings.get("result");
}
}