Now detects when server switch is possible
This commit is contained in:
parent
621ad9222b
commit
8a00f85993
|
|
@ -12,6 +12,7 @@ import com.velocitypowered.api.proxy.server.RegisteredServer;
|
||||||
|
|
||||||
import org.adde0109.ambassador.Forge.ForgeConnection;
|
import org.adde0109.ambassador.Forge.ForgeConnection;
|
||||||
import org.adde0109.ambassador.Forge.ForgeHandshakeHandler;
|
import org.adde0109.ambassador.Forge.ForgeHandshakeHandler;
|
||||||
|
import org.adde0109.ambassador.Forge.ForgeServerConnection;
|
||||||
import org.checkerframework.checker.index.qual.PolyUpperBound;
|
import org.checkerframework.checker.index.qual.PolyUpperBound;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
|
@ -52,11 +53,31 @@ public class Ambassador {
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void onServerPreConnectEvent(ServerPreConnectEvent event, Continuation continuation) {
|
public void onServerPreConnectEvent(ServerPreConnectEvent event, Continuation continuation) {
|
||||||
ForgeConnection forgeConnection = forgeHandshakeHandler.getForgeConnection(event.getPlayer());
|
Optional<ForgeConnection> forgeConnection = forgeHandshakeHandler.getForgeConnection(event.getPlayer());
|
||||||
if (forgeConnection != null) {
|
Optional<ForgeServerConnection> forgeServerConnectionOptional = forgeHandshakeHandler.getForgeServerConnection(event.getOriginalServer());
|
||||||
|
if (forgeConnection.isPresent()) {
|
||||||
|
ForgeServerConnection forgeServerConnection;
|
||||||
|
if (forgeServerConnectionOptional.isEmpty()) {
|
||||||
|
forgeServerConnection = new ForgeServerConnection(event.getOriginalServer(), logger);
|
||||||
|
} else {
|
||||||
|
forgeServerConnection = forgeServerConnectionOptional.get();
|
||||||
|
}
|
||||||
|
forgeServerConnection.getHandshake().whenComplete((msg, ex) -> {
|
||||||
|
if (ex != null) {
|
||||||
|
continuation.resume();
|
||||||
|
} else {
|
||||||
|
if (Arrays.equals(msg.modListPacket,forgeConnection.get().getTransmittedHandshake().modListPacket)) {
|
||||||
|
continuation.resume();
|
||||||
|
} else {
|
||||||
|
event.setResult(ServerPreConnectEvent.ServerResult.denied());
|
||||||
|
logger.warn("Resync needed");
|
||||||
|
continuation.resume();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
continuation.resume();
|
||||||
}
|
}
|
||||||
continuation.resume();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,7 @@ public class ForgeConnection {
|
||||||
future.complete(null);
|
future.complete(null);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
forgeConnection.transmittedHandshake = msg;
|
||||||
}
|
}
|
||||||
//Write
|
//Write
|
||||||
continuation.resume();
|
continuation.resume();
|
||||||
|
|
@ -73,4 +74,8 @@ public class ForgeConnection {
|
||||||
return connection;
|
return connection;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ForgeHandshakeUtils.CachedServerHandshake getTransmittedHandshake() {
|
||||||
|
return transmittedHandshake;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ import com.velocitypowered.api.proxy.server.RegisteredServer;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
import org.adde0109.ambassador.AmbassadorConfig;
|
import org.adde0109.ambassador.AmbassadorConfig;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
|
@ -20,9 +21,9 @@ public class ForgeHandshakeHandler {
|
||||||
private final ProxyServer server;
|
private final ProxyServer server;
|
||||||
private final Logger logger;
|
private final Logger logger;
|
||||||
|
|
||||||
public Map<RegisteredServer, ForgeServerConnection>
|
private Map<RegisteredServer, ForgeServerConnection>
|
||||||
forgeServerConnectionMap = new HashMap<RegisteredServer,ForgeServerConnection>();
|
forgeServerConnectionMap = new HashMap<RegisteredServer,ForgeServerConnection>();
|
||||||
public Map<InetSocketAddress,ForgeConnection> incomingForgeConnections = new HashMap<InetSocketAddress,ForgeConnection>();
|
private Map<InetSocketAddress,ForgeConnection> incomingForgeConnections = new HashMap<InetSocketAddress,ForgeConnection>();
|
||||||
|
|
||||||
|
|
||||||
public ForgeHandshakeHandler(AmbassadorConfig config, ProxyServer server, Logger logger) {
|
public ForgeHandshakeHandler(AmbassadorConfig config, ProxyServer server, Logger logger) {
|
||||||
|
|
@ -65,13 +66,17 @@ public class ForgeHandshakeHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ForgeConnection getForgeConnection(Player player) {
|
public Optional<ForgeConnection> getForgeConnection(Player player) {
|
||||||
return getForgeConnection(player.getRemoteAddress());
|
return getForgeConnection(player.getRemoteAddress());
|
||||||
}
|
}
|
||||||
|
|
||||||
private ForgeConnection getForgeConnection(InetSocketAddress socketAddress) {
|
private Optional<ForgeConnection> getForgeConnection(InetSocketAddress socketAddress) {
|
||||||
incomingForgeConnections.values().removeIf((c) -> !c.getConnection().isActive());
|
incomingForgeConnections.values().removeIf((c) -> !c.getConnection().isActive());
|
||||||
return incomingForgeConnections.get(socketAddress);
|
return Optional.ofNullable(incomingForgeConnections.get(socketAddress));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<ForgeServerConnection> getForgeServerConnection(RegisteredServer registeredServer) {
|
||||||
|
return Optional.ofNullable(forgeServerConnectionMap.get(registeredServer));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user