diff --git a/VelocityCore/src/de/steamwar/velocitycore/listeners/IPSanitizer.java b/VelocityCore/src/de/steamwar/velocitycore/listeners/IPSanitizer.java index 7b0876a5..bc8c42ba 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/listeners/IPSanitizer.java +++ b/VelocityCore/src/de/steamwar/velocitycore/listeners/IPSanitizer.java @@ -20,6 +20,7 @@ package de.steamwar.velocitycore.listeners; import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.connection.DisconnectEvent; import com.velocitypowered.api.event.connection.PreLoginEvent; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.proxy.connection.MinecraftConnection; @@ -32,21 +33,32 @@ import de.steamwar.velocitycore.mods.Hostname; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; import java.util.logging.Level; public class IPSanitizer extends BasicListener { - private static final Reflection.Field remoteAddress = new Reflection.Field<>(MinecraftConnection.class, "remoteAddress"); + private static final Map trueAddress = new HashMap<>(); // Will likely slightly leak over time public static InetAddress getTrueAddress(Player player) { - return ((InetSocketAddress) ((ConnectedPlayer)player).getConnection().getChannel().remoteAddress()).getAddress(); + return trueAddress.getOrDefault(player.getUniqueId(), ((InetSocketAddress) ((ConnectedPlayer)player).getConnection().getChannel().remoteAddress()).getAddress()); } - private final InetSocketAddress sanitized = new InetSocketAddress("127.127.127.127", 25565); + private static final Reflection.Field remoteAddress = new Reflection.Field<>(MinecraftConnection.class, "remoteAddress"); + private static final InetSocketAddress sanitized = new InetSocketAddress("127.127.127.127", 25565); @Subscribe public void loginEvent(PreLoginEvent e) { - VelocityCore.getLogger().log(Level.INFO, "%s has logged in with user name %s".formatted(e.getConnection().getRemoteAddress(), e.getUsername())); + InetSocketAddress address = e.getConnection().getRemoteAddress(); + VelocityCore.getLogger().log(Level.INFO, "%s has logged in with user name %s".formatted(address, e.getUsername())); + trueAddress.put(e.getUniqueId(), address.getAddress()); remoteAddress.set(Hostname.getInitialInboundConnection((LoginInboundConnection) e.getConnection()).getConnection(), sanitized); } + + @Subscribe + public void disconnectEvent(DisconnectEvent e) { + trueAddress.remove(e.getPlayer().getUniqueId()); + } }