mirror of
https://github.com/Melledy/LunarCore.git
synced 2025-12-14 14:24:37 +01:00
Get regions from the database
This commit is contained in:
@@ -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());
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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()));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user