From 08bfbd746956197edfc403f9b315a4b7105255fd Mon Sep 17 00:00:00 2001 From: Adrian3d04 Date: Thu, 4 Aug 2022 20:01:36 +0000 Subject: [PATCH] feat: Improved connectionRequest method --- .../proxy/listener/ConnectListener.java | 11 ++- .../proxy/listener/PluginMessageListener.java | 68 ++++++++++++------- .../spigot/AuthMeVelocityPlugin.java | 2 +- .../spigot/AuthmePlaceholders.java | 2 +- .../spigot/events/PreSendLoginEvent.java | 7 +- .../spigot/listeners/AuthMeListener.java | 2 +- 6 files changed, 56 insertions(+), 36 deletions(-) diff --git a/proxy/src/main/java/com/glyart/authmevelocity/proxy/listener/ConnectListener.java b/proxy/src/main/java/com/glyart/authmevelocity/proxy/listener/ConnectListener.java index ee24cfd..14cc42e 100644 --- a/proxy/src/main/java/com/glyart/authmevelocity/proxy/listener/ConnectListener.java +++ b/proxy/src/main/java/com/glyart/authmevelocity/proxy/listener/ConnectListener.java @@ -62,18 +62,17 @@ public class ConnectListener { return; } - event.getResult().getServer().ifPresent(server -> { - if(!api.isAuthServer(server)){ - event.setResult(ServerPreConnectEvent.ServerResult.denied()); - } - }); + // this should be present, "event.getResult().isAllowed()" is the "isPresent" check + if(!api.isAuthServer(event.getResult().getServer().get())) { + event.setResult(ServerPreConnectEvent.ServerResult.denied()); + } continuation.resume(); } @Subscribe public void onServerPostConnect(ServerPostConnectEvent event) { final Player player = event.getPlayer(); - if (api.isLogged(player) && api.isInAuthServer(player)){ + if (api.isLogged(player) && api.isInAuthServer(player)) { ByteArrayDataOutput buf = ByteStreams.newDataOutput(); buf.writeUTF("LOGIN"); player.getCurrentServer().ifPresent(sv -> diff --git a/proxy/src/main/java/com/glyart/authmevelocity/proxy/listener/PluginMessageListener.java b/proxy/src/main/java/com/glyart/authmevelocity/proxy/listener/PluginMessageListener.java index 9a9adae..07349fd 100644 --- a/proxy/src/main/java/com/glyart/authmevelocity/proxy/listener/PluginMessageListener.java +++ b/proxy/src/main/java/com/glyart/authmevelocity/proxy/listener/PluginMessageListener.java @@ -15,6 +15,8 @@ import com.glyart.authmevelocity.proxy.event.ProxyUnregisterEvent; import com.google.common.io.ByteArrayDataInput; import com.velocitypowered.api.event.Continuation; import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.ResultedEvent.GenericResult; +import com.velocitypowered.api.proxy.ConnectionRequestBuilder.Result; import com.velocitypowered.api.event.connection.PluginMessageEvent; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; @@ -42,13 +44,13 @@ public class PluginMessageListener { @Subscribe public void onPluginMessage(final PluginMessageEvent event, Continuation continuation) { - if ( - !(event.getSource() instanceof ServerConnection) - || !event.getIdentifier().equals(AuthMeVelocityPlugin.AUTHMEVELOCITY_CHANNEL) - ) { + final boolean cancelled = !(event.getSource() instanceof ServerConnection) + || !event.getIdentifier().equals(AuthMeVelocityPlugin.AUTHMEVELOCITY_CHANNEL); + if (cancelled) { continuation.resume(); return; } + ServerConnection connection = ((ServerConnection)event.getSource()); event.setResult(PluginMessageEvent.ForwardResult.handled()); @@ -57,19 +59,20 @@ public class PluginMessageListener { final String sChannel = input.readUTF(); final String playername = input.readUTF(); final @Nullable Player loggedPlayer = proxy.getPlayer(playername).orElse(null); - switch(sChannel){ + switch (sChannel) { case "LOGIN" : if (loggedPlayer != null && api.addPlayer(loggedPlayer)){ + proxy.getEventManager().fireAndForget(new ProxyLoginEvent(loggedPlayer)); this.createServerConnectionRequest(loggedPlayer, connection); } break; case "LOGOUT": - if(loggedPlayer != null && api.removePlayer(loggedPlayer)){ + if (loggedPlayer != null && api.removePlayer(loggedPlayer)){ proxy.getEventManager().fireAndForget(new ProxyLogoutEvent(loggedPlayer)); } break; case "REGISTER": - if(loggedPlayer != null) + if (loggedPlayer != null) proxy.getEventManager().fireAndForget(new ProxyRegisterEvent(loggedPlayer)); break; case "UNREGISTER": @@ -84,25 +87,38 @@ public class PluginMessageListener { continuation.resume(); } - private void createServerConnectionRequest(Player loggedPlayer, ServerConnection connection){ - final RegisteredServer loginServer = loggedPlayer.getCurrentServer().orElse(connection).getServer(); - proxy.getEventManager().fireAndForget(new ProxyLoginEvent(loggedPlayer)); - if (config.getToServerOptions().sendToServer()) { - final List serverList = config.getToServerOptions().getTeleportServers(); - final String randomServer = serverList.get(rm.nextInt(serverList.size())); - proxy.getServer(randomServer).ifPresentOrElse(serverToSend -> - proxy.getEventManager().fire(new PreSendOnLoginEvent(loggedPlayer, loginServer, serverToSend)).thenAcceptAsync(preSendEvent -> { - if(preSendEvent.getResult().isAllowed()){ - loggedPlayer.createConnectionRequest(serverToSend).connect().thenAcceptAsync(result -> { - if(!result.isSuccessful()) { - logger.info("Unable to connect the player {} to the server {}", - loggedPlayer.getUsername(), - serverToSend.getServerInfo().getName()); - } - }); - } - }) - , () -> logger.warn("The server {} does not exist", randomServer)); + private void createServerConnectionRequest(Player player, ServerConnection connection){ + if (!config.getToServerOptions().sendToServer()) { + return; } + + final RegisteredServer loginServer = player.getCurrentServer().orElse(connection).getServer(); + final String randomServer = this.getRandomServer(); + + proxy.getServer(randomServer).ifPresentOrElse(server -> + proxy.getEventManager().fire(new PreSendOnLoginEvent(player, loginServer, server)) + .thenApply(PreSendOnLoginEvent::getResult) + .thenApply(GenericResult::isAllowed) + .thenAcceptAsync(allowed -> { + if (!allowed) { + return; + } + player.createConnectionRequest(server) + .connect() + .thenApply(Result::isSuccessful) + .thenAcceptAsync(result -> { + if(!result) { + logger.info("Unable to connect the player {} to the server {}", + player.getUsername(), + server.getServerInfo().getName()); + } + }); + }) + , () -> logger.warn("The server {} does not exist", randomServer)); + } + + private String getRandomServer() { + final List serverList = config.getToServerOptions().getTeleportServers(); + return serverList.get(rm.nextInt(serverList.size())); } } diff --git a/spigot/src/main/java/com/glyart/authmevelocity/spigot/AuthMeVelocityPlugin.java b/spigot/src/main/java/com/glyart/authmevelocity/spigot/AuthMeVelocityPlugin.java index 2689f6a..10e1f7a 100644 --- a/spigot/src/main/java/com/glyart/authmevelocity/spigot/AuthMeVelocityPlugin.java +++ b/spigot/src/main/java/com/glyart/authmevelocity/spigot/AuthMeVelocityPlugin.java @@ -39,7 +39,7 @@ public class AuthMeVelocityPlugin extends JavaPlugin { out.writeUTF(type.toString()); out.writeUTF(playername); - if(player == null){ + if (player == null) { Bukkit.getServer().sendPluginMessage(this, CHANNEL, out.toByteArray()); } else { player.sendPluginMessage(this, CHANNEL, out.toByteArray()); diff --git a/spigot/src/main/java/com/glyart/authmevelocity/spigot/AuthmePlaceholders.java b/spigot/src/main/java/com/glyart/authmevelocity/spigot/AuthmePlaceholders.java index f5b801f..50761b4 100644 --- a/spigot/src/main/java/com/glyart/authmevelocity/spigot/AuthmePlaceholders.java +++ b/spigot/src/main/java/com/glyart/authmevelocity/spigot/AuthmePlaceholders.java @@ -21,7 +21,7 @@ final class AuthmePlaceholders { : FALSE_COMPONENT) ) .globalPlaceholder("is_player_logged", (queue, ctx) -> { - String playerName = queue.popOr(() -> "you need to provide a player name").value(); + String playerName = queue.popOr("you need to provide a player name").value(); Player player = Bukkit.getPlayer(playerName); if(player == null) return Tag.selfClosingInserting(FALSE_COMPONENT); return Tag.selfClosingInserting(AuthMeApi.getInstance().isAuthenticated(player) diff --git a/spigot/src/main/java/com/glyart/authmevelocity/spigot/events/PreSendLoginEvent.java b/spigot/src/main/java/com/glyart/authmevelocity/spigot/events/PreSendLoginEvent.java index d993897..1ea44c8 100644 --- a/spigot/src/main/java/com/glyart/authmevelocity/spigot/events/PreSendLoginEvent.java +++ b/spigot/src/main/java/com/glyart/authmevelocity/spigot/events/PreSendLoginEvent.java @@ -1,5 +1,6 @@ package com.glyart.authmevelocity.spigot.events; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.HandlerList; @@ -11,7 +12,7 @@ public class PreSendLoginEvent extends PlayerEvent implements Cancellable { private boolean isCancelled = false; public PreSendLoginEvent(@NotNull Player player) { - super(player); + super(player, !Bukkit.isPrimaryThread()); } @Override @@ -28,4 +29,8 @@ public class PreSendLoginEvent extends PlayerEvent implements Cancellable { public @NotNull HandlerList getHandlers() { return HANDLERS; } + + public static HandlerList getHandlerList() { + return HANDLERS; + } } diff --git a/spigot/src/main/java/com/glyart/authmevelocity/spigot/listeners/AuthMeListener.java b/spigot/src/main/java/com/glyart/authmevelocity/spigot/listeners/AuthMeListener.java index da9f5df..4e579c1 100644 --- a/spigot/src/main/java/com/glyart/authmevelocity/spigot/listeners/AuthMeListener.java +++ b/spigot/src/main/java/com/glyart/authmevelocity/spigot/listeners/AuthMeListener.java @@ -15,7 +15,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -public class AuthMeListener implements Listener { +public final class AuthMeListener implements Listener { private final AuthMeVelocityPlugin plugin; public AuthMeListener(AuthMeVelocityPlugin plugin) {