diff --git a/build.gradle b/build.gradle index e079dd2..4041c1f 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group 'com.github.jie65535.opencommand' -version 'dev-1.2.0' +version 'dev-1.3.0' sourceCompatibility = 17 targetCompatibility = 17 diff --git a/src/main/java/com/github/jie65535/opencommand/EventListeners.java b/src/main/java/com/github/jie65535/opencommand/EventListeners.java new file mode 100644 index 0000000..85cfd8f --- /dev/null +++ b/src/main/java/com/github/jie65535/opencommand/EventListeners.java @@ -0,0 +1,17 @@ +package com.github.jie65535.opencommand; + +import emu.grasscutter.server.event.game.CommandResponseEvent; +import emu.grasscutter.utils.MessageHandler; + +public final class EventListeners { + + private static MessageHandler consoleMessageHandler; + public static void setConsoleMessageHandler(MessageHandler handler) { + consoleMessageHandler = handler; + } + public static void onCommandResponse(CommandResponseEvent event) { + if (consoleMessageHandler != null && event.getPlayer() == null) { + consoleMessageHandler.setMessage(event.getMessage()); + } + } +} diff --git a/src/main/java/com/github/jie65535/opencommand/OpenCommandHandler.java b/src/main/java/com/github/jie65535/opencommand/OpenCommandHandler.java index 8da3c05..6262de0 100644 --- a/src/main/java/com/github/jie65535/opencommand/OpenCommandHandler.java +++ b/src/main/java/com/github/jie65535/opencommand/OpenCommandHandler.java @@ -20,6 +20,9 @@ package com.github.jie65535.opencommand; import com.github.jie65535.opencommand.json.JsonRequest; import com.github.jie65535.opencommand.json.JsonResponse; import emu.grasscutter.command.CommandMap; +import emu.grasscutter.server.event.EventHandler; +import emu.grasscutter.server.event.HandlerPriority; +import emu.grasscutter.server.event.game.CommandResponseEvent; import emu.grasscutter.server.http.Router; import emu.grasscutter.utils.Crypto; import emu.grasscutter.utils.MessageHandler; @@ -103,13 +106,19 @@ public final class OpenCommandHandler implements Router { response.json(new JsonResponse()); return; } else if (req.action.equals("command")) { - try { - plugin.getLogger().info(String.format("IP: %s run command in console > %s", request.ip(), req.data)); - CommandMap.getInstance().invoke(null, null, req.data.toString()); - response.json(new JsonResponse()); - } catch (Exception e) { - plugin.getLogger().warn("Run command failed.", e); - response.json(new JsonResponse(500, "error", e.getLocalizedMessage())); + //noinspection SynchronizationOnLocalVariableOrMethodParameter + synchronized (plugin) { + try { + plugin.getLogger().info(String.format("IP: %s run command in console > %s", request.ip(), req.data)); + var resultCollector = new MessageHandler(); + EventListeners.setConsoleMessageHandler(resultCollector); + CommandMap.getInstance().invoke(null, null, req.data.toString()); + response.json(new JsonResponse(resultCollector.getMessage())); + } catch (Exception e) { + plugin.getLogger().warn("Run command failed.", e); + EventListeners.setConsoleMessageHandler(null); + response.json(new JsonResponse(500, "error", e.getLocalizedMessage())); + } } return; } diff --git a/src/main/java/com/github/jie65535/opencommand/OpenCommandPlugin.java b/src/main/java/com/github/jie65535/opencommand/OpenCommandPlugin.java index 21b8aa3..17ebc4b 100644 --- a/src/main/java/com/github/jie65535/opencommand/OpenCommandPlugin.java +++ b/src/main/java/com/github/jie65535/opencommand/OpenCommandPlugin.java @@ -19,6 +19,9 @@ package com.github.jie65535.opencommand; import emu.grasscutter.Grasscutter; import emu.grasscutter.plugin.Plugin; +import emu.grasscutter.server.event.EventHandler; +import emu.grasscutter.server.event.HandlerPriority; +import emu.grasscutter.server.event.game.CommandResponseEvent; import java.io.File; import java.io.FileReader; @@ -40,6 +43,10 @@ public final class OpenCommandPlugin extends Plugin { @Override public void onEnable() { + new EventHandler<>(CommandResponseEvent.class) + .priority(HandlerPriority.HIGH) + .listener(EventListeners::onCommandResponse) + .register(); getHandle().addRouter(OpenCommandHandler.class); getLogger().info("[OpenCommand] Enabled"); } diff --git a/src/main/resources/plugin.json b/src/main/resources/plugin.json index 1d29cf9..b28721c 100644 --- a/src/main/resources/plugin.json +++ b/src/main/resources/plugin.json @@ -1,7 +1,7 @@ { "name": "opencommand-plugin", "description": "Open command interface for third-party clients", - "version": "dev-1.2.0", + "version": "dev-1.3.0", "mainClass": "com.github.jie65535.opencommand.OpenCommandPlugin", "authors": ["jie65535"] } \ No newline at end of file