From bd665251254717b13fd8a59e578b74f49200f0c0 Mon Sep 17 00:00:00 2001 From: 4drian3d Date: Wed, 30 Mar 2022 18:12:03 -0500 Subject: [PATCH] Added support for setups with multiple servers with Authme installed --- .../proxy/AuthMeVelocityPlugin.java | 4 ++- .../proxy/listener/PluginMessageListener.java | 5 ++-- .../proxy/listener/ProxyListener.java | 30 +++++++++++++------ .../spigot/AuthMeVelocityPlugin.java | 2 ++ .../spigot/listeners/MessageListener.java | 27 +++++++++++++++++ 5 files changed, 56 insertions(+), 12 deletions(-) create mode 100644 spigot/src/main/java/com/glyart/authmevelocity/spigot/listeners/MessageListener.java diff --git a/proxy/src/main/java/com/glyart/authmevelocity/proxy/AuthMeVelocityPlugin.java b/proxy/src/main/java/com/glyart/authmevelocity/proxy/AuthMeVelocityPlugin.java index 4a6402b..d62bd40 100644 --- a/proxy/src/main/java/com/glyart/authmevelocity/proxy/AuthMeVelocityPlugin.java +++ b/proxy/src/main/java/com/glyart/authmevelocity/proxy/AuthMeVelocityPlugin.java @@ -10,6 +10,7 @@ import com.velocitypowered.api.event.Subscribe; import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; import com.velocitypowered.api.plugin.annotation.DataDirectory; import com.velocitypowered.api.proxy.ProxyServer; +import com.velocitypowered.api.proxy.messages.ChannelIdentifier; import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; import org.slf4j.Logger; @@ -25,6 +26,7 @@ import java.util.Set; import java.util.UUID; public class AuthMeVelocityPlugin { + public static final ChannelIdentifier AUTHMEVELOCITY_CHANNEL = MinecraftChannelIdentifier.create("authmevelocity", "main"); private final ProxyServer proxy; private final Logger logger; private final Path pluginDirectory; @@ -48,7 +50,7 @@ public class AuthMeVelocityPlugin { } AuthMeConfig config = Objects.requireNonNull(new AuthMeConfig(toml), "configuration cannot be null"); this.api = new AuthmeVelocityAPI(this, config); - proxy.getChannelRegistrar().register(MinecraftChannelIdentifier.create("authmevelocity", "main")); + proxy.getChannelRegistrar().register(AUTHMEVELOCITY_CHANNEL); proxy.getEventManager().register(this, new ProxyListener(config, api, logger, proxy)); proxy.getEventManager().register(this, new PluginMessageListener(proxy, logger, config, api)); 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 9cc7679..c301661 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 @@ -3,6 +3,7 @@ package com.glyart.authmevelocity.proxy.listener; import java.util.List; import java.util.Random; +import com.glyart.authmevelocity.proxy.AuthMeVelocityPlugin; import com.glyart.authmevelocity.proxy.AuthmeVelocityAPI; import com.glyart.authmevelocity.proxy.config.AuthMeConfig; import com.glyart.authmevelocity.proxy.event.PreSendOnLoginEvent; @@ -41,7 +42,7 @@ public class PluginMessageListener { @Subscribe public void onPluginMessage(final PluginMessageEvent event, Continuation continuation) { - if (!(event.getSource() instanceof ServerConnection) || !event.getIdentifier().getId().equals("authmevelocity:main")){ + if (!(event.getSource() instanceof ServerConnection) || !event.getIdentifier().equals(AuthMeVelocityPlugin.AUTHMEVELOCITY_CHANNEL)){ continuation.resume(); return; } @@ -49,7 +50,7 @@ public class PluginMessageListener { event.setResult(PluginMessageEvent.ForwardResult.handled()); - ByteArrayDataInput input = event.dataAsDataStream(); + final ByteArrayDataInput input = event.dataAsDataStream(); final String sChannel = input.readUTF(); final String playername = input.readUTF(); final @Nullable Player loggedPlayer = proxy.getPlayer(playername).orElse(null); diff --git a/proxy/src/main/java/com/glyart/authmevelocity/proxy/listener/ProxyListener.java b/proxy/src/main/java/com/glyart/authmevelocity/proxy/listener/ProxyListener.java index 858cf25..1a10917 100644 --- a/proxy/src/main/java/com/glyart/authmevelocity/proxy/listener/ProxyListener.java +++ b/proxy/src/main/java/com/glyart/authmevelocity/proxy/listener/ProxyListener.java @@ -2,10 +2,13 @@ package com.glyart.authmevelocity.proxy.listener; import java.util.Optional; +import com.glyart.authmevelocity.proxy.AuthMeVelocityPlugin; import com.glyart.authmevelocity.proxy.AuthmeVelocityAPI; import com.glyart.authmevelocity.proxy.config.AuthMeConfig; import com.glyart.authmevelocity.proxy.config.ConfigUtils; import com.glyart.authmevelocity.proxy.utils.AuthmeUtils; +import com.google.common.io.ByteArrayDataOutput; +import com.google.common.io.ByteStreams; import com.velocitypowered.api.event.Continuation; import com.velocitypowered.api.event.EventTask; import com.velocitypowered.api.event.PostOrder; @@ -14,6 +17,7 @@ import com.velocitypowered.api.event.command.CommandExecuteEvent; import com.velocitypowered.api.event.connection.DisconnectEvent; import com.velocitypowered.api.event.player.PlayerChatEvent; import com.velocitypowered.api.event.player.PlayerChooseInitialServerEvent; +import com.velocitypowered.api.event.player.ServerPostConnectEvent; import com.velocitypowered.api.event.player.ServerPreConnectEvent; import com.velocitypowered.api.event.player.TabCompleteEvent; import com.velocitypowered.api.proxy.Player; @@ -78,19 +82,28 @@ public final class ProxyListener { @Subscribe public void onServerPreConnect(ServerPreConnectEvent event, Continuation continuation) { - if (api.isLogged(event.getPlayer())){ + if (!event.getResult().isAllowed() && api.isLogged(event.getPlayer())){ continuation.resume(); return; } - - event.getResult().getServer().ifPresent(server -> { - if(!api.isAuthServer(server)){ - event.setResult(ServerPreConnectEvent.ServerResult.denied()); - } - }); + if(!event.getResult().getServer().map(api::isAuthServer).orElse(false)){ + continuation.resume(); + return; + } + event.setResult(ServerPreConnectEvent.ServerResult.denied()); continuation.resume(); } + @Subscribe + public void onServerPostConnect(ServerPostConnectEvent event) { + Player player = event.getPlayer(); + if(api.isInAuthServer(player)){ + ByteArrayDataOutput buf = ByteStreams.newDataOutput(); + buf.writeUTF("LOGIN"); + player.sendPluginMessage(AuthMeVelocityPlugin.AUTHMEVELOCITY_CHANNEL, buf.toByteArray()); + } + } + @Subscribe(order = PostOrder.FIRST) public EventTask onTabComplete(TabCompleteEvent event){ return EventTask.async(() -> { @@ -106,8 +119,7 @@ public final class ProxyListener { continuation.resume(); return; } - Optional optionalSV = event.getInitialServer(); - if(optionalSV.isPresent() && api.isAuthServer(optionalSV.get())){ + if(event.getInitialServer().map(api::isAuthServer).orElse(false)){ continuation.resume(); return; } 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 8edb0b0..0149212 100644 --- a/spigot/src/main/java/com/glyart/authmevelocity/spigot/AuthMeVelocityPlugin.java +++ b/spigot/src/main/java/com/glyart/authmevelocity/spigot/AuthMeVelocityPlugin.java @@ -1,6 +1,7 @@ package com.glyart.authmevelocity.spigot; import com.glyart.authmevelocity.spigot.listeners.AuthMeListener; +import com.glyart.authmevelocity.spigot.listeners.MessageListener; import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; @@ -14,6 +15,7 @@ public class AuthMeVelocityPlugin extends JavaPlugin { @Override public void onEnable() { this.getServer().getMessenger().registerOutgoingPluginChannel(this, CHANNEL); + this.getServer().getMessenger().registerIncomingPluginChannel(this, CHANNEL, new MessageListener()); this.getServer().getPluginManager().registerEvents(new AuthMeListener(this), this); if(this.getServer().getPluginManager().isPluginEnabled("MiniPlaceholders")){ diff --git a/spigot/src/main/java/com/glyart/authmevelocity/spigot/listeners/MessageListener.java b/spigot/src/main/java/com/glyart/authmevelocity/spigot/listeners/MessageListener.java new file mode 100644 index 0000000..ce09d68 --- /dev/null +++ b/spigot/src/main/java/com/glyart/authmevelocity/spigot/listeners/MessageListener.java @@ -0,0 +1,27 @@ +package com.glyart.authmevelocity.spigot.listeners; + +import com.google.common.io.ByteArrayDataInput; +import com.google.common.io.ByteStreams; + +import org.bukkit.entity.Player; +import org.bukkit.plugin.messaging.PluginMessageListener; +import org.jetbrains.annotations.NotNull; + +import fr.xephi.authme.api.v3.AuthMeApi; + +public class MessageListener implements PluginMessageListener { + + @Override + public void onPluginMessageReceived(@NotNull String identifier, @NotNull Player player, @NotNull byte[] bytes) { + if(identifier.equals("authmevelocity")){ + ByteArrayDataInput input = ByteStreams.newDataInput(bytes); + String subchannel = input.readUTF(); + if("main".equals(subchannel)){ + String msg = input.readUTF(); + if("LOGIN".equals(msg)){ + AuthMeApi.getInstance().forceLogin(player); + } + } + } + } +}