diff --git a/src/main/java/fr/xephi/authme/AuthMe.java b/src/main/java/fr/xephi/authme/AuthMe.java index 6c944738..82951bfc 100644 --- a/src/main/java/fr/xephi/authme/AuthMe.java +++ b/src/main/java/fr/xephi/authme/AuthMe.java @@ -35,6 +35,7 @@ import fr.xephi.authme.service.BackupService; import fr.xephi.authme.service.BukkitService; import fr.xephi.authme.service.MigrationService; import fr.xephi.authme.service.bungeecord.BungeeReceiver; +import fr.xephi.authme.service.velocity.VelocityReceiver; import fr.xephi.authme.service.yaml.YamlParseException; import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.SettingsWarner; @@ -300,6 +301,7 @@ public class AuthMe extends JavaPlugin { // Trigger instantiation (class not used elsewhere) injector.getSingleton(BungeeReceiver.class); + injector.getSingleton(VelocityReceiver.class); // Trigger construction of API classes; they will keep track of the singleton injector.getSingleton(AuthMeApi.class); diff --git a/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java b/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java index aca8d306..34e9ef43 100644 --- a/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java +++ b/src/main/java/fr/xephi/authme/process/join/AsynchronousJoin.java @@ -17,6 +17,8 @@ import fr.xephi.authme.service.SessionService; import fr.xephi.authme.service.ValidationService; import fr.xephi.authme.service.bungeecord.BungeeSender; import fr.xephi.authme.service.bungeecord.MessageType; +import fr.xephi.authme.service.velocity.VMessageType; +import fr.xephi.authme.service.velocity.VelocitySender; import fr.xephi.authme.settings.commandconfig.CommandManager; import fr.xephi.authme.settings.properties.HooksSettings; import fr.xephi.authme.settings.properties.RegistrationSettings; @@ -75,6 +77,9 @@ public class AsynchronousJoin implements AsynchronousProcess { @Inject private BungeeSender bungeeSender; + @Inject + private VelocitySender velocitySender; + @Inject private ProxySessionManager proxySessionManager; @@ -154,6 +159,10 @@ public class AsynchronousJoin implements AsynchronousProcess { bukkitService.scheduleSyncDelayedTask(() -> bungeeSender.sendAuthMeBungeecordMessage(player, MessageType.LOGIN), 5L); } + if (velocitySender.isEnabled()) { + bukkitService.scheduleSyncDelayedTask(() -> + velocitySender.sendAuthMeVelocityMessage(player, VMessageType.LOGIN), 5L); + } return; } diff --git a/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java b/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java index b9ebbdb7..87cf85ba 100644 --- a/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java +++ b/src/main/java/fr/xephi/authme/process/login/AsynchronousLogin.java @@ -26,6 +26,8 @@ import fr.xephi.authme.service.CommonService; import fr.xephi.authme.service.SessionService; import fr.xephi.authme.service.bungeecord.BungeeSender; import fr.xephi.authme.service.bungeecord.MessageType; +import fr.xephi.authme.service.velocity.VMessageType; +import fr.xephi.authme.service.velocity.VelocitySender; import fr.xephi.authme.settings.properties.DatabaseSettings; import fr.xephi.authme.settings.properties.EmailSettings; import fr.xephi.authme.settings.properties.HooksSettings; @@ -84,6 +86,8 @@ public class AsynchronousLogin implements AsynchronousProcess { @Inject private BungeeSender bungeeSender; + @Inject + private VelocitySender velocitySender; AsynchronousLogin() { } @@ -308,6 +312,10 @@ public class AsynchronousLogin implements AsynchronousProcess { bukkitService.scheduleSyncDelayedTask(() -> bungeeSender.sendAuthMeBungeecordMessage(player, MessageType.LOGIN), 5L); } + if (velocitySender.isEnabled()) { + bukkitService.scheduleSyncDelayedTask(() -> + velocitySender.sendAuthMeVelocityMessage(player, VMessageType.LOGIN), 5L); + } // As the scheduling executes the Task most likely after the current // task, we schedule it in the end diff --git a/src/main/java/fr/xephi/authme/process/logout/AsynchronousLogout.java b/src/main/java/fr/xephi/authme/process/logout/AsynchronousLogout.java index 2e5bd87c..5e6f953f 100644 --- a/src/main/java/fr/xephi/authme/process/logout/AsynchronousLogout.java +++ b/src/main/java/fr/xephi/authme/process/logout/AsynchronousLogout.java @@ -11,6 +11,8 @@ import fr.xephi.authme.service.CommonService; import fr.xephi.authme.service.SessionService; import fr.xephi.authme.service.bungeecord.BungeeSender; import fr.xephi.authme.service.bungeecord.MessageType; +import fr.xephi.authme.service.velocity.VMessageType; +import fr.xephi.authme.service.velocity.VelocitySender; import fr.xephi.authme.settings.properties.RestrictionSettings; import org.bukkit.entity.Player; @@ -42,6 +44,8 @@ public class AsynchronousLogout implements AsynchronousProcess { @Inject private BungeeSender bungeeSender; + @Inject + private VelocitySender velocitySender; AsynchronousLogout() { } @@ -72,6 +76,7 @@ public class AsynchronousLogout implements AsynchronousProcess { database.setUnlogged(name); sessionService.revokeSession(name); bungeeSender.sendAuthMeBungeecordMessage(player, MessageType.LOGOUT); + velocitySender.sendAuthMeVelocityMessage(player, VMessageType.LOGOUT); syncProcessManager.processSyncPlayerLogout(player); } } diff --git a/src/main/java/fr/xephi/authme/process/register/ProcessSyncEmailRegister.java b/src/main/java/fr/xephi/authme/process/register/ProcessSyncEmailRegister.java index c1fae36c..0fe19acf 100644 --- a/src/main/java/fr/xephi/authme/process/register/ProcessSyncEmailRegister.java +++ b/src/main/java/fr/xephi/authme/process/register/ProcessSyncEmailRegister.java @@ -8,6 +8,8 @@ import fr.xephi.authme.output.ConsoleLoggerFactory; import fr.xephi.authme.process.SynchronousProcess; import fr.xephi.authme.service.BukkitService; import fr.xephi.authme.service.CommonService; +import fr.xephi.authme.service.velocity.VMessageType; +import fr.xephi.authme.service.velocity.VelocitySender; import fr.xephi.authme.util.PlayerUtils; import org.bukkit.entity.Player; @@ -28,6 +30,8 @@ public class ProcessSyncEmailRegister implements SynchronousProcess { @Inject private LimboService limboService; + @Inject + private VelocitySender velocitySender; ProcessSyncEmailRegister() { } @@ -40,7 +44,7 @@ public class ProcessSyncEmailRegister implements SynchronousProcess { public void processEmailRegister(Player player) { service.send(player, MessageKey.ACCOUNT_NOT_ACTIVATED); limboService.replaceTasksAfterRegistration(player); - + velocitySender.sendAuthMeVelocityMessage(player, VMessageType.REGISTER); bukkitService.callEvent(new RegisterEvent(player)); logger.fine(player.getName() + " registered " + PlayerUtils.getPlayerIp(player)); } diff --git a/src/main/java/fr/xephi/authme/process/register/ProcessSyncPasswordRegister.java b/src/main/java/fr/xephi/authme/process/register/ProcessSyncPasswordRegister.java index ceed84ca..f68ba015 100644 --- a/src/main/java/fr/xephi/authme/process/register/ProcessSyncPasswordRegister.java +++ b/src/main/java/fr/xephi/authme/process/register/ProcessSyncPasswordRegister.java @@ -9,6 +9,8 @@ import fr.xephi.authme.process.SynchronousProcess; import fr.xephi.authme.service.BukkitService; import fr.xephi.authme.service.CommonService; import fr.xephi.authme.service.bungeecord.BungeeSender; +import fr.xephi.authme.service.velocity.VMessageType; +import fr.xephi.authme.service.velocity.VelocitySender; import fr.xephi.authme.settings.commandconfig.CommandManager; import fr.xephi.authme.settings.properties.EmailSettings; import fr.xephi.authme.settings.properties.RegistrationSettings; @@ -27,6 +29,9 @@ public class ProcessSyncPasswordRegister implements SynchronousProcess { @Inject private BungeeSender bungeeSender; + @Inject + private VelocitySender velocitySender; + @Inject private CommonService service; @@ -66,7 +71,7 @@ public class ProcessSyncPasswordRegister implements SynchronousProcess { if (!service.getProperty(EmailSettings.MAIL_ACCOUNT).isEmpty()) { service.send(player, MessageKey.ADD_EMAIL_MESSAGE); } - + velocitySender.sendAuthMeVelocityMessage(player, VMessageType.REGISTER); bukkitService.callEvent(new RegisterEvent(player)); logger.fine(player.getName() + " registered " + PlayerUtils.getPlayerIp(player)); diff --git a/src/main/java/fr/xephi/authme/process/unregister/AsynchronousUnregister.java b/src/main/java/fr/xephi/authme/process/unregister/AsynchronousUnregister.java index b26fb93f..c7537236 100644 --- a/src/main/java/fr/xephi/authme/process/unregister/AsynchronousUnregister.java +++ b/src/main/java/fr/xephi/authme/process/unregister/AsynchronousUnregister.java @@ -16,6 +16,8 @@ import fr.xephi.authme.service.CommonService; import fr.xephi.authme.service.TeleportationService; import fr.xephi.authme.service.bungeecord.BungeeSender; import fr.xephi.authme.service.bungeecord.MessageType; +import fr.xephi.authme.service.velocity.VMessageType; +import fr.xephi.authme.service.velocity.VelocitySender; import fr.xephi.authme.settings.commandconfig.CommandManager; import fr.xephi.authme.settings.properties.RegistrationSettings; import fr.xephi.authme.settings.properties.RestrictionSettings; @@ -56,6 +58,9 @@ public class AsynchronousUnregister implements AsynchronousProcess { @Inject private CommandManager commandManager; + @Inject + private VelocitySender velocitySender; + @Inject private BungeeSender bungeeSender; @@ -76,6 +81,7 @@ public class AsynchronousUnregister implements AsynchronousProcess { if (dataSource.removeAuth(name)) { performPostUnregisterActions(name, player); logger.info(name + " unregistered himself"); + velocitySender.sendAuthMeVelocityMessage(player, VMessageType.UNREGISTER); bukkitService.createAndCallEvent(isAsync -> new UnregisterByPlayerEvent(player, isAsync)); } else { service.send(player, MessageKey.ERROR); @@ -97,8 +103,8 @@ public class AsynchronousUnregister implements AsynchronousProcess { public void adminUnregister(CommandSender initiator, String name, Player player) { if (dataSource.removeAuth(name)) { performPostUnregisterActions(name, player); + velocitySender.sendAuthMeVelocityMessage(player, VMessageType.FORCE_UNREGISTER); bukkitService.createAndCallEvent(isAsync -> new UnregisterByAdminEvent(player, name, isAsync, initiator)); - if (initiator == null) { logger.info(name + " was unregistered"); } else { diff --git a/src/main/java/fr/xephi/authme/service/BukkitService.java b/src/main/java/fr/xephi/authme/service/BukkitService.java index 05e32d7a..19d08c10 100644 --- a/src/main/java/fr/xephi/authme/service/BukkitService.java +++ b/src/main/java/fr/xephi/authme/service/BukkitService.java @@ -369,6 +369,17 @@ public class BukkitService implements SettingsDependent { player.sendPluginMessage(authMe, "BungeeCord", bytes); } + /** + * Send the specified bytes to bungeecord using the specified player connection. + * + * @param player the player + * @param bytes the message + */ + public void sendVelocityMessage(Player player, byte[] bytes) { + player.sendPluginMessage(authMe, "authmevelocity:main", bytes); + } + + /** * Adds a ban to the list. If a previous ban exists, this will * update the previous entry. diff --git a/src/main/java/fr/xephi/authme/service/velocity/VMessageType.java b/src/main/java/fr/xephi/authme/service/velocity/VMessageType.java new file mode 100644 index 00000000..0e65db42 --- /dev/null +++ b/src/main/java/fr/xephi/authme/service/velocity/VMessageType.java @@ -0,0 +1,5 @@ +package fr.xephi.authme.service.velocity; + +public enum VMessageType { + LOGIN, REGISTER, LOGOUT, FORCE_UNREGISTER, UNREGISTER +} diff --git a/src/main/java/fr/xephi/authme/service/velocity/VelocityReceiver.java b/src/main/java/fr/xephi/authme/service/velocity/VelocityReceiver.java new file mode 100644 index 00000000..caa04e5f --- /dev/null +++ b/src/main/java/fr/xephi/authme/service/velocity/VelocityReceiver.java @@ -0,0 +1,89 @@ +package fr.xephi.authme.service.velocity; + +import com.google.common.io.ByteArrayDataInput; +import com.google.common.io.ByteStreams; +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.data.ProxySessionManager; +import fr.xephi.authme.initialization.SettingsDependent; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.process.Management; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.HooksSettings; +import org.bukkit.entity.Player; +import org.bukkit.plugin.messaging.Messenger; +import org.bukkit.plugin.messaging.PluginMessageListener; + +import javax.inject.Inject; + +public class VelocityReceiver implements PluginMessageListener, SettingsDependent { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(VelocityReceiver.class); + + private final AuthMe plugin; + private final BukkitService bukkitService; + private final ProxySessionManager proxySessionManager; + private final Management management; + + private boolean isEnabled; + + @Inject + VelocityReceiver(AuthMe plugin, BukkitService bukkitService, ProxySessionManager proxySessionManager, + Management management, Settings settings) { + this.plugin = plugin; + this.bukkitService = bukkitService; + this.proxySessionManager = proxySessionManager; + this.management = management; + reload(settings); + } + + @Override + public void reload(Settings settings) { + this.isEnabled = settings.getProperty(HooksSettings.VELOCITY); + if (this.isEnabled) { + final Messenger messenger = plugin.getServer().getMessenger(); + if (!messenger.isIncomingChannelRegistered(plugin, "authmevelocity:main")) { + messenger.registerIncomingPluginChannel(plugin, "authmevelocity:main", this); + } + } + } + + + @Override + public void onPluginMessageReceived(String channel, Player player, byte[] bytes) { + if (!isEnabled) { + return; + } + + if (channel.equals("authmevelocity:main")) { + final ByteArrayDataInput in = ByteStreams.newDataInput(bytes); + + final String data = in.readUTF(); + final String username = in.readUTF(); + processData(username, data); + logger.debug("PluginMessage | AuthMeVelocity identifier processed"); + } + } + + private void processData(String username, String data) { + if (VMessageType.LOGIN.toString().equals(data)) { + performLogin(username); + } + } + + private void performLogin(String name) { + Player player = bukkitService.getPlayerExact(name); + if (player != null && player.isOnline()) { + management.forceLogin(player, true); + logger.info("The user " + player.getName() + " has been automatically logged in, " + + "as requested via plugin messaging."); + } else { + proxySessionManager.processProxySessionMessage(name); + logger.info("The user " + name + " should be automatically logged in, " + + "as requested via plugin messaging but has not been detected, nickname has been" + + " added to autologin queue."); + } + } + +} diff --git a/src/main/java/fr/xephi/authme/service/velocity/VelocitySender.java b/src/main/java/fr/xephi/authme/service/velocity/VelocitySender.java new file mode 100644 index 00000000..16a0f2cb --- /dev/null +++ b/src/main/java/fr/xephi/authme/service/velocity/VelocitySender.java @@ -0,0 +1,76 @@ +package fr.xephi.authme.service.velocity; + +import com.google.common.io.ByteArrayDataOutput; +import com.google.common.io.ByteStreams; +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.initialization.SettingsDependent; +import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.service.BukkitService; +import fr.xephi.authme.service.bungeecord.MessageType; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.HooksSettings; +import org.bukkit.entity.Player; +import org.bukkit.plugin.messaging.Messenger; + +import javax.inject.Inject; + +public class VelocitySender implements SettingsDependent { + + private final ConsoleLogger logger = ConsoleLoggerFactory.get(VelocitySender.class); + private final AuthMe plugin; + private final BukkitService bukkitService; + + private boolean isEnabled; + + /* + * Constructor. + */ + @Inject + VelocitySender(AuthMe plugin, BukkitService bukkitService, Settings settings) { + this.plugin = plugin; + this.bukkitService = bukkitService; + reload(settings); + } + + @Override + public void reload(Settings settings) { + this.isEnabled = settings.getProperty(HooksSettings.VELOCITY); + + if (this.isEnabled) { + Messenger messenger = plugin.getServer().getMessenger(); + if (!messenger.isOutgoingChannelRegistered(plugin, "authmevelocity:main")) { + messenger.registerOutgoingPluginChannel(plugin, "authmevelocity:main"); + } + } + } + + public boolean isEnabled() { + return isEnabled; + } + + private void sendForwardedVelocityMessage(Player player, VMessageType type, String playerName) { + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF(type.toString()); + out.writeUTF(playerName); + bukkitService.sendVelocityMessage(player, out.toByteArray()); + } + + /** + * Sends a message to the AuthMe plugin messaging channel, if enabled. + * + * @param player The player related to the message + * @param type The message type, See {@link MessageType} + */ + public void sendAuthMeVelocityMessage(Player player, VMessageType type) { + if (!isEnabled) { + return; + } + if (!plugin.isEnabled()) { + logger.debug("Tried to send a " + type + " velocity message but the plugin was disabled!"); + return; + } + sendForwardedVelocityMessage(player, type, player.getName()); + } + +} diff --git a/src/main/java/fr/xephi/authme/settings/properties/HooksSettings.java b/src/main/java/fr/xephi/authme/settings/properties/HooksSettings.java index 5d27c052..9a8ddadd 100644 --- a/src/main/java/fr/xephi/authme/settings/properties/HooksSettings.java +++ b/src/main/java/fr/xephi/authme/settings/properties/HooksSettings.java @@ -18,6 +18,9 @@ public final class HooksSettings implements SettingsHolder { @Comment("Do we need to hook with BungeeCord?") public static final Property BUNGEECORD = newProperty("Hooks.bungeecord", false); + @Comment("Do we need to hook with Velocity?") + public static final Property VELOCITY = + newProperty("Hooks.velocity", false); @Comment({"Hook into floodgate.", "This must be true if you want to use other bedrock features."