From 5c22601c528ab68c5925c43a7b2d7612cfeec8d6 Mon Sep 17 00:00:00 2001 From: HaHaWTH Date: Sun, 22 Oct 2023 10:13:08 +0800 Subject: [PATCH] Add Bedrock player auto login feature --- src/main/java/fr/xephi/authme/AuthMe.java | 5 +++ .../listener/BedrockAutoLoginListener.java | 40 +++++++++++++++++++ .../settings/properties/SecuritySettings.java | 8 +++- 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 src/main/java/fr/xephi/authme/listener/BedrockAutoLoginListener.java diff --git a/src/main/java/fr/xephi/authme/AuthMe.java b/src/main/java/fr/xephi/authme/AuthMe.java index 43f9825d..db71327b 100644 --- a/src/main/java/fr/xephi/authme/AuthMe.java +++ b/src/main/java/fr/xephi/authme/AuthMe.java @@ -11,6 +11,7 @@ import fr.xephi.authme.initialization.OnShutdownPlayerSaver; import fr.xephi.authme.initialization.OnStartupTasks; import fr.xephi.authme.initialization.SettingsProvider; import fr.xephi.authme.initialization.TaskCloser; +import fr.xephi.authme.listener.BedrockAutoLoginListener; import fr.xephi.authme.listener.BlockListener; import fr.xephi.authme.listener.DoubleLoginFixListener; import fr.xephi.authme.listener.EntityListener; @@ -33,6 +34,7 @@ import fr.xephi.authme.service.yaml.YamlParseException; import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.SettingsWarner; import fr.xephi.authme.settings.properties.EmailSettings; +import fr.xephi.authme.settings.properties.HooksSettings; import fr.xephi.authme.settings.properties.SecuritySettings; import fr.xephi.authme.task.CleanupTask; import fr.xephi.authme.task.purge.PurgeService; @@ -212,6 +214,9 @@ public class AuthMe extends JavaPlugin { if (settings.getProperty(SecuritySettings.LOGIN_LOC_FIX_SUB_UNDERGROUND) || settings.getProperty(SecuritySettings.LOGIN_LOC_FIX_SUB_PORTAL)) { getServer().getPluginManager().registerEvents(new LoginLocationFixListener((Plugin) this), this); } + if (settings.getProperty(SecuritySettings.FORCE_LOGIN_BEDROCK) && settings.getProperty(HooksSettings.HOOK_FLOODGATE_PLAYER)) { + getServer().getPluginManager().registerEvents(new BedrockAutoLoginListener((Plugin) this), this); + } if (settings.getProperty(SecuritySettings.GUI_CAPTCHA) && getServer().getPluginManager().isPluginEnabled("ProtocolLib")) { getServer().getPluginManager().registerEvents(new GuiCaptchaHandler((Plugin) this), this); logger.info("(Beta)GUICaptcha is enabled successfully!"); diff --git a/src/main/java/fr/xephi/authme/listener/BedrockAutoLoginListener.java b/src/main/java/fr/xephi/authme/listener/BedrockAutoLoginListener.java new file mode 100644 index 00000000..4293d137 --- /dev/null +++ b/src/main/java/fr/xephi/authme/listener/BedrockAutoLoginListener.java @@ -0,0 +1,40 @@ +package fr.xephi.authme.listener; + +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.api.v3.AuthMeApi; +import fr.xephi.authme.settings.properties.HooksSettings; +import fr.xephi.authme.settings.properties.SecuritySettings; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.plugin.Plugin; + +import java.util.UUID; + +import static org.bukkit.Bukkit.getServer; + +public class BedrockAutoLoginListener implements Listener { + private final AuthMeApi authmeApi = AuthMeApi.getInstance(); + private final Plugin plugin; + + public BedrockAutoLoginListener(Plugin plugin) { + this.plugin = plugin; + } + + private boolean isBedrockPlayer(UUID uuid) { + return AuthMe.settings.getProperty(HooksSettings.HOOK_FLOODGATE_PLAYER) && AuthMe.settings.getProperty(SecuritySettings.FORCE_LOGIN_BEDROCK) && org.geysermc.floodgate.api.FloodgateApi.getInstance().isFloodgateId(uuid) && getServer().getPluginManager().getPlugin("floodgate") != null; + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + String name = event.getPlayer().getName(); + UUID uuid = event.getPlayer().getUniqueId(); + if (isBedrockPlayer(uuid) && !authmeApi.isAuthenticated(player) && authmeApi.isRegistered(name)) { + authmeApi.forceLogin(player); + player.sendMessage("§a基岩版自动登录完成!"); + } + } +} diff --git a/src/main/java/fr/xephi/authme/settings/properties/SecuritySettings.java b/src/main/java/fr/xephi/authme/settings/properties/SecuritySettings.java index e57c1d3b..959f8fec 100644 --- a/src/main/java/fr/xephi/authme/settings/properties/SecuritySettings.java +++ b/src/main/java/fr/xephi/authme/settings/properties/SecuritySettings.java @@ -19,15 +19,19 @@ public final class SecuritySettings implements SettingsHolder { public static final Property STOP_SERVER_ON_PROBLEM = newProperty("Security.SQLProblem.stopServer", false); + @Comment({"Should we let Bedrock players login automatically?", + "(Requires hookFloodgate to be true)"}) + public static final Property FORCE_LOGIN_BEDROCK = newProperty("3rdPartyFeature.features.bedrockAutoLogin", false); + @Comment("Enable the new feature to prevent ghost players?") public static final Property ANTI_GHOST_PLAYERS = newProperty("3rdPartyFeature.fixes.antiGhostPlayer", false); @Comment({"Choose the best teleport method by server brand?", "(Enable this if you are using Paper)"}) - public static final Property SMART_ASYNC_TELEPORT = newProperty("3rdPartyFeature.optimizes.smartAsyncTeleport",false); + public static final Property SMART_ASYNC_TELEPORT = newProperty("3rdPartyFeature.optimizes.smartAsyncTeleport", false); @Comment("Send a GUI captcha to unregistered players?(Requires ProtocolLib)") - public static final Property GUI_CAPTCHA = newProperty("3rdPartyFeature.captcha.guiCaptcha",false); + public static final Property GUI_CAPTCHA = newProperty("3rdPartyFeature.captcha.guiCaptcha", false); @Comment({"Should we kick the players when they don't finish the GUI captcha in seconds?", "(less than or equals 0 is disabled)"})