From 7c9c1495be468beaaec022367310b4832d712192 Mon Sep 17 00:00:00 2001 From: fabaindaiz Date: Mon, 16 Dec 2024 14:32:11 -0300 Subject: [PATCH] feat allow virtual servers on limbo --- .../librelogin/api/server/ServerHandler.java | 5 ++- .../kyngs/librelogin/bungeecord/Blockers.java | 2 +- .../bungeecord/BungeeCordPlatformHandle.java | 2 +- .../common/AuthenticLibreLogin.java | 8 ++-- .../common/config/ConfigurationKeys.java | 12 ++++-- .../common/server/AuthenticServerHandler.java | 40 ++++++++++++------- .../xyz/kyngs/librelogin/paper/Blockers.java | 2 +- .../librelogin/paper/PaperListeners.java | 4 +- .../librelogin/paper/PaperPlatformHandle.java | 2 +- .../kyngs/librelogin/velocity/Blockers.java | 2 +- .../velocity/VelocityPlatformHandle.java | 2 +- 11 files changed, 51 insertions(+), 30 deletions(-) diff --git a/API/src/main/java/xyz/kyngs/librelogin/api/server/ServerHandler.java b/API/src/main/java/xyz/kyngs/librelogin/api/server/ServerHandler.java index 7bc363e6..e043ca8e 100644 --- a/API/src/main/java/xyz/kyngs/librelogin/api/server/ServerHandler.java +++ b/API/src/main/java/xyz/kyngs/librelogin/api/server/ServerHandler.java @@ -74,7 +74,7 @@ public interface ServerHandler { * * @return The limbo servers */ - Collection getLimboServers(); + Multimap getLimboServers(); /** * Registers a new lobby server. @@ -97,7 +97,8 @@ default void registerLobbyServer(S server) { * Registers a new limbo server. * * @param server The server to register + * @param forcedHost The forced host */ - void registerLimboServer(S server); + void registerLimboServer(S server, String forcedHost); } diff --git a/Plugin/src/main/java/xyz/kyngs/librelogin/bungeecord/Blockers.java b/Plugin/src/main/java/xyz/kyngs/librelogin/bungeecord/Blockers.java index f74ab78a..31ba3e87 100644 --- a/Plugin/src/main/java/xyz/kyngs/librelogin/bungeecord/Blockers.java +++ b/Plugin/src/main/java/xyz/kyngs/librelogin/bungeecord/Blockers.java @@ -65,7 +65,7 @@ public void onServerConnect(ServerConnectEvent event) { if (!authorizationProvider.isAuthorized(event.getPlayer()) && event.getReason() != ServerConnectEvent.Reason.JOIN_PROXY) { event.setCancelled(true); } else if (authorizationProvider.isAwaiting2FA(event.getPlayer())) { - if (!configuration.get(LIMBO).contains(event.getTarget().getName())) { + if (!configuration.get(LIMBO).containsValue(event.getTarget().getName())) { event.setCancelled(true); } } diff --git a/Plugin/src/main/java/xyz/kyngs/librelogin/bungeecord/BungeeCordPlatformHandle.java b/Plugin/src/main/java/xyz/kyngs/librelogin/bungeecord/BungeeCordPlatformHandle.java index c1cd120f..95acacd8 100644 --- a/Plugin/src/main/java/xyz/kyngs/librelogin/bungeecord/BungeeCordPlatformHandle.java +++ b/Plugin/src/main/java/xyz/kyngs/librelogin/bungeecord/BungeeCordPlatformHandle.java @@ -166,7 +166,7 @@ public ProxyData getProxyData() { .add("main", plugin.getDescription().getMain()) .toString() ).toList(), - plugin.getServerHandler().getLimboServers().stream().map(this::fromServer).toList(), + plugin.getServerHandler().getLimboServers().values().stream().map(this::fromServer).toList(), plugin.getServerHandler().getLobbyServers().values().stream().map(this::fromServer).toList() ); } diff --git a/Plugin/src/main/java/xyz/kyngs/librelogin/common/AuthenticLibreLogin.java b/Plugin/src/main/java/xyz/kyngs/librelogin/common/AuthenticLibreLogin.java index bde0da2d..a28c5d31 100644 --- a/Plugin/src/main/java/xyz/kyngs/librelogin/common/AuthenticLibreLogin.java +++ b/Plugin/src/main/java/xyz/kyngs/librelogin/common/AuthenticLibreLogin.java @@ -253,7 +253,9 @@ protected void enable() { } if (platformHandle.getPlatformIdentifier().equals("paper")) { - LIMBO.setDefault(List.of("limbo")); + var limbo = HashMultimap.create(); + limbo.put("root", "limbo"); + LIMBO.setDefault(limbo); var lobby = HashMultimap.create(); lobby.put("root", "world"); @@ -442,7 +444,7 @@ private void loadConfigs() { var lobby = configuration.get(LOBBY); for (String value : lobby.values()) { - if (limbos.contains(value)) { + if (limbos.containsValue(value)) { throw new CorruptedConfigurationException("Lobby server/world %s is also a limbo server/world, this is not allowed".formatted(value)); } } @@ -792,7 +794,7 @@ public void onExit(P player) { var server = platformHandle.getPlayersServerName(player); if (server == null) return; var user = databaseProvider.getByUUID(platformHandle.getUUIDForPlayer(player)); - if (user != null && !getConfiguration().get(LIMBO).contains(server)) { + if (user != null && !getConfiguration().get(LIMBO).containsValue(server)) { user.setLastServer(server); databaseProvider.updateUser(user); } diff --git a/Plugin/src/main/java/xyz/kyngs/librelogin/common/config/ConfigurationKeys.java b/Plugin/src/main/java/xyz/kyngs/librelogin/common/config/ConfigurationKeys.java index 309aff98..bf0e5212 100644 --- a/Plugin/src/main/java/xyz/kyngs/librelogin/common/config/ConfigurationKeys.java +++ b/Plugin/src/main/java/xyz/kyngs/librelogin/common/config/ConfigurationKeys.java @@ -36,13 +36,19 @@ public class ConfigurationKeys { ConfigurateHelper::getStringList ); - public static final ConfigurationKey> LIMBO = new ConfigurationKey<>( + public static final Multimap LIMBO_DEFAULT = HashMultimap.create(); + public static final ConfigurationKey> LIMBO = new ConfigurationKey<>( "limbo", - List.of("limbo0", "limbo1"), + LIMBO_DEFAULT, "The authentication servers/worlds, players should be sent to, when not authenticated. On Paper, players will be spawned on the world spawn. THIS SERVERS MUST BE REGISTERED IN THE PROXY CONFIG. IN CASE OF PAPER, THE WORLDS MUST EXIST.", - ConfigurateHelper::getStringList + ConfigurateHelper::getServerMap ); + static { + LIMBO_DEFAULT.put("root", "limbo0"); + LIMBO_DEFAULT.put("root", "limbo1"); + } + public static final Multimap LOBBY_DEFAULT = HashMultimap.create(); public static final ConfigurationKey> LOBBY = new ConfigurationKey<>( "lobby", diff --git a/Plugin/src/main/java/xyz/kyngs/librelogin/common/server/AuthenticServerHandler.java b/Plugin/src/main/java/xyz/kyngs/librelogin/common/server/AuthenticServerHandler.java index d59bb736..86fa54cc 100644 --- a/Plugin/src/main/java/xyz/kyngs/librelogin/common/server/AuthenticServerHandler.java +++ b/Plugin/src/main/java/xyz/kyngs/librelogin/common/server/AuthenticServerHandler.java @@ -31,14 +31,14 @@ public class AuthenticServerHandler implements ServerHandler { private final LoadingCache> pingCache; private final AuthenticLibreLogin plugin; - private final Collection limboServers; + private final Multimap limboServers; private final Multimap lobbyServers; public AuthenticServerHandler(AuthenticLibreLogin plugin) { this.plugin = plugin; this.lobbyServers = HashMultimap.create(); - this.limboServers = new ArrayList<>(); + this.limboServers = HashMultimap.create(); this.pingCache = Caffeine.newBuilder() .build(server -> { @@ -59,14 +59,14 @@ public AuthenticServerHandler(AuthenticLibreLogin plugin) { if (plugin.getConfiguration().get(ConfigurationKeys.PING_SERVERS)) plugin.getLogger().info("Pinging servers..."); - for (String limbo : plugin.getConfiguration().get(LIMBO)) { - var server = handle.getServer(limbo, true); - if (server != null) { - registerLimboServer(server); + plugin.getConfiguration().get(ConfigurationKeys.LIMBO).forEach((forced, server) -> { + var s = handle.getServer(server, true); + if (s != null) { + registerLimboServer(s, forced); } else { - plugin.getLogger().warn("Limbo server/world " + limbo + " not found!"); + plugin.getLogger().warn("Limbo server/world " + server + " not found!"); } - } + }); plugin.getConfiguration().get(ConfigurationKeys.LOBBY).forEach((forced, server) -> { var s = handle.getServer(server, false); @@ -143,15 +143,22 @@ public S chooseLobbyServer(@Nullable User user, P player, boolean remember) { return chooseLobbyServerInternal(user, player, remember, null); } - @Override - public S chooseLimboServer(User user, P player) { + public S chooseLimboServerInternal(@Nullable User user, P player) { var event = new AuthenticLimboServerChooseEvent<>(user, player, plugin); plugin.getEventProvider().fire(plugin.getEventTypes().limboServerChoose, event); if (event.getServer() != null) return event.getServer(); - return limboServers.stream() + var virtual = plugin.getPlatformHandle().getPlayersVirtualHost(player); + + plugin.getLogger().debug("Virtual host for player " + plugin.getPlatformHandle().getUsernameForPlayer(player) + ": " + virtual); + + var servers = virtual == null ? limboServers.get("root") : limboServers.get(virtual); + + if (servers.isEmpty()) servers = limboServers.get("root"); + + return servers.stream() .filter(server -> { var ping = getLatestPing(server); @@ -161,13 +168,18 @@ public S chooseLimboServer(User user, P player) { .orElse(null); } + @Override + public S chooseLimboServer(User user, P player) { + return chooseLimboServerInternal(user, player); + } + @Override public Multimap getLobbyServers() { return lobbyServers; } @Override - public Collection getLimboServers() { + public Multimap getLimboServers() { return limboServers; } @@ -178,8 +190,8 @@ public void registerLobbyServer(S server, String forcedHost) { } @Override - public void registerLimboServer(S server) { + public void registerLimboServer(S server, String forcedHost) { getLatestPing(server); - limboServers.add(server); + limboServers.put(forcedHost, server); } } diff --git a/Plugin/src/main/java/xyz/kyngs/librelogin/paper/Blockers.java b/Plugin/src/main/java/xyz/kyngs/librelogin/paper/Blockers.java index a9d83660..b9fb1042 100644 --- a/Plugin/src/main/java/xyz/kyngs/librelogin/paper/Blockers.java +++ b/Plugin/src/main/java/xyz/kyngs/librelogin/paper/Blockers.java @@ -58,7 +58,7 @@ public void onTeleport(PlayerTeleportEvent event) { if (inLimbo(event.getPlayer())) { event.setCancelled(true); } else { - if (serverHandler.getLimboServers().contains(event.getTo().getWorld()) && !event.getPlayer().hasPermission("librelogin.limbo.access")) { + if (serverHandler.getLimboServers().containsValue(event.getTo().getWorld()) && !event.getPlayer().hasPermission("librelogin.limbo.access")) { event.setCancelled(true); } } diff --git a/Plugin/src/main/java/xyz/kyngs/librelogin/paper/PaperListeners.java b/Plugin/src/main/java/xyz/kyngs/librelogin/paper/PaperListeners.java index b2db513d..362ef3fa 100644 --- a/Plugin/src/main/java/xyz/kyngs/librelogin/paper/PaperListeners.java +++ b/Plugin/src/main/java/xyz/kyngs/librelogin/paper/PaperListeners.java @@ -154,8 +154,8 @@ public void chooseWorld(PlayerSpawnLocationEvent event) { event.setSpawnLocation(bed == null ? world.value().getSpawnLocation() : bed); } //This is terrible, but should work - if (event.getPlayer().hasPlayedBefore() && !plugin.getConfiguration().get(ConfigurationKeys.LIMBO).contains(event.getSpawnLocation().getWorld().getName())) { - if (plugin.getConfiguration().get(ConfigurationKeys.LIMBO).contains(world.value().getName())) { + if (event.getPlayer().hasPlayedBefore() && !plugin.getConfiguration().get(ConfigurationKeys.LIMBO).containsValue(event.getSpawnLocation().getWorld().getName())) { + if (plugin.getConfiguration().get(ConfigurationKeys.LIMBO).containsValue(world.value().getName())) { spawnLocationCache.put(event.getPlayer(), event.getSpawnLocation()); } else { return; diff --git a/Plugin/src/main/java/xyz/kyngs/librelogin/paper/PaperPlatformHandle.java b/Plugin/src/main/java/xyz/kyngs/librelogin/paper/PaperPlatformHandle.java index d28bdc9b..1bcb035d 100644 --- a/Plugin/src/main/java/xyz/kyngs/librelogin/paper/PaperPlatformHandle.java +++ b/Plugin/src/main/java/xyz/kyngs/librelogin/paper/PaperPlatformHandle.java @@ -149,7 +149,7 @@ public ProxyData getProxyData() { .add("authors", plugin.getDescription().getAuthors()) .toString() ).toList(), - plugin.getServerHandler().getLimboServers().stream().map(this::fromWorld).toList(), + plugin.getServerHandler().getLimboServers().values().stream().map(this::fromWorld).toList(), plugin.getServerHandler().getLobbyServers().values().stream().map(this::fromWorld).toList() ); } diff --git a/Plugin/src/main/java/xyz/kyngs/librelogin/velocity/Blockers.java b/Plugin/src/main/java/xyz/kyngs/librelogin/velocity/Blockers.java index a400e12f..dbcd4716 100644 --- a/Plugin/src/main/java/xyz/kyngs/librelogin/velocity/Blockers.java +++ b/Plugin/src/main/java/xyz/kyngs/librelogin/velocity/Blockers.java @@ -53,7 +53,7 @@ public void onCommand(CommandExecuteEvent event) { @Subscribe(order = PostOrder.FIRST) public void onServerConnect(ServerPreConnectEvent event) { if (authorizationProvider.isAwaiting2FA(event.getPlayer())) { - if (!configuration.get(ConfigurationKeys.LIMBO).contains(event.getOriginalServer().getServerInfo().getName())) { + if (!configuration.get(ConfigurationKeys.LIMBO).containsValue(event.getOriginalServer().getServerInfo().getName())) { event.setResult(ServerPreConnectEvent.ServerResult.denied()); } } diff --git a/Plugin/src/main/java/xyz/kyngs/librelogin/velocity/VelocityPlatformHandle.java b/Plugin/src/main/java/xyz/kyngs/librelogin/velocity/VelocityPlatformHandle.java index 449d1143..3a6b8e45 100644 --- a/Plugin/src/main/java/xyz/kyngs/librelogin/velocity/VelocityPlatformHandle.java +++ b/Plugin/src/main/java/xyz/kyngs/librelogin/velocity/VelocityPlatformHandle.java @@ -144,7 +144,7 @@ public ProxyData getProxyData() { .add("desc", plugin.getDescription().toString()) .toString() ).toList(), - plugin.getServerHandler().getLimboServers().stream().map(Object::toString).toList(), + plugin.getServerHandler().getLimboServers().values().stream().map(Object::toString).toList(), plugin.getServerHandler().getLobbyServers().values().stream().map(Object::toString).toList() ); }