diff --git a/Essentials/src/com/earth2me/essentials/Essentials.java b/Essentials/src/com/earth2me/essentials/Essentials.java index d52eed1d8..ec7eaac11 100644 --- a/Essentials/src/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/com/earth2me/essentials/Essentials.java @@ -34,14 +34,6 @@ import com.earth2me.essentials.textreader.SimpleTextInput; import com.earth2me.essentials.utils.DateUtil; import com.earth2me.essentials.utils.VersionUtil; import com.google.common.base.Throwables; -import java.io.File; -import java.io.IOException; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.*; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.stream.Collectors; import net.ess3.api.IEssentials; import net.ess3.api.ISettings; import net.ess3.api.*; @@ -83,6 +75,16 @@ import org.bukkit.scheduler.BukkitScheduler; import org.bukkit.scheduler.BukkitTask; import org.yaml.snakeyaml.error.YAMLException; +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.*; +import java.util.function.Predicate; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.stream.Collectors; + import static com.earth2me.essentials.I18n.tl; @@ -762,20 +764,25 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { @Override public int broadcastMessage(final String message) { - return broadcastMessage(null, null, message, true); + return broadcastMessage(null, null, message, true, u -> false); } @Override public int broadcastMessage(final IUser sender, final String message) { - return broadcastMessage(sender, null, message, false); + return broadcastMessage(sender, null, message, false, u -> false); + } + + @Override + public int broadcastMessage(final IUser sender, final String message, final Predicate shouldExclude) { + return broadcastMessage(sender, null, message, false, shouldExclude); } @Override public int broadcastMessage(final String permission, final String message) { - return broadcastMessage(null, permission, message, false); + return broadcastMessage(null, permission, message, false, u -> false); } - private int broadcastMessage(final IUser sender, final String permission, final String message, final boolean keywords) { + private int broadcastMessage(final IUser sender, final String permission, final String message, final boolean keywords, final Predicate shouldExclude) { if (sender != null && sender.isHidden()) { return 0; } @@ -783,10 +790,12 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { IText broadcast = new SimpleTextInput(message); final Collection players = getOnlinePlayers(); - for (Player player : players) { final User user = getUser(player); if ((permission == null && (sender == null || !user.isIgnoredPlayer(sender))) || (permission != null && user.isAuthorized(permission))) { + if (shouldExclude.test(user)) { + continue; + } if (keywords) { broadcast = new KeywordReplacer(broadcast, new CommandSource(player), this, false); } diff --git a/Essentials/src/com/earth2me/essentials/IEssentials.java b/Essentials/src/com/earth2me/essentials/IEssentials.java index 216f3ce94..7c34c1698 100644 --- a/Essentials/src/com/earth2me/essentials/IEssentials.java +++ b/Essentials/src/com/earth2me/essentials/IEssentials.java @@ -18,6 +18,7 @@ import org.bukkit.scheduler.BukkitTask; import java.util.Collection; import java.util.List; import java.util.UUID; +import java.util.function.Predicate; public interface IEssentials extends Plugin { void addReloadListener(IConf listener); @@ -47,6 +48,8 @@ public interface IEssentials extends Plugin { int broadcastMessage(IUser sender, String message); + int broadcastMessage(IUser sender, String message, Predicate shouldExclude); + int broadcastMessage(String permission, String message); ISettings getSettings(); diff --git a/Essentials/src/com/earth2me/essentials/ISettings.java b/Essentials/src/com/earth2me/essentials/ISettings.java index 261abf0fe..70d732c85 100644 --- a/Essentials/src/com/earth2me/essentials/ISettings.java +++ b/Essentials/src/com/earth2me/essentials/ISettings.java @@ -196,6 +196,8 @@ public interface ISettings extends IConf { String getAfkListName(); + boolean broadcastAfkMessage(); + boolean areDeathMessagesEnabled(); void setDebug(boolean debug); diff --git a/Essentials/src/com/earth2me/essentials/Settings.java b/Essentials/src/com/earth2me/essentials/Settings.java index ff89cfb2f..17266e503 100644 --- a/Essentials/src/com/earth2me/essentials/Settings.java +++ b/Essentials/src/com/earth2me/essentials/Settings.java @@ -513,6 +513,7 @@ public class Settings implements net.ess3.api.ISettings { sleepIgnoresAfkPlayers = _sleepIgnoresAfkPlayers(); afkListName = _getAfkListName(); isAfkListName = !afkListName.equalsIgnoreCase("none"); + broadcastAfkMessage = _broadcastAfkMessage(); itemSpawnBl = _getItemSpawnBlacklist(); loginAttackDelay = _getLoginAttackDelay(); signUsePerSecond = _getSignUsePerSecond(); @@ -949,6 +950,17 @@ public class Settings implements net.ess3.api.ISettings { return afkListName; } + private boolean broadcastAfkMessage; + + @Override + public boolean broadcastAfkMessage() { + return broadcastAfkMessage; + } + + private boolean _broadcastAfkMessage() { + return config.getBoolean("broadcast-afk-message", true); + } + @Override public boolean areDeathMessagesEnabled() { return config.getBoolean("death-messages", true); diff --git a/Essentials/src/com/earth2me/essentials/User.java b/Essentials/src/com/earth2me/essentials/User.java index e889ff21c..404571c7a 100644 --- a/Essentials/src/com/earth2me/essentials/User.java +++ b/Essentials/src/com/earth2me/essentials/User.java @@ -615,8 +615,13 @@ public class User extends UserData implements Comparable, IMessageRecipien if (broadcast && !isHidden()) { setDisplayNick(); final String msg = tl("userIsNotAway", getDisplayName()); - if (!msg.isEmpty()) { - ess.broadcastMessage(this, msg); + final String selfmsg = tl("userIsNotAwaySelf"); + if (!msg.isEmpty() && ess.getSettings().broadcastAfkMessage()) { + // exclude user from receiving general AFK announcement in favor of personal message + ess.broadcastMessage(this, msg, u -> u == this); + } + if (!selfmsg.isEmpty()) { + this.sendMessage(selfmsg); } } } @@ -663,8 +668,13 @@ public class User extends UserData implements Comparable, IMessageRecipien if (!isHidden()) { setDisplayNick(); final String msg = tl("userIsAway", getDisplayName()); - if (!msg.isEmpty()) { - ess.broadcastMessage(this, msg); + final String selfmsg = tl("userIsAwaySelf"); + if (!msg.isEmpty() && ess.getSettings().broadcastAfkMessage()) { + // exclude user from receiving general AFK announcement in favor of personal message + ess.broadcastMessage(this, msg, u -> u == this); + } + if (!selfmsg.isEmpty()) { + this.sendMessage(selfmsg); } } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandafk.java b/Essentials/src/com/earth2me/essentials/commands/Commandafk.java index e5944d933..202cf0b28 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandafk.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandafk.java @@ -56,25 +56,31 @@ public class Commandafk extends EssentialsCommand { } user.setDisplayNick(); String msg = ""; + String selfmsg = ""; if (!user.toggleAfk(AfkStatusChangeEvent.Cause.COMMAND)) { - //user.sendMessage(_("markedAsNotAway")); if (!user.isHidden()) { msg = tl("userIsNotAway", user.getDisplayName()); + selfmsg = tl("userIsNotAwaySelf"); } user.updateActivity(false, AfkStatusChangeEvent.Cause.COMMAND); } else { - //user.sendMessage(_("markedAsAway")); if (!user.isHidden()) { if (message != null) { msg = tl("userIsAwayWithMessage", user.getDisplayName(), message); + selfmsg = tl("userIsAwaySelfWithMessage", message); } else { msg = tl("userIsAway", user.getDisplayName()); + selfmsg = tl("userIsAwaySelf"); } } user.setAfkMessage(message); } - if (!msg.isEmpty()) { - ess.broadcastMessage(user, msg); + if (!msg.isEmpty() && ess.getSettings().broadcastAfkMessage()) { + // exclude user from receiving general AFK announcement in favor of personal message + ess.broadcastMessage(user, msg, u -> u == user); + } + if (!selfmsg.isEmpty()) { + user.sendMessage(selfmsg); } user.setDisplayNick(); // Set this again after toggling } diff --git a/Essentials/src/config.yml b/Essentials/src/config.yml index 79587df7a..a7f4524a2 100644 --- a/Essentials/src/config.yml +++ b/Essentials/src/config.yml @@ -437,6 +437,11 @@ sleep-ignores-afk-players: true # You may use color codes, use {USERNAME} the player's name or {PLAYER} for the player's displayname. afk-list-name: "none" +# When a player enters or exits AFK mode, should the AFK notification be broadcast +# to the entire server, or just to the player? +# When this setting is false, only the player will be notified upon changing their AFK state. +broadcast-afk-message: true + # You can disable the death messages of Minecraft here. death-messages: true diff --git a/Essentials/src/messages.properties b/Essentials/src/messages.properties index 93984bf96..f81d19798 100644 --- a/Essentials/src/messages.properties +++ b/Essentials/src/messages.properties @@ -587,6 +587,9 @@ userDoesNotExist=\u00a74The user\u00a7c {0} \u00a74does not exist. userIsAway=\u00a77* {0} \u00a77is now AFK. userIsAwayWithMessage=\u00a77* {0} \u00a77is now AFK. userIsNotAway=\u00a77* {0} \u00a77is no longer AFK. +userIsAwaySelf=\u00a77You are now AFK. +userIsAwaySelfWithMessage=\u00a77You are now AFK. +userIsNotAwaySelf=\u00a77You are no longer AFK. userJailed=\u00a76You have been jailed\! userUnknown=\u00a74Warning\: The user ''\u00a7c{0}\u00a74'' has never joined this server. usingTempFolderForTesting=Using temp folder for testing\: