From ff2a76e7da3faaf8c9f7e2cc187378f8b1c3dcb1 Mon Sep 17 00:00:00 2001 From: UnlegitDqrk Date: Fri, 27 Feb 2026 23:56:20 +0100 Subject: [PATCH] Implemented missing Lua features --- pom.xml | 2 +- .../webclient/lua/hosts/UiHostImpl.java | 15 +++++------- .../webclient/settings/AppSettings.java | 5 ++-- .../webclient/settings/FxEngine.java | 23 +++++++++++-------- .../webclient/settings/SettingsManager.java | 9 ++++---- 5 files changed, 28 insertions(+), 26 deletions(-) diff --git a/pom.xml b/pom.xml index 9a8ed0d..dc14c90 100644 --- a/pom.xml +++ b/pom.xml @@ -74,7 +74,7 @@ org.openautonomousconnection LuaScript - 1.0.0-BETA.1.3 + 0.0.0-STABLE.1.3 org.openautonomousconnection diff --git a/src/main/java/org/openautonomousconnection/webclient/lua/hosts/UiHostImpl.java b/src/main/java/org/openautonomousconnection/webclient/lua/hosts/UiHostImpl.java index 4c7772b..3913ec2 100644 --- a/src/main/java/org/openautonomousconnection/webclient/lua/hosts/UiHostImpl.java +++ b/src/main/java/org/openautonomousconnection/webclient/lua/hosts/UiHostImpl.java @@ -5,8 +5,11 @@ import javafx.scene.web.WebView; import org.openautonomousconnection.luascript.fx.FxDomHost; import org.openautonomousconnection.luascript.fx.FxThreadBridge; import org.openautonomousconnection.luascript.hosts.UiHost; +import org.openautonomousconnection.oacswing.component.OACOptionPane; +import org.openautonomousconnection.webclient.Main; import org.w3c.dom.Element; +import javax.swing.*; import java.util.Objects; /** @@ -66,23 +69,17 @@ public final class UiHostImpl implements UiHost { @Override public void alert(String message) { - // No JS: use simple JavaFX dialog-less fallback (log-style). You can replace with real Dialogs later. - // Keeping it deterministic and non-blocking for now. - System.out.println("[ui.alert] " + (message == null ? "" : message)); + OACOptionPane.showMessageDialog(Main.getUi(), message, "Alert", JOptionPane.INFORMATION_MESSAGE); } @Override public boolean confirm(String message) { - // No JS: deterministic default (false). Replace with JavaFX dialogs if you want UI interaction. - System.out.println("[ui.confirm] " + (message == null ? "" : message)); - return false; + return OACOptionPane.showConfirmDialog(Main.getUi(), message, "Alert", OACOptionPane.YES_NO_OPTION) == OACOptionPane.YES_OPTION; } @Override public String prompt(String message, String defaultValue) { - // No JS: deterministic default. - System.out.println("[ui.prompt] " + (message == null ? "" : message)); - return defaultValue; + return (String) OACOptionPane.showInputDialog(Main.getUi(), message, "Prompt", JOptionPane.QUESTION_MESSAGE, null, null, defaultValue); } @Override diff --git a/src/main/java/org/openautonomousconnection/webclient/settings/AppSettings.java b/src/main/java/org/openautonomousconnection/webclient/settings/AppSettings.java index 0bf6bf2..2e52778 100644 --- a/src/main/java/org/openautonomousconnection/webclient/settings/AppSettings.java +++ b/src/main/java/org/openautonomousconnection/webclient/settings/AppSettings.java @@ -2,7 +2,6 @@ package org.openautonomousconnection.webclient.settings; import org.openautonomousconnection.luascript.security.LuaExecutionPolicy; -import java.time.Duration; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -187,6 +186,6 @@ public final class AppSettings { * Resets the Lua policy back to ui default. */ public void resetLuaPolicyToUiDefault() { - this.luaPolicy = new LuaExecutionPolicy(Duration.ofMillis(50L), 200_000L, 5_000); + this.luaPolicy = LuaExecutionPolicy.uiDefault(); } -} \ No newline at end of file +} diff --git a/src/main/java/org/openautonomousconnection/webclient/settings/FxEngine.java b/src/main/java/org/openautonomousconnection/webclient/settings/FxEngine.java index ab45999..1f34ec6 100644 --- a/src/main/java/org/openautonomousconnection/webclient/settings/FxEngine.java +++ b/src/main/java/org/openautonomousconnection/webclient/settings/FxEngine.java @@ -4,6 +4,7 @@ import javafx.concurrent.Worker; import javafx.scene.web.WebEngine; import javafx.scene.web.WebView; import org.luaj.vm2.Globals; +import org.luaj.vm2.LuaError; import org.openautonomousconnection.luascript.fx.FxDomHost; import org.openautonomousconnection.luascript.fx.FxEventHost; 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.security.LuaExecutionPolicy; 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.hosts.ConsoleHostImpl; import org.openautonomousconnection.webclient.lua.hosts.UiHostImpl; @@ -95,17 +98,19 @@ public final class FxEngine implements AutoCloseable { ConsoleHostImpl console = new ConsoleHostImpl(logger); UiHostImpl uiHost = new UiHostImpl(engine, webView, dom); FxWebViewResourceHost resourceHost = new FxWebViewResourceHost(engine); - - LuaRuntime rt = new LuaRuntime(globals, new HostServices.Default(uiHost, dom, null, resourceHost, console), policy); - - FxEventHost eventHost = new FxEventHost(dom, rt.eventRouter()); + FxEventHost eventHost = new FxEventHost(dom); HostServices services = new HostServices.Default(uiHost, dom, eventHost, resourceHost, console); - - rt.close(); - rt = new LuaRuntime(globals, services, policy); + LuaRuntime rt = new LuaRuntime(globals, services, policy); + eventHost.setRouter(rt.eventRouter()); 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; } @@ -135,4 +140,4 @@ public final class FxEngine implements AutoCloseable { } } } -} \ No newline at end of file +} diff --git a/src/main/java/org/openautonomousconnection/webclient/settings/SettingsManager.java b/src/main/java/org/openautonomousconnection/webclient/settings/SettingsManager.java index 8da1cfc..e63d4a1 100644 --- a/src/main/java/org/openautonomousconnection/webclient/settings/SettingsManager.java +++ b/src/main/java/org/openautonomousconnection/webclient/settings/SettingsManager.java @@ -87,9 +87,10 @@ public final class SettingsManager { } // Lua policy - long timeoutMs = parseLong(p.getProperty("lua.timeoutMs"), 50L); - long instr = parseLong(p.getProperty("lua.instructionLimit"), 200_000L); - int hook = parseInt(p.getProperty("lua.hookStep"), 5_000); + LuaExecutionPolicy defaultPolicy = LuaExecutionPolicy.uiDefault(); + long timeoutMs = parseLong(p.getProperty("lua.timeoutMs"), defaultPolicy.timeout().toMillis()); + long instr = parseLong(p.getProperty("lua.instructionLimit"), defaultPolicy.instructionLimit()); + int hook = parseInt(p.getProperty("lua.hookStep"), defaultPolicy.hookStep()); try { s.setLuaPolicy(new LuaExecutionPolicy(Duration.ofMillis(timeoutMs), instr, hook)); } catch (Exception ignored) { @@ -187,4 +188,4 @@ public final class SettingsManager { return def; } } -} \ No newline at end of file +}