Get regions from the database

This commit is contained in:
Melledy
2023-10-09 18:55:41 -07:00
parent d0c6cd0fe6
commit 861feafa08
4 changed files with 73 additions and 16 deletions

View File

@@ -89,6 +89,7 @@ public class GameServer extends KcpServer {
// Setup region info // Setup region info
this.info.setUp(true); this.info.setUp(true);
this.info.save(); this.info.save();
LunarRail.getHttpServer().forceRegionListRefresh();
// Done // Done
LunarRail.getLogger().info("Game Server started on " + address.getPort()); LunarRail.getLogger().info("Game Server started on " + address.getPort());

View File

@@ -3,6 +3,7 @@ package emu.lunarcore.server.game;
import dev.morphia.annotations.Entity; import dev.morphia.annotations.Entity;
import dev.morphia.annotations.Id; import dev.morphia.annotations.Id;
import emu.lunarcore.LunarRail; import emu.lunarcore.LunarRail;
import emu.lunarcore.proto.RegionEntryOuterClass.RegionEntry;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@@ -31,6 +32,16 @@ public class RegionInfo {
this.gameAddress = server.getServerConfig().getDisplayAddress(); this.gameAddress = server.getServerConfig().getDisplayAddress();
this.up = true; 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() { public void save() {
LunarRail.getAccountDatabase().save(this); LunarRail.getAccountDatabase().save(this);

View File

@@ -1,5 +1,10 @@
package emu.lunarcore.server.http; 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.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.SecureRequestCustomizer; 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.Config.ServerConfig;
import emu.lunarcore.LunarRail; import emu.lunarcore.LunarRail;
import emu.lunarcore.LunarRail.ServerType; import emu.lunarcore.LunarRail.ServerType;
import emu.lunarcore.server.game.RegionInfo;
import emu.lunarcore.server.http.handlers.*; import emu.lunarcore.server.http.handlers.*;
import io.javalin.Javalin; import io.javalin.Javalin;
import io.javalin.http.ContentType; import io.javalin.http.ContentType;
import io.javalin.http.Context; import io.javalin.http.Context;
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
public class HttpServer { public class HttpServer {
private final Javalin app; private final Javalin app;
private final ServerType type; private final ServerType type;
private List<String> modes;
private boolean started; private boolean started;
private long nextRegionUpdate;
private Object2ObjectMap<String, RegionInfo> regions;
public HttpServer(ServerType type) { public HttpServer(ServerType type) {
this.type = type; this.type = type;
this.app = Javalin.create(); this.app = Javalin.create();
this.modes = new LinkedList<>();
this.regions = new Object2ObjectOpenHashMap<>();
this.addRoutes(); this.addRoutes();
} }
@@ -54,6 +69,27 @@ public class HttpServer {
sslContextFactory.setRenegotiationAllowed(false); sslContextFactory.setRenegotiationAllowed(false);
return sslContextFactory; return sslContextFactory;
} }
public void forceRegionListRefresh() {
this.nextRegionUpdate = 0;
}
public Object2ObjectMap<String, RegionInfo> 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() { public void start() {
if (this.started) return; if (this.started) return;
@@ -72,6 +108,7 @@ public class HttpServer {
} }
// Done // Done
LunarRail.getLogger().info("Http Server running as: " + this.modes.stream().collect(Collectors.joining(", ")));
LunarRail.getLogger().info("Http Server started on " + getServerConfig().getPort()); LunarRail.getLogger().info("Http Server started on " + getServerConfig().getPort());
} }
@@ -91,7 +128,7 @@ public class HttpServer {
private void addDispatchRoutes() { private void addDispatchRoutes() {
// Get region info // Get region info
getApp().get("/query_dispatch", new QueryDispatchHandler()); getApp().get("/query_dispatch", new QueryDispatchHandler(this));
// Captcha -> api-account-os.hoyoverse.com // 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}}")); 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 // 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\"}}]}")); 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() { private void addLogServerRoutes() {
@@ -143,6 +183,9 @@ public class HttpServer {
private void addGateServerRoutes() { private void addGateServerRoutes() {
// Gateway info // Gateway info
getApp().get("/query_gateway", new QueryGatewayHandler()); getApp().get("/query_gateway", new QueryGatewayHandler());
// Add mode
this.modes.add("GATESERVER");
} }
private void notFoundHandler(Context ctx) { private void notFoundHandler(Context ctx) {

View File

@@ -5,32 +5,34 @@ import org.jetbrains.annotations.NotNull;
import emu.lunarcore.LunarRail; import emu.lunarcore.LunarRail;
import emu.lunarcore.proto.DispatchRegionDataOuterClass.DispatchRegionData; import emu.lunarcore.proto.DispatchRegionDataOuterClass.DispatchRegionData;
import emu.lunarcore.proto.RegionEntryOuterClass.RegionEntry; import emu.lunarcore.proto.RegionEntryOuterClass.RegionEntry;
import emu.lunarcore.server.game.RegionInfo;
import emu.lunarcore.server.http.HttpServer;
import emu.lunarcore.util.Utils; import emu.lunarcore.util.Utils;
import io.javalin.http.Context; import io.javalin.http.Context;
import io.javalin.http.Handler; import io.javalin.http.Handler;
public class QueryDispatchHandler implements Handler { public class QueryDispatchHandler implements Handler {
private final HttpServer server;
public QueryDispatchHandler() {
public QueryDispatchHandler(HttpServer server) {
this.server = server;
} }
@Override @Override
public void handle(@NotNull Context ctx) throws Exception { 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 // Log
LunarRail.getLogger().info("Client request: query_dispatch"); 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 // Encode to base64 and send to client
ctx.result(Utils.base64Encode(regions.toByteArray())); ctx.result(Utils.base64Encode(regions.toByteArray()));
} }