From 5c6af0330ec022aa54177ff2637256ce1135c25c Mon Sep 17 00:00:00 2001 From: ljacqu Date: Sun, 21 May 2017 13:42:49 +0200 Subject: [PATCH] #1218 Add onLogout to commands.yml --- .../authme/process/SyncProcessManager.java | 22 ++++++------- ...gout.java => ProcessSyncPlayerLogout.java} | 14 ++++++-- .../authme/process/quit/AsynchronousQuit.java | 14 ++++++-- .../process/quit/ProcessSyncPlayerQuit.java | 33 +++++++++++++++++++ .../quit/ProcessSyncronousPlayerQuit.java | 19 ----------- .../settings/commandconfig/CommandConfig.java | 9 +++++ .../commandconfig/CommandManager.java | 11 +++++++ .../commandconfig/CommandSettingsHolder.java | 8 ++++- src/main/resources/commands.yml | 11 +++++-- .../commandconfig/CommandManagerTest.java | 15 +++++++++ .../commandconfig/commands.complete.yml | 4 +++ 11 files changed, 121 insertions(+), 39 deletions(-) rename src/main/java/fr/xephi/authme/process/logout/{ProcessSynchronousPlayerLogout.java => ProcessSyncPlayerLogout.java} (85%) create mode 100644 src/main/java/fr/xephi/authme/process/quit/ProcessSyncPlayerQuit.java delete mode 100644 src/main/java/fr/xephi/authme/process/quit/ProcessSyncronousPlayerQuit.java diff --git a/src/main/java/fr/xephi/authme/process/SyncProcessManager.java b/src/main/java/fr/xephi/authme/process/SyncProcessManager.java index b8c344bf..e634302f 100644 --- a/src/main/java/fr/xephi/authme/process/SyncProcessManager.java +++ b/src/main/java/fr/xephi/authme/process/SyncProcessManager.java @@ -1,8 +1,8 @@ package fr.xephi.authme.process; import fr.xephi.authme.process.login.ProcessSyncPlayerLogin; -import fr.xephi.authme.process.logout.ProcessSynchronousPlayerLogout; -import fr.xephi.authme.process.quit.ProcessSyncronousPlayerQuit; +import fr.xephi.authme.process.logout.ProcessSyncPlayerLogout; +import fr.xephi.authme.process.quit.ProcessSyncPlayerQuit; import fr.xephi.authme.process.register.ProcessSyncEmailRegister; import fr.xephi.authme.process.register.ProcessSyncPasswordRegister; import fr.xephi.authme.service.BukkitService; @@ -30,29 +30,29 @@ public class SyncProcessManager { @Inject private ProcessSyncPlayerLogin processSyncPlayerLogin; @Inject - private ProcessSynchronousPlayerLogout processSynchronousPlayerLogout; + private ProcessSyncPlayerLogout processSyncPlayerLogout; @Inject - private ProcessSyncronousPlayerQuit processSyncronousPlayerQuit; + private ProcessSyncPlayerQuit processSyncPlayerQuit; - public void processSyncEmailRegister(final Player player) { + public void processSyncEmailRegister(Player player) { runTask(() -> processSyncEmailRegister.processEmailRegister(player)); } - public void processSyncPasswordRegister(final Player player) { + public void processSyncPasswordRegister(Player player) { runTask(() -> processSyncPasswordRegister.processPasswordRegister(player)); } - public void processSyncPlayerLogout(final Player player) { - runTask(() -> processSynchronousPlayerLogout.processSyncLogout(player)); + public void processSyncPlayerLogout(Player player) { + runTask(() -> processSyncPlayerLogout.processSyncLogout(player)); } - public void processSyncPlayerLogin(final Player player) { + public void processSyncPlayerLogin(Player player) { runTask(() -> processSyncPlayerLogin.processPlayerLogin(player)); } - public void processSyncPlayerQuit(final Player player) { - runTask(() -> processSyncronousPlayerQuit.processSyncQuit(player)); + public void processSyncPlayerQuit(Player player, boolean wasLoggedIn) { + runTask(() -> processSyncPlayerQuit.processSyncQuit(player, wasLoggedIn)); } private void runTask(Runnable runnable) { diff --git a/src/main/java/fr/xephi/authme/process/logout/ProcessSynchronousPlayerLogout.java b/src/main/java/fr/xephi/authme/process/logout/ProcessSyncPlayerLogout.java similarity index 85% rename from src/main/java/fr/xephi/authme/process/logout/ProcessSynchronousPlayerLogout.java rename to src/main/java/fr/xephi/authme/process/logout/ProcessSyncPlayerLogout.java index b5e59c81..9f23ed45 100644 --- a/src/main/java/fr/xephi/authme/process/logout/ProcessSynchronousPlayerLogout.java +++ b/src/main/java/fr/xephi/authme/process/logout/ProcessSyncPlayerLogout.java @@ -10,6 +10,7 @@ import fr.xephi.authme.process.SynchronousProcess; import fr.xephi.authme.service.BukkitService; import fr.xephi.authme.service.CommonService; import fr.xephi.authme.service.TeleportationService; +import fr.xephi.authme.settings.commandconfig.CommandManager; import fr.xephi.authme.settings.properties.RegistrationSettings; import fr.xephi.authme.settings.properties.RestrictionSettings; import org.bukkit.entity.Player; @@ -21,7 +22,7 @@ import javax.inject.Inject; import static fr.xephi.authme.service.BukkitService.TICKS_PER_SECOND; -public class ProcessSynchronousPlayerLogout implements SynchronousProcess { +public class ProcessSyncPlayerLogout implements SynchronousProcess { @Inject private CommonService service; @@ -41,9 +42,17 @@ public class ProcessSynchronousPlayerLogout implements SynchronousProcess { @Inject private TeleportationService teleportationService; - ProcessSynchronousPlayerLogout() { + @Inject + private CommandManager commandManager; + + ProcessSyncPlayerLogout() { } + /** + * Processes a player which has been logged out. + * + * @param player the player logging out + */ public void processSyncLogout(Player player) { final String name = player.getName().toLowerCase(); @@ -53,6 +62,7 @@ public class ProcessSynchronousPlayerLogout implements SynchronousProcess { } applyLogoutEffect(player); + commandManager.runCommandsOnLogout(player); // Player is now logout... Time to fire event ! bukkitService.callEvent(new LogoutEvent(player)); diff --git a/src/main/java/fr/xephi/authme/process/quit/AsynchronousQuit.java b/src/main/java/fr/xephi/authme/process/quit/AsynchronousQuit.java index d34cbde0..701733b5 100644 --- a/src/main/java/fr/xephi/authme/process/quit/AsynchronousQuit.java +++ b/src/main/java/fr/xephi/authme/process/quit/AsynchronousQuit.java @@ -18,6 +18,9 @@ import org.bukkit.entity.Player; import javax.inject.Inject; +/** + * Async process called when a player quits the server. + */ public class AsynchronousQuit implements AsynchronousProcess { @Inject @@ -47,14 +50,19 @@ public class AsynchronousQuit implements AsynchronousProcess { AsynchronousQuit() { } - + /** + * Processes that the given player has quit the server. + * + * @param player the player who left + */ public void processQuit(Player player) { if (player == null || validationService.isUnrestricted(player.getName())) { return; } final String name = player.getName().toLowerCase(); + final boolean wasLoggedIn = playerCache.isAuthenticated(name); - if (playerCache.isAuthenticated(name)) { + if (wasLoggedIn) { if (service.getProperty(RestrictionSettings.SAVE_QUIT_LOCATION)) { Location loc = spawnLoader.getPlayerLocationOrSpawn(player); PlayerAuth auth = PlayerAuth.builder() @@ -82,7 +90,7 @@ public class AsynchronousQuit implements AsynchronousProcess { database.setUnlogged(name); if (plugin.isEnabled()) { - syncProcessManager.processSyncPlayerQuit(player); + syncProcessManager.processSyncPlayerQuit(player, wasLoggedIn); } // remove player from cache if (database instanceof CacheDataSource) { diff --git a/src/main/java/fr/xephi/authme/process/quit/ProcessSyncPlayerQuit.java b/src/main/java/fr/xephi/authme/process/quit/ProcessSyncPlayerQuit.java new file mode 100644 index 00000000..b4c43edf --- /dev/null +++ b/src/main/java/fr/xephi/authme/process/quit/ProcessSyncPlayerQuit.java @@ -0,0 +1,33 @@ +package fr.xephi.authme.process.quit; + +import fr.xephi.authme.data.limbo.LimboService; +import fr.xephi.authme.process.SynchronousProcess; +import fr.xephi.authme.settings.commandconfig.CommandManager; +import org.bukkit.entity.Player; + +import javax.inject.Inject; + + +public class ProcessSyncPlayerQuit implements SynchronousProcess { + + @Inject + private LimboService limboService; + + @Inject + private CommandManager commandManager; + + /** + * Processes a player having quit. + * + * @param player the player that left + * @param wasLoggedIn true if the player was logged in when leaving, false otherwise + */ + public void processSyncQuit(Player player, boolean wasLoggedIn) { + if (wasLoggedIn) { + commandManager.runCommandsOnLogout(player); + } else { + limboService.restoreData(player); + } + player.leaveVehicle(); + } +} diff --git a/src/main/java/fr/xephi/authme/process/quit/ProcessSyncronousPlayerQuit.java b/src/main/java/fr/xephi/authme/process/quit/ProcessSyncronousPlayerQuit.java deleted file mode 100644 index c5f633e9..00000000 --- a/src/main/java/fr/xephi/authme/process/quit/ProcessSyncronousPlayerQuit.java +++ /dev/null @@ -1,19 +0,0 @@ -package fr.xephi.authme.process.quit; - -import fr.xephi.authme.data.limbo.LimboService; -import fr.xephi.authme.process.SynchronousProcess; -import org.bukkit.entity.Player; - -import javax.inject.Inject; - - -public class ProcessSyncronousPlayerQuit implements SynchronousProcess { - - @Inject - private LimboService limboService; - - public void processSyncQuit(Player player) { - limboService.restoreData(player); - player.leaveVehicle(); - } -} diff --git a/src/main/java/fr/xephi/authme/settings/commandconfig/CommandConfig.java b/src/main/java/fr/xephi/authme/settings/commandconfig/CommandConfig.java index 24f9d82a..f7023020 100644 --- a/src/main/java/fr/xephi/authme/settings/commandconfig/CommandConfig.java +++ b/src/main/java/fr/xephi/authme/settings/commandconfig/CommandConfig.java @@ -15,6 +15,7 @@ public class CommandConfig { private Map onSessionLogin = new LinkedHashMap<>(); private Map onRegister = new LinkedHashMap<>(); private Map onUnregister = new LinkedHashMap<>(); + private Map onLogout = new LinkedHashMap<>(); public Map getOnJoin() { return onJoin; @@ -55,4 +56,12 @@ public class CommandConfig { public void setOnUnregister(Map onUnregister) { this.onUnregister = onUnregister; } + + public Map getOnLogout() { + return onLogout; + } + + public void setOnLogout(Map onLogout) { + this.onLogout = onLogout; + } } diff --git a/src/main/java/fr/xephi/authme/settings/commandconfig/CommandManager.java b/src/main/java/fr/xephi/authme/settings/commandconfig/CommandManager.java index b105cda7..f6fbd4c7 100644 --- a/src/main/java/fr/xephi/authme/settings/commandconfig/CommandManager.java +++ b/src/main/java/fr/xephi/authme/settings/commandconfig/CommandManager.java @@ -36,6 +36,7 @@ public class CommandManager implements Reloadable { private WrappedTagReplacer onSessionLoginCommands; private WrappedTagReplacer onRegisterCommands; private WrappedTagReplacer onUnregisterCommands; + private WrappedTagReplacer onLogoutCommands; @Inject CommandManager(@DataFolder File dataFolder, BukkitService bukkitService, GeoIpService geoIpService, @@ -93,6 +94,15 @@ public class CommandManager implements Reloadable { executeCommands(player, onUnregisterCommands.getAdaptedItems(player)); } + /** + * Runs the configured commands for when a player logs out (by command or by quitting the server). + * + * @param player the player that is no longer logged in + */ + public void runCommandsOnLogout(Player player) { + executeCommands(player, onLogoutCommands.getAdaptedItems(player)); + } + private void executeCommands(Player player, List commands) { for (Command command : commands) { final String execution = command.getCommand(); @@ -117,6 +127,7 @@ public class CommandManager implements Reloadable { onSessionLoginCommands = newReplacer(commandConfig.getOnSessionLogin()); onRegisterCommands = newReplacer(commandConfig.getOnRegister()); onUnregisterCommands = newReplacer(commandConfig.getOnUnregister()); + onLogoutCommands = newReplacer(commandConfig.getOnLogout()); } private WrappedTagReplacer newReplacer(Map commands) { diff --git a/src/main/java/fr/xephi/authme/settings/commandconfig/CommandSettingsHolder.java b/src/main/java/fr/xephi/authme/settings/commandconfig/CommandSettingsHolder.java index 3e18cc0b..29e9b0c9 100644 --- a/src/main/java/fr/xephi/authme/settings/commandconfig/CommandSettingsHolder.java +++ b/src/main/java/fr/xephi/authme/settings/commandconfig/CommandSettingsHolder.java @@ -48,13 +48,19 @@ public final class CommandSettingsHolder implements SettingsHolder { " command: 'broadcast %p has joined, welcome back!'", " executor: CONSOLE", "", - "Supported command events: onLogin, onSessionLogin, onJoin, onRegister, onUnregister" + "Supported command events: onLogin, onSessionLogin, onJoin, onLogout, onRegister, onUnregister" }; Map commentMap = new HashMap<>(); commentMap.put("", comments); commentMap.put("onUnregister", new String[]{ "Commands to run whenever a player is unregistered (by himself, or by an admin)" }); + commentMap.put("onLogout", new String[]{ + "These commands are called whenever a logged in player uses /logout or quits.", + "The commands are not run if a player that was not logged in quits the server.", + "Note: if your server crashes, these commands won't be run, so don't rely on them to undo", + "'onLogin' commands that would be dangerous for non-logged in players to have!" + }); return commentMap; } diff --git a/src/main/resources/commands.yml b/src/main/resources/commands.yml index 2d359fdb..fecccd59 100644 --- a/src/main/resources/commands.yml +++ b/src/main/resources/commands.yml @@ -24,10 +24,15 @@ # command: 'broadcast %p has joined, welcome back!' # executor: CONSOLE # -# Supported command events: onLogin, onSessionLogin, onJoin, onRegister, onUnregister +# Supported command events: onLogin, onSessionLogin, onJoin, onLogout, onRegister, onUnregister onJoin: {} onLogin: {} -onSessionLogin: {} +# These commands are called whenever a logged in player uses /logout or quits. +# The commands are not run if a player that was not logged in quits the server. +# Note: if your server crashes, these commands won't be run, so don't rely on them to undo +# 'onLogin' commands that would be dangerous for non-logged in players to have! +onLogout: {} onRegister: {} +onSessionLogin: {} # Commands to run whenever a player is unregistered (by himself, or by an admin) -onUnregister: {} +onUnregister: {} \ No newline at end of file diff --git a/src/test/java/fr/xephi/authme/settings/commandconfig/CommandManagerTest.java b/src/test/java/fr/xephi/authme/settings/commandconfig/CommandManagerTest.java index f43f252d..e1795dc1 100644 --- a/src/test/java/fr/xephi/authme/settings/commandconfig/CommandManagerTest.java +++ b/src/test/java/fr/xephi/authme/settings/commandconfig/CommandManagerTest.java @@ -150,6 +150,21 @@ public class CommandManagerTest { verifyNoMoreInteractions(bukkitService); } + @Test + public void shouldExecuteCommandOnLogout() { + // given + copyJarFileAsCommandsYml(TEST_FILES_FOLDER + "commands.complete.yml"); + initManager(); + + // when + manager.runCommandsOnLogout(player); + + // then + verify(bukkitService).dispatchConsoleCommand("broadcast Bobby (127.0.0.3) logged out"); + verifyNoMoreInteractions(bukkitService); + verifyZeroInteractions(geoIpService); + } + @Test public void shouldExecuteCommandsOnRegisterWithIncompleteConfig() { // given diff --git a/src/test/resources/fr/xephi/authme/settings/commandconfig/commands.complete.yml b/src/test/resources/fr/xephi/authme/settings/commandconfig/commands.complete.yml index 83b717cf..4414ac12 100644 --- a/src/test/resources/fr/xephi/authme/settings/commandconfig/commands.complete.yml +++ b/src/test/resources/fr/xephi/authme/settings/commandconfig/commands.complete.yml @@ -25,3 +25,7 @@ onSessionLogin: welcome: command: 'msg %p Session login!' executor: CONSOLE +onLogout: + announce: + command: 'broadcast %p (%ip) logged out' + executor: CONSOLE