diff --git a/Essentials/src/main/java/com/earth2me/essentials/ISettings.java b/Essentials/src/main/java/com/earth2me/essentials/ISettings.java index 67be6b14d89..4677a7bcd1d 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/ISettings.java +++ b/Essentials/src/main/java/com/earth2me/essentials/ISettings.java @@ -210,6 +210,8 @@ public interface ISettings extends IConf { long getAutoAfkKick(); + List getAfkTimeoutCommands(); + boolean getFreezeAfkPlayers(); boolean cancelAfkOnMove(); diff --git a/Essentials/src/main/java/com/earth2me/essentials/Settings.java b/Essentials/src/main/java/com/earth2me/essentials/Settings.java index 8980aa97b3f..4ae79413a83 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Settings.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Settings.java @@ -153,6 +153,7 @@ public class Settings implements net.ess3.api.ISettings { private Tag secondaryColor = DEFAULT_SECONDARY_COLOR; private Set multiplierPerms; private BigDecimal defaultMultiplier; + private List afkTimeoutCommands = Collections.emptyList(); public Settings(final IEssentials ess) { this.ess = ess; @@ -938,6 +939,7 @@ public void reloadConfig() { secondaryColor = _getSecondaryColor(); multiplierPerms = _getMultiplierPerms(); defaultMultiplier = _getDefaultMultiplier(); + afkTimeoutCommands = _getAfkTimeoutCommands(); reloadCount.incrementAndGet(); } @@ -1266,6 +1268,17 @@ public long getAutoAfkKick() { return config.getLong("auto-afk-kick", -1); } + private List _getAfkTimeoutCommands() { + final List commands = config.getList("afk-timeout-commands", String.class); + // commands.replaceAll(String::toLowerCase); + return commands; + } + + @Override + public List getAfkTimeoutCommands() { + return afkTimeoutCommands; + } + @Override public boolean getFreezeAfkPlayers() { return getFreezeAfkPlayers; diff --git a/Essentials/src/main/java/com/earth2me/essentials/User.java b/Essentials/src/main/java/com/earth2me/essentials/User.java index 72f6feaad6c..dad12647926 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/User.java +++ b/Essentials/src/main/java/com/earth2me/essentials/User.java @@ -825,18 +825,33 @@ public void checkActivity() { } final long autoafkkick = ess.getSettings().getAutoAfkKick(); + + // Checks if the player has been inactive for longer than the configured auto-afk-kick time. if (autoafkkick > 0 && lastActivity > 0 && (lastActivity + (autoafkkick * 1000)) < System.currentTimeMillis() && !isAuthorized("essentials.kick.exempt") && !isAuthorized("essentials.afk.kickexempt")) { lastActivity = 0; final double kickTime = autoafkkick / 60.0; - - this.getBase().kickPlayer(AdventureUtil.miniToLegacy(playerTl("autoAfkKickReason", kickTime))); - - for (final User user : ess.getOnlineUsers()) { - if (user.isAuthorized("essentials.kick.notify")) { - user.sendTl("playerKicked", Console.DISPLAY_NAME, getName(), user.playerTl("autoAfkKickReason", kickTime)); + + // If `afk-timeout-command` in config.yml is empty, use default Essentials kicking behaviour instead of executing a command. + if (ess.getSettings().getAfkTimeoutCommands().isEmpty()) { + this.getBase().kickPlayer(AdventureUtil.miniToLegacy(playerTl("autoAfkKickReason", kickTime))); + + for (final User user : ess.getOnlineUsers()) { + if (user.isAuthorized("essentials.kick.notify")) { + user.sendTl("playerKicked", Console.DISPLAY_NAME, getName(), user.playerTl("autoAfkKickReason", kickTime)); + } + } + } else { + // If `afk-timeout-command` in config.yml is populated, execute the command(s) instead of kicking the player. + for (final String command : ess.getSettings().getAfkTimeoutCommands()) { + if (command == null || command.isEmpty()){ + continue; + } + // Replace placeholders in the command with actual values. + final String cmd = command.replace("{USERNAME}", getName()).replace("{KICKTIME}", String.valueOf(kickTime)); + ess.getServer().dispatchCommand(ess.getServer().getConsoleSender(), cmd); } } } diff --git a/Essentials/src/main/resources/config.yml b/Essentials/src/main/resources/config.yml index 771d9372b64..d536346f1e4 100644 --- a/Essentials/src/main/resources/config.yml +++ b/Essentials/src/main/resources/config.yml @@ -484,6 +484,14 @@ auto-afk: 300 # Set to -1 for no timeout. auto-afk-kick: -1 +# Define a set of commands the server runs when a player's AFK time elapses. +# Set to [] to use Essentials' default AFK timeout kick behavior. +# +# Available placeholders: +# {USERNAME} - The player's username. +# {KICKTIME} - The time, in minutes, the player has been AFK for. +afk-timeout-commands: [] + # Set this to true if you want to freeze players when they are AFK. # Other players or monsters won't be able to push them out of AFK mode. # This will also enable temporary god mode for the AFK player.