From a92638c0975a6cd5defbc78a9d3b0874c5d194b5 Mon Sep 17 00:00:00 2001 From: Evert Prants Date: Mon, 30 Sep 2024 20:38:41 +0300 Subject: [PATCH] Add forced host check --- build.gradle | 2 +- .../actualplayer/rememberme/RememberMe.java | 37 ++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index aebd3e7..f863316 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ plugins { sourceCompatibility = JavaVersion.VERSION_17 group 'com.actualplayer' -version '1.2.4' +version '1.3.0' description 'A way for the user to login to the server he last connected to.' repositories { diff --git a/src/main/java/com/actualplayer/rememberme/RememberMe.java b/src/main/java/com/actualplayer/rememberme/RememberMe.java index 3366776..60a2b53 100644 --- a/src/main/java/com/actualplayer/rememberme/RememberMe.java +++ b/src/main/java/com/actualplayer/rememberme/RememberMe.java @@ -4,7 +4,6 @@ import com.actualplayer.rememberme.handlers.*; import com.google.inject.Inject; import com.google.inject.name.Named; import com.velocitypowered.api.event.Subscribe; -import com.velocitypowered.api.event.connection.LoginEvent; import com.velocitypowered.api.event.player.PlayerChooseInitialServerEvent; import com.velocitypowered.api.event.player.ServerConnectedEvent; import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; @@ -12,6 +11,7 @@ import com.velocitypowered.api.plugin.Dependency; import com.velocitypowered.api.plugin.Plugin; import com.velocitypowered.api.plugin.PluginContainer; import com.velocitypowered.api.plugin.annotation.DataDirectory; +import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; import lombok.Getter; import net.luckperms.api.LuckPerms; @@ -19,6 +19,7 @@ import net.luckperms.api.LuckPermsProvider; import org.slf4j.Logger; import java.nio.file.Path; +import java.util.Optional; import java.util.concurrent.CancellationException; import java.util.concurrent.CompletionException; @@ -70,6 +71,10 @@ public class RememberMe { @Subscribe public void onServerChooseEvent(PlayerChooseInitialServerEvent chooseServerEvent) { + if (wasDirectConnection(chooseServerEvent)) { + return; + } + // Ignore plugin when user has notransfer permission if (!chooseServerEvent.getPlayer().hasPermission("rememberme.notransfer")) { handler.getLastServerName(chooseServerEvent.getPlayer().getUniqueId()).thenAcceptAsync(lastServerName -> { @@ -89,6 +94,36 @@ public class RememberMe { @Subscribe public void onServerChange(ServerConnectedEvent serverConnectedEvent) { + if (getPlayerForcedHost(serverConnectedEvent.getPlayer()).isPresent()) { + // was a direct connection, do not save the last server name + return; + } + handler.setLastServerName(serverConnectedEvent.getPlayer().getUniqueId(), serverConnectedEvent.getServer().getServerInfo().getName()); } + + public boolean wasDirectConnection(PlayerChooseInitialServerEvent chooseServerEvent) { + var connectedToHost = getPlayerForcedHost(chooseServerEvent.getPlayer()); + if (connectedToHost.isEmpty()) { + return false; + } + + getLogger().info("Player {} connected to a forced host ({})", chooseServerEvent.getPlayer().getUsername(), connectedToHost.get()); + return true; + } + + public Optional getPlayerForcedHost(Player player) { + var overrides = getServer().getConfiguration().getForcedHosts(); + var connectedTo = player.getVirtualHost(); + if (connectedTo.isEmpty()) { + return Optional.empty(); + } + + var connectedToHost = connectedTo.get().getHostName(); + if (!overrides.containsKey(connectedToHost)) { + return Optional.empty(); + } + + return Optional.of(connectedToHost); + } }