Implemented missing Lua features

This commit is contained in:
UnlegitDqrk
2026-02-27 23:56:20 +01:00
parent 4c1cf09f34
commit ff2a76e7da
5 changed files with 28 additions and 26 deletions

View File

@@ -74,7 +74,7 @@
<dependency> <dependency>
<groupId>org.openautonomousconnection</groupId> <groupId>org.openautonomousconnection</groupId>
<artifactId>LuaScript</artifactId> <artifactId>LuaScript</artifactId>
<version>1.0.0-BETA.1.3</version> <version>0.0.0-STABLE.1.3</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.openautonomousconnection</groupId> <groupId>org.openautonomousconnection</groupId>

View File

@@ -5,8 +5,11 @@ import javafx.scene.web.WebView;
import org.openautonomousconnection.luascript.fx.FxDomHost; import org.openautonomousconnection.luascript.fx.FxDomHost;
import org.openautonomousconnection.luascript.fx.FxThreadBridge; import org.openautonomousconnection.luascript.fx.FxThreadBridge;
import org.openautonomousconnection.luascript.hosts.UiHost; import org.openautonomousconnection.luascript.hosts.UiHost;
import org.openautonomousconnection.oacswing.component.OACOptionPane;
import org.openautonomousconnection.webclient.Main;
import org.w3c.dom.Element; import org.w3c.dom.Element;
import javax.swing.*;
import java.util.Objects; import java.util.Objects;
/** /**
@@ -66,23 +69,17 @@ public final class UiHostImpl implements UiHost {
@Override @Override
public void alert(String message) { public void alert(String message) {
// No JS: use simple JavaFX dialog-less fallback (log-style). You can replace with real Dialogs later. OACOptionPane.showMessageDialog(Main.getUi(), message, "Alert", JOptionPane.INFORMATION_MESSAGE);
// Keeping it deterministic and non-blocking for now.
System.out.println("[ui.alert] " + (message == null ? "" : message));
} }
@Override @Override
public boolean confirm(String message) { public boolean confirm(String message) {
// No JS: deterministic default (false). Replace with JavaFX dialogs if you want UI interaction. return OACOptionPane.showConfirmDialog(Main.getUi(), message, "Alert", OACOptionPane.YES_NO_OPTION) == OACOptionPane.YES_OPTION;
System.out.println("[ui.confirm] " + (message == null ? "" : message));
return false;
} }
@Override @Override
public String prompt(String message, String defaultValue) { public String prompt(String message, String defaultValue) {
// No JS: deterministic default. return (String) OACOptionPane.showInputDialog(Main.getUi(), message, "Prompt", JOptionPane.QUESTION_MESSAGE, null, null, defaultValue);
System.out.println("[ui.prompt] " + (message == null ? "" : message));
return defaultValue;
} }
@Override @Override

View File

@@ -2,7 +2,6 @@ package org.openautonomousconnection.webclient.settings;
import org.openautonomousconnection.luascript.security.LuaExecutionPolicy; import org.openautonomousconnection.luascript.security.LuaExecutionPolicy;
import java.time.Duration;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@@ -187,6 +186,6 @@ public final class AppSettings {
* Resets the Lua policy back to ui default. * Resets the Lua policy back to ui default.
*/ */
public void resetLuaPolicyToUiDefault() { public void resetLuaPolicyToUiDefault() {
this.luaPolicy = new LuaExecutionPolicy(Duration.ofMillis(50L), 200_000L, 5_000); this.luaPolicy = LuaExecutionPolicy.uiDefault();
} }
} }

View File

@@ -4,6 +4,7 @@ import javafx.concurrent.Worker;
import javafx.scene.web.WebEngine; import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView; import javafx.scene.web.WebView;
import org.luaj.vm2.Globals; import org.luaj.vm2.Globals;
import org.luaj.vm2.LuaError;
import org.openautonomousconnection.luascript.fx.FxDomHost; import org.openautonomousconnection.luascript.fx.FxDomHost;
import org.openautonomousconnection.luascript.fx.FxEventHost; import org.openautonomousconnection.luascript.fx.FxEventHost;
import org.openautonomousconnection.luascript.fx.FxWebViewResourceHost; import org.openautonomousconnection.luascript.fx.FxWebViewResourceHost;
@@ -11,6 +12,8 @@ import org.openautonomousconnection.luascript.hosts.HostServices;
import org.openautonomousconnection.luascript.runtime.LuaRuntime; import org.openautonomousconnection.luascript.runtime.LuaRuntime;
import org.openautonomousconnection.luascript.security.LuaExecutionPolicy; import org.openautonomousconnection.luascript.security.LuaExecutionPolicy;
import org.openautonomousconnection.luascript.utils.LuaGlobalsFactory; import org.openautonomousconnection.luascript.utils.LuaGlobalsFactory;
import org.openautonomousconnection.oacswing.component.OACOptionPane;
import org.openautonomousconnection.webclient.Main;
import org.openautonomousconnection.webclient.lua.WebLogger; import org.openautonomousconnection.webclient.lua.WebLogger;
import org.openautonomousconnection.webclient.lua.hosts.ConsoleHostImpl; import org.openautonomousconnection.webclient.lua.hosts.ConsoleHostImpl;
import org.openautonomousconnection.webclient.lua.hosts.UiHostImpl; import org.openautonomousconnection.webclient.lua.hosts.UiHostImpl;
@@ -95,17 +98,19 @@ public final class FxEngine implements AutoCloseable {
ConsoleHostImpl console = new ConsoleHostImpl(logger); ConsoleHostImpl console = new ConsoleHostImpl(logger);
UiHostImpl uiHost = new UiHostImpl(engine, webView, dom); UiHostImpl uiHost = new UiHostImpl(engine, webView, dom);
FxWebViewResourceHost resourceHost = new FxWebViewResourceHost(engine); FxWebViewResourceHost resourceHost = new FxWebViewResourceHost(engine);
FxEventHost eventHost = new FxEventHost(dom);
LuaRuntime rt = new LuaRuntime(globals, new HostServices.Default(uiHost, dom, null, resourceHost, console), policy);
FxEventHost eventHost = new FxEventHost(dom, rt.eventRouter());
HostServices services = new HostServices.Default(uiHost, dom, eventHost, resourceHost, console); HostServices services = new HostServices.Default(uiHost, dom, eventHost, resourceHost, console);
LuaRuntime rt = new LuaRuntime(globals, services, policy);
rt.close(); eventHost.setRouter(rt.eventRouter());
rt = new LuaRuntime(globals, services, policy);
rt.installStdTables(true); rt.installStdTables(true);
rt.bootstrapFromDom();
try {
rt.bootstrapFromDom();
} catch (LuaError error) {
Main.getLogger().exception("Failed to start script", error);
OACOptionPane.showMessageDialog(Main.getUi(), error.getMessage(), "Script", OACOptionPane.ERROR_MESSAGE);
}
this.runtime = rt; this.runtime = rt;
} }
@@ -135,4 +140,4 @@ public final class FxEngine implements AutoCloseable {
} }
} }
} }
} }

View File

@@ -87,9 +87,10 @@ public final class SettingsManager {
} }
// Lua policy // Lua policy
long timeoutMs = parseLong(p.getProperty("lua.timeoutMs"), 50L); LuaExecutionPolicy defaultPolicy = LuaExecutionPolicy.uiDefault();
long instr = parseLong(p.getProperty("lua.instructionLimit"), 200_000L); long timeoutMs = parseLong(p.getProperty("lua.timeoutMs"), defaultPolicy.timeout().toMillis());
int hook = parseInt(p.getProperty("lua.hookStep"), 5_000); long instr = parseLong(p.getProperty("lua.instructionLimit"), defaultPolicy.instructionLimit());
int hook = parseInt(p.getProperty("lua.hookStep"), defaultPolicy.hookStep());
try { try {
s.setLuaPolicy(new LuaExecutionPolicy(Duration.ofMillis(timeoutMs), instr, hook)); s.setLuaPolicy(new LuaExecutionPolicy(Duration.ofMillis(timeoutMs), instr, hook));
} catch (Exception ignored) { } catch (Exception ignored) {
@@ -187,4 +188,4 @@ public final class SettingsManager {
return def; return def;
} }
} }
} }