From 861feafa0831dbbc954ee6d3b5920b2fcd523c6b Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Mon, 9 Oct 2023 18:55:41 -0700 Subject: [PATCH] Get regions from the database --- .../emu/lunarcore/server/game/GameServer.java | 1 + .../emu/lunarcore/server/game/RegionInfo.java | 11 +++++ .../emu/lunarcore/server/http/HttpServer.java | 45 ++++++++++++++++++- .../http/handlers/QueryDispatchHandler.java | 32 ++++++------- 4 files changed, 73 insertions(+), 16 deletions(-) diff --git a/src/main/java/emu/lunarcore/server/game/GameServer.java b/src/main/java/emu/lunarcore/server/game/GameServer.java index 423269b..45f425b 100644 --- a/src/main/java/emu/lunarcore/server/game/GameServer.java +++ b/src/main/java/emu/lunarcore/server/game/GameServer.java @@ -89,6 +89,7 @@ public class GameServer extends KcpServer { // Setup region info this.info.setUp(true); this.info.save(); + LunarRail.getHttpServer().forceRegionListRefresh(); // Done LunarRail.getLogger().info("Game Server started on " + address.getPort()); diff --git a/src/main/java/emu/lunarcore/server/game/RegionInfo.java b/src/main/java/emu/lunarcore/server/game/RegionInfo.java index 5e7c9a8..8469514 100644 --- a/src/main/java/emu/lunarcore/server/game/RegionInfo.java +++ b/src/main/java/emu/lunarcore/server/game/RegionInfo.java @@ -3,6 +3,7 @@ package emu.lunarcore.server.game; import dev.morphia.annotations.Entity; import dev.morphia.annotations.Id; import emu.lunarcore.LunarRail; +import emu.lunarcore.proto.RegionEntryOuterClass.RegionEntry; import lombok.Getter; import lombok.Setter; @@ -31,6 +32,16 @@ public class RegionInfo { this.gameAddress = server.getServerConfig().getDisplayAddress(); this.up = true; } + + public RegionEntry toProto() { + var proto = RegionEntry.newInstance() + .setName(this.getId()) + .setDispatchUrl(this.getGateAddress() + "/query_gateway") + .setEnvType("2") + .setDisplayName(this.getName()); + + return proto; + } public void save() { LunarRail.getAccountDatabase().save(this); diff --git a/src/main/java/emu/lunarcore/server/http/HttpServer.java b/src/main/java/emu/lunarcore/server/http/HttpServer.java index ba28e40..bb9dfca 100644 --- a/src/main/java/emu/lunarcore/server/http/HttpServer.java +++ b/src/main/java/emu/lunarcore/server/http/HttpServer.java @@ -1,5 +1,10 @@ package emu.lunarcore.server.http; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.SecureRequestCustomizer; @@ -9,19 +14,29 @@ import org.eclipse.jetty.util.ssl.SslContextFactory; import emu.lunarcore.Config.ServerConfig; import emu.lunarcore.LunarRail; import emu.lunarcore.LunarRail.ServerType; +import emu.lunarcore.server.game.RegionInfo; import emu.lunarcore.server.http.handlers.*; import io.javalin.Javalin; import io.javalin.http.ContentType; import io.javalin.http.Context; +import it.unimi.dsi.fastutil.objects.Object2ObjectMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; public class HttpServer { private final Javalin app; private final ServerType type; + + private List modes; private boolean started; + + private long nextRegionUpdate; + private Object2ObjectMap regions; public HttpServer(ServerType type) { this.type = type; this.app = Javalin.create(); + this.modes = new LinkedList<>(); + this.regions = new Object2ObjectOpenHashMap<>(); this.addRoutes(); } @@ -54,6 +69,27 @@ public class HttpServer { sslContextFactory.setRenegotiationAllowed(false); return sslContextFactory; } + + public void forceRegionListRefresh() { + this.nextRegionUpdate = 0; + } + + public Object2ObjectMap getRegions() { + synchronized (this.regions) { + if (System.currentTimeMillis() > this.nextRegionUpdate) { + this.regions.clear(); + + LunarRail.getAccountDatabase().getObjects(RegionInfo.class) + .forEach(region -> { + this.regions.put(region.getId(), region); + }); + + this.nextRegionUpdate = System.currentTimeMillis() + 60_000; + } + + return regions; + } + } public void start() { if (this.started) return; @@ -72,6 +108,7 @@ public class HttpServer { } // Done + LunarRail.getLogger().info("Http Server running as: " + this.modes.stream().collect(Collectors.joining(", "))); LunarRail.getLogger().info("Http Server started on " + getServerConfig().getPort()); } @@ -91,7 +128,7 @@ public class HttpServer { private void addDispatchRoutes() { // Get region info - getApp().get("/query_dispatch", new QueryDispatchHandler()); + getApp().get("/query_dispatch", new QueryDispatchHandler(this)); // Captcha -> api-account-os.hoyoverse.com getApp().post("/account/risky/api/check", new HttpJsonResponse("{\"retcode\":0,\"message\":\"OK\",\"data\":{\"id\":\"none\",\"action\":\"ACTION_NONE\",\"geetest\":null}}")); @@ -126,6 +163,9 @@ public class HttpServer { // abtest-api-data-sg.hoyoverse.com getApp().post("/data_abtest_api/config/experiment/list", new HttpJsonResponse("{\"retcode\":0,\"success\":true,\"message\":\"\",\"data\":[{\"code\":1000,\"type\":2,\"config_id\":\"14\",\"period_id\":\"6125_197\",\"version\":\"1\",\"configs\":{\"cardType\":\"direct\"}}]}")); + + // Add mode + this.modes.add("DISPATCH"); } private void addLogServerRoutes() { @@ -143,6 +183,9 @@ public class HttpServer { private void addGateServerRoutes() { // Gateway info getApp().get("/query_gateway", new QueryGatewayHandler()); + + // Add mode + this.modes.add("GATESERVER"); } private void notFoundHandler(Context ctx) { diff --git a/src/main/java/emu/lunarcore/server/http/handlers/QueryDispatchHandler.java b/src/main/java/emu/lunarcore/server/http/handlers/QueryDispatchHandler.java index 27b3772..0bf34cd 100644 --- a/src/main/java/emu/lunarcore/server/http/handlers/QueryDispatchHandler.java +++ b/src/main/java/emu/lunarcore/server/http/handlers/QueryDispatchHandler.java @@ -5,32 +5,34 @@ import org.jetbrains.annotations.NotNull; import emu.lunarcore.LunarRail; import emu.lunarcore.proto.DispatchRegionDataOuterClass.DispatchRegionData; import emu.lunarcore.proto.RegionEntryOuterClass.RegionEntry; +import emu.lunarcore.server.game.RegionInfo; +import emu.lunarcore.server.http.HttpServer; import emu.lunarcore.util.Utils; import io.javalin.http.Context; import io.javalin.http.Handler; public class QueryDispatchHandler implements Handler { - - public QueryDispatchHandler() { - + private final HttpServer server; + + public QueryDispatchHandler(HttpServer server) { + this.server = server; } @Override public void handle(@NotNull Context ctx) throws Exception { - // Get regions TODO get regions from database - RegionEntry region = RegionEntry.newInstance() - .setName(LunarRail.getConfig().getGameServer().getId()) - .setDispatchUrl(LunarRail.getConfig().getHttpServer().getDisplayAddress() + "/query_gateway") - .setEnvType("2") - .setDisplayName(LunarRail.getConfig().getGameServer().getName()); - - // Build region list - DispatchRegionData regions = DispatchRegionData.newInstance(); - regions.addRegionList(region); - // Log LunarRail.getLogger().info("Client request: query_dispatch"); - + + // Build region list + DispatchRegionData regions = DispatchRegionData.newInstance(); + + // Get regions + var regionMap = server.getRegions(); + + synchronized (regionMap) { + regionMap.values().stream().map(RegionInfo::toProto).forEach(regions::addRegionList); + } + // Encode to base64 and send to client ctx.result(Utils.base64Encode(regions.toByteArray())); }