From 062187d1c11ced97d57ce4c58f3f62632e987aab Mon Sep 17 00:00:00 2001 From: jie65535 Date: Sat, 14 May 2022 13:30:13 +0800 Subject: [PATCH] Update version to dev-1.1.0 Support gc-dev-1.1.2 Fix token expired but not deleted bug --- build.gradle | 2 +- .../opencommand/OpenCommandHandler.java | 30 ++++++++++++++----- .../opencommand/OpenCommandPlugin.java | 12 +++----- src/main/resources/plugin.json | 2 +- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/build.gradle b/build.gradle index 24803c6..f0d3fbf 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group 'com.github.jie65535.opencommand' -version 'dev-1.0.0' +version 'dev-1.1.0' sourceCompatibility = 17 targetCompatibility = 17 diff --git a/src/main/java/com/github/jie65535/opencommand/OpenCommandHandler.java b/src/main/java/com/github/jie65535/opencommand/OpenCommandHandler.java index 9e4b3bb..473df17 100644 --- a/src/main/java/com/github/jie65535/opencommand/OpenCommandHandler.java +++ b/src/main/java/com/github/jie65535/opencommand/OpenCommandHandler.java @@ -4,12 +4,14 @@ import com.github.jie65535.opencommand.json.JsonRequest; import com.github.jie65535.opencommand.json.JsonResponse; import emu.grasscutter.Grasscutter; import emu.grasscutter.command.CommandMap; +import emu.grasscutter.server.http.Router; import emu.grasscutter.utils.Crypto; import emu.grasscutter.utils.MessageHandler; import emu.grasscutter.utils.Utils; -import express.http.HttpContextHandler; +import express.Express; import express.http.Request; import express.http.Response; +import io.javalin.Javalin; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; @@ -18,15 +20,19 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; -public final class OpenCommandHandler implements HttpContextHandler { +public final class OpenCommandHandler implements Router { + + @Override + public void applyRoutes(Express express, Javalin javalin) { + express.post("/opencommand/api", OpenCommandHandler::handle); + } private static final Map clients = new HashMap<>(); private static final Map tokenExpireTime = new HashMap<>(); private static final Map codes = new HashMap<>(); private static final Int2ObjectMap codeExpireTime = new Int2ObjectOpenHashMap<>(); - @Override - public void handle(Request request, Response response) throws IOException { + public static void handle(Request request, Response response) { // Trigger cleanup action cleanupExpiredData(); var now = new Date(); @@ -70,6 +76,7 @@ public final class OpenCommandHandler implements HttpContextHandler { response.json(new JsonResponse(401, "Unauthorized")); return; } + if (codes.containsKey(req.token)) { if (req.action.equals("verify")) { if (codes.get(req.token).equals(req.data)) { @@ -85,7 +92,7 @@ public final class OpenCommandHandler implements HttpContextHandler { } else { if (req.action.equals("command")) { // update token expire time - tokenExpireTime.put(req.token, new Date(now.getTime() + 60 * 60 * 1000)); + tokenExpireTime.put(req.token, new Date(now.getTime() + 24 * 60 * 60 * 1000)); var playerId = clients.get(req.token); var player = Grasscutter.getGameServer().getPlayerByUid(playerId); var command = req.data.toString(); @@ -105,9 +112,18 @@ public final class OpenCommandHandler implements HttpContextHandler { response.json(new JsonResponse(403, "forbidden")); } - private void cleanupExpiredData() { + private static void cleanupExpiredData() { var now = new Date(); codeExpireTime.int2ObjectEntrySet().removeIf(entry -> entry.getValue().before(now)); - tokenExpireTime.entrySet().removeIf(entry -> entry.getValue().before(now)); + + var it = tokenExpireTime.entrySet().iterator(); + while (it.hasNext()) { + var entry = it.next(); + if (entry.getValue().before(now)) { + it.remove(); + // remove expired token + clients.remove(entry.getKey()); + } + } } } diff --git a/src/main/java/com/github/jie65535/opencommand/OpenCommandPlugin.java b/src/main/java/com/github/jie65535/opencommand/OpenCommandPlugin.java index db41c94..1e9eaf9 100644 --- a/src/main/java/com/github/jie65535/opencommand/OpenCommandPlugin.java +++ b/src/main/java/com/github/jie65535/opencommand/OpenCommandPlugin.java @@ -4,23 +4,19 @@ import emu.grasscutter.Grasscutter; import emu.grasscutter.plugin.Plugin; public class OpenCommandPlugin extends Plugin { - private OpenCommandHandler handler; - @Override public void onLoad() { - handler = new OpenCommandHandler(); - } + } @Override public void onEnable() { - var app = Grasscutter.getDispatchServer().getServer(); - app.post("/opencommand/api", handler); - Grasscutter.getLogger().info("Open command enabled"); + Grasscutter.getHttpServer().addRouter(OpenCommandHandler.class); + Grasscutter.getLogger().info("[OpenCommand] Enabled"); } @Override public void onDisable() { - + Grasscutter.getLogger().info("[OpenCommand] Disabled"); } } diff --git a/src/main/resources/plugin.json b/src/main/resources/plugin.json index 5e1b9bf..a88ae84 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.0.0", + "version": "dev-1.1.0", "mainClass": "com.github.jie65535.opencommand.OpenCommandPlugin", "authors": ["jie65535"] } \ No newline at end of file