diff --git a/Essentials/src/com/earth2me/essentials/User.java b/Essentials/src/com/earth2me/essentials/User.java index 1d34e5519af..920b275f1fd 100644 --- a/Essentials/src/com/earth2me/essentials/User.java +++ b/Essentials/src/com/earth2me/essentials/User.java @@ -14,6 +14,7 @@ import net.ess3.api.events.AfkStatusChangeEvent; import net.ess3.api.events.JailStatusChangeEvent; import net.ess3.api.events.MuteStatusChangeEvent; +import net.ess3.api.events.TempMuteStatusChangeEvent; import net.ess3.api.events.UserBalanceUpdateEvent; import net.ess3.nms.refl.ReflUtil; @@ -585,7 +586,7 @@ public boolean checkJailTimeout(final long currentTime) { //Returns true if status expired during this check public boolean checkMuteTimeout(final long currentTime) { if (getMuteTimeout() > 0 && getMuteTimeout() < currentTime && isMuted()) { - final MuteStatusChangeEvent event = new MuteStatusChangeEvent(this, null, false, getMuteTimeout(), getMuteReason()); + final MuteStatusChangeEvent event = new TempMuteStatusChangeEvent(this, null, getMuteReason(), getMuteTimeout()); ess.getServer().getPluginManager().callEvent(event); if (!event.isCancelled()) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandban.java b/Essentials/src/com/earth2me/essentials/commands/Commandban.java index e7ff69964db..ad284234029 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandban.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandban.java @@ -5,6 +5,7 @@ import com.earth2me.essentials.OfflinePlayer; import com.earth2me.essentials.User; import com.earth2me.essentials.utils.FormatUtil; +import net.ess3.api.events.BanStatusChangeEvent; import org.bukkit.BanList; import org.bukkit.Server; @@ -51,18 +52,25 @@ public void run(final Server server, final CommandSource sender, final String co banReason = tl("defaultBanReason"); } - ess.getServer().getBanList(BanList.Type.NAME).addBan(user.getName(), banReason, null, senderName); + final User controller = sender.isPlayer() ? ess.getUser(sender.getPlayer()) : null; + BanStatusChangeEvent event = new BanStatusChangeEvent(user, controller, true, banReason); + ess.getServer().getPluginManager().callEvent(event); - String banDisplay = tl("banFormat", banReason, senderName); + if(!event.isCancelled()) { + banReason = event.getReason(); + ess.getServer().getBanList(BanList.Type.NAME).addBan(user.getName(), banReason, null, senderName); - user.getBase().kickPlayer(banDisplay); - server.getLogger().log(Level.INFO, tl("playerBanned", senderName, user.getName(), banDisplay)); + String banDisplay = tl("banFormat", banReason, senderName); - if (nomatch) { - sender.sendMessage(tl("userUnknown", user.getName())); - } + user.getBase().kickPlayer(banDisplay); + server.getLogger().log(Level.INFO, tl("playerBanned", senderName, user.getName(), banDisplay)); + + if (nomatch) { + sender.sendMessage(tl("userUnknown", user.getName())); + } - ess.broadcastMessage("essentials.ban.notify", tl("playerBanned", senderName, user.getName(), banReason)); + ess.broadcastMessage("essentials.ban.notify", tl("playerBanned", senderName, user.getName(), banReason)); + } } @Override diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandbanip.java b/Essentials/src/com/earth2me/essentials/commands/Commandbanip.java index 1ba6bb56ee6..9194c7ddc34 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandbanip.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandbanip.java @@ -4,6 +4,7 @@ import com.earth2me.essentials.Console; import com.earth2me.essentials.User; import com.earth2me.essentials.utils.FormatUtil; +import net.ess3.api.events.IpBanStatusChangeEvent; import org.bukkit.BanList; import org.bukkit.Server; import org.bukkit.entity.Player; @@ -51,18 +52,25 @@ public void run(final Server server, final CommandSource sender, final String co banReason = tl("defaultBanReason"); } - String banDisplay = tl("banFormat", banReason, senderName); + final User controller = sender.isPlayer() ? ess.getUser(sender.getPlayer()) : null; + IpBanStatusChangeEvent event = new IpBanStatusChangeEvent(ipAddress, controller, true, banReason); + ess.getServer().getPluginManager().callEvent(event); - ess.getServer().getBanList(BanList.Type.IP).addBan(ipAddress, banReason, null, senderName); - server.getLogger().log(Level.INFO, tl("playerBanIpAddress", senderName, ipAddress, banReason)); + if (!event.isCancelled()) { + banReason = event.getReason(); + String banDisplay = tl("banFormat", banReason, senderName); - for (Player player : ess.getServer().getOnlinePlayers()) { - if (player.getAddress().getAddress().getHostAddress().equalsIgnoreCase(ipAddress)) { - player.kickPlayer(banDisplay); + ess.getServer().getBanList(BanList.Type.IP).addBan(ipAddress, banReason, null, senderName); + server.getLogger().log(Level.INFO, tl("playerBanIpAddress", senderName, ipAddress, banReason)); + + for (Player player : ess.getServer().getOnlinePlayers()) { + if (player.getAddress().getAddress().getHostAddress().equalsIgnoreCase(ipAddress)) { + player.kickPlayer(banDisplay); + } } - } - ess.broadcastMessage("essentials.banip.notify", tl("playerBanIpAddress", senderName, ipAddress, banReason)); + ess.broadcastMessage("essentials.banip.notify", tl("playerBanIpAddress", senderName, ipAddress, banReason)); + } } @Override diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandmute.java b/Essentials/src/com/earth2me/essentials/commands/Commandmute.java index f040a9b7ce0..32c42900aa3 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandmute.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandmute.java @@ -5,6 +5,7 @@ import com.earth2me.essentials.User; import com.earth2me.essentials.utils.DateUtil; import net.ess3.api.events.MuteStatusChangeEvent; +import net.ess3.api.events.TempMuteStatusChangeEvent; import org.bukkit.Server; import java.util.GregorianCalendar; @@ -60,13 +61,23 @@ public void run(final Server server, final CommandSource sender, final String co throw new NoChargeException(); } } - + final boolean willMute = (args.length > 1) || !user.getMuted(); final User controller = sender.isPlayer() ? ess.getUser(sender.getPlayer()) : null; - final MuteStatusChangeEvent event = new MuteStatusChangeEvent(user, controller, willMute, muteTimestamp, muteReason); + final MuteStatusChangeEvent event; + if (muteTimestamp == 0) { + event = new MuteStatusChangeEvent(user, controller, willMute, muteReason); + } else { + event = new TempMuteStatusChangeEvent(user, controller, muteReason, muteTimestamp); + } ess.getServer().getPluginManager().callEvent(event); - + if (!event.isCancelled()) { + muteReason = event.getReason(); + if (event instanceof TempMuteStatusChangeEvent) { + muteTimestamp = ((TempMuteStatusChangeEvent) event).getTimestamp(); + } + if (muteReason != null) { user.setMuteReason(muteReason.isEmpty() ? null : muteReason); user.setMuted(true); @@ -76,6 +87,7 @@ public void run(final Server server, final CommandSource sender, final String co user.setMuteReason(null); } } + user.setMuteTimeout(muteTimestamp); final boolean muted = user.getMuted(); String muteTime = DateUtil.formatDateDiff(muteTimestamp); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtempban.java b/Essentials/src/com/earth2me/essentials/commands/Commandtempban.java index feb4f41ace2..ab8a38223ac 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtempban.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtempban.java @@ -4,6 +4,7 @@ import com.earth2me.essentials.Console; import com.earth2me.essentials.User; import com.earth2me.essentials.utils.DateUtil; +import net.ess3.api.events.TempBanStatusChangeEvent; import org.bukkit.BanList; import org.bukkit.Server; @@ -38,7 +39,7 @@ public void run(final Server server, final CommandSource sender, final String co } } final String time = getFinalArg(args, 1); - final long banTimestamp = DateUtil.parseDateDiff(time, true); + long banTimestamp = DateUtil.parseDateDiff(time, true); String banReason = DateUtil.removeTimePattern(time); final long maxBanLength = ess.getSettings().getMaxTempban() * 1000; @@ -51,16 +52,24 @@ public void run(final Server server, final CommandSource sender, final String co banReason = tl("defaultBanReason"); } - final String senderName = sender.isPlayer() ? sender.getPlayer().getDisplayName() : Console.NAME; - ess.getServer().getBanList(BanList.Type.NAME).addBan(user.getName(), banReason, new Date(banTimestamp), senderName); - final String expiry = DateUtil.formatDateDiff(banTimestamp); + final User controller = sender.isPlayer() ? ess.getUser(sender.getPlayer()) : null; + TempBanStatusChangeEvent event = new TempBanStatusChangeEvent(user, controller, banReason, banTimestamp); + ess.getServer().getPluginManager().callEvent(event); - final String banDisplay = tl("tempBanned", expiry, senderName, banReason); - user.getBase().kickPlayer(banDisplay); + if(!event.isCancelled()) { + banReason = event.getReason(); + banTimestamp = event.getTimestamp(); + final String senderName = sender.isPlayer() ? sender.getPlayer().getDisplayName() : Console.NAME; + ess.getServer().getBanList(BanList.Type.NAME).addBan(user.getName(), banReason, new Date(banTimestamp), senderName); + final String expiry = DateUtil.formatDateDiff(banTimestamp); - final String message = tl("playerTempBanned", senderName, user.getName(), expiry, banReason); - server.getLogger().log(Level.INFO, message); - ess.broadcastMessage("essentials.ban.notify", message); + final String banDisplay = tl("tempBanned", expiry, senderName, banReason); + user.getBase().kickPlayer(banDisplay); + + final String message = tl("playerTempBanned", senderName, user.getName(), expiry, banReason); + server.getLogger().log(Level.INFO, message); + ess.broadcastMessage("essentials.ban.notify", message); + } } @Override diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandunban.java b/Essentials/src/com/earth2me/essentials/commands/Commandunban.java index ba763b44f2a..fb1356bd22b 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandunban.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandunban.java @@ -2,9 +2,10 @@ import com.earth2me.essentials.CommandSource; import com.earth2me.essentials.Console; +import com.earth2me.essentials.OfflinePlayer; import com.earth2me.essentials.User; +import net.ess3.api.events.BanStatusChangeEvent; import org.bukkit.BanList; -import org.bukkit.OfflinePlayer; import org.bukkit.Server; import java.util.logging.Level; @@ -22,23 +23,28 @@ public void run(final Server server, final CommandSource sender, final String co if (args.length < 1) { throw new NotEnoughArgumentsException(); } - String name; + + User user; try { - final User user = getPlayer(server, args, 0, true, true); - name = user.getName(); - ess.getServer().getBanList(BanList.Type.NAME).pardon(name); - } catch (NoSuchFieldException e) { - final OfflinePlayer player = server.getOfflinePlayer(args[0]); - name = player.getName(); - if (!player.isBanned()) { + user = getPlayer(server, args, 0, true, true); + } catch (PlayerNotFoundException e) { + user = ess.getUser(new OfflinePlayer(args[0], ess.getServer())); + if (!user.getBase().isBanned()) { throw new Exception(tl("playerNotFound"), e); } - ess.getServer().getBanList(BanList.Type.NAME).pardon(name); } - final String senderName = sender.isPlayer() ? sender.getPlayer().getDisplayName() : Console.NAME; - server.getLogger().log(Level.INFO, tl("playerUnbanned", senderName, name)); + final User controller = sender.isPlayer() ? ess.getUser(sender.getPlayer()) : null; + BanStatusChangeEvent event = new BanStatusChangeEvent(user, controller, false, null); + ess.getServer().getPluginManager().callEvent(event); + + if (!event.isCancelled()) { + ess.getServer().getBanList(BanList.Type.NAME).pardon(user.getName()); - ess.broadcastMessage("essentials.ban.notify", tl("playerUnbanned", senderName, name)); + final String senderName = sender.isPlayer() ? sender.getPlayer().getDisplayName() : Console.NAME; + server.getLogger().log(Level.INFO, tl("playerUnbanned", senderName, user.getName())); + + ess.broadcastMessage("essentials.ban.notify", tl("playerUnbanned", senderName, user.getName())); + } } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandunbanip.java b/Essentials/src/com/earth2me/essentials/commands/Commandunbanip.java index bae6b4bd8d1..ed01abfa2fd 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandunbanip.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandunbanip.java @@ -4,6 +4,7 @@ import com.earth2me.essentials.Console; import com.earth2me.essentials.User; import com.earth2me.essentials.utils.FormatUtil; +import net.ess3.api.events.IpBanStatusChangeEvent; import org.bukkit.BanList; import org.bukkit.Server; @@ -39,11 +40,16 @@ public void run(final Server server, final CommandSource sender, final String co throw new PlayerNotFoundException(); } + final User controller = sender.isPlayer() ? ess.getUser(sender.getPlayer()) : null; + IpBanStatusChangeEvent event = new IpBanStatusChangeEvent(ipAddress, controller, false, null); + ess.getServer().getPluginManager().callEvent(event); - ess.getServer().getBanList(BanList.Type.IP).pardon(ipAddress); - final String senderName = sender.isPlayer() ? sender.getPlayer().getDisplayName() : Console.NAME; - server.getLogger().log(Level.INFO, tl("playerUnbanIpAddress", senderName, ipAddress)); + if (!event.isCancelled()) { + ess.getServer().getBanList(BanList.Type.IP).pardon(ipAddress); + final String senderName = sender.isPlayer() ? sender.getPlayer().getDisplayName() : Console.NAME; + server.getLogger().log(Level.INFO, tl("playerUnbanIpAddress", senderName, ipAddress)); - ess.broadcastMessage("essentials.banip.notify", tl("playerUnbanIpAddress", senderName, ipAddress)); + ess.broadcastMessage("essentials.banip.notify", tl("playerUnbanIpAddress", senderName, ipAddress)); + } } } diff --git a/Essentials/src/net/ess3/api/events/BanStatusChangeEvent.java b/Essentials/src/net/ess3/api/events/BanStatusChangeEvent.java new file mode 100644 index 00000000000..0a970fd92c1 --- /dev/null +++ b/Essentials/src/net/ess3/api/events/BanStatusChangeEvent.java @@ -0,0 +1,9 @@ +package net.ess3.api.events; + +import net.ess3.api.IUser; + +public class BanStatusChangeEvent extends ReasonedStatusChangeEvent { + public BanStatusChangeEvent(IUser affected, IUser controller, boolean value, String reason) { + super(affected, controller, value, reason); + } +} diff --git a/Essentials/src/net/ess3/api/events/IpBanStatusChangeEvent.java b/Essentials/src/net/ess3/api/events/IpBanStatusChangeEvent.java new file mode 100644 index 00000000000..2f3e4e9f54a --- /dev/null +++ b/Essentials/src/net/ess3/api/events/IpBanStatusChangeEvent.java @@ -0,0 +1,61 @@ +package net.ess3.api.events; + +import net.ess3.api.IUser; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class IpBanStatusChangeEvent extends Event implements Cancellable { + private static final HandlerList handlers = new HandlerList(); + private boolean cancelled = false; + String affectedIp; + IUser controller; + private String reason; + private boolean newValue; + + public IpBanStatusChangeEvent(String affectedIp, IUser controller, boolean newValue, String reason) { + this.affectedIp = affectedIp; + this.controller = controller; + this.newValue = newValue; + this.reason = reason; + } + + public String getAffectedIp() { + return affectedIp; + } + + public IUser getController() { + return controller; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancelled) { + this.cancelled = cancelled; + } + + public boolean getValue() { + return newValue; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } +} diff --git a/Essentials/src/net/ess3/api/events/MuteStatusChangeEvent.java b/Essentials/src/net/ess3/api/events/MuteStatusChangeEvent.java index 25738c4da6e..7cd96f0e9b1 100644 --- a/Essentials/src/net/ess3/api/events/MuteStatusChangeEvent.java +++ b/Essentials/src/net/ess3/api/events/MuteStatusChangeEvent.java @@ -2,30 +2,8 @@ import net.ess3.api.IUser; -import java.util.Optional; - - -public class MuteStatusChangeEvent extends StatusChangeEvent { - private Long timestamp; - private String reason; - - public MuteStatusChangeEvent(IUser affected, IUser controller, boolean value, Long timestamp, String reason) { - super(affected, controller, value); - this.timestamp = timestamp; - this.reason = reason == null ? null : (reason.isEmpty() ? null : reason); - } - - /** - * @return If the mute is temporary, returns a present optional with the timestamp; if permanent or unknown, returns an empty optional. - */ - public Optional getTimestamp() { - return Optional.ofNullable(timestamp <= 0 ? null : timestamp); - } - - /** - * @return Returns the reason if provided, otherwise null. - */ - public String getReason() { - return reason; +public class MuteStatusChangeEvent extends ReasonedStatusChangeEvent { + public MuteStatusChangeEvent(IUser affected, IUser controller, boolean value, String reason) { + super(affected, controller, value, reason); } } diff --git a/Essentials/src/net/ess3/api/events/ReasonedStatusChangeEvent.java b/Essentials/src/net/ess3/api/events/ReasonedStatusChangeEvent.java new file mode 100644 index 00000000000..cdae6a15657 --- /dev/null +++ b/Essentials/src/net/ess3/api/events/ReasonedStatusChangeEvent.java @@ -0,0 +1,20 @@ +package net.ess3.api.events; + +import net.ess3.api.IUser; + +public class ReasonedStatusChangeEvent extends StatusChangeEvent { + private String reason; + + public ReasonedStatusChangeEvent(IUser affected, IUser controller, boolean value, String reason) { + super(affected, controller, value); + this.reason = reason; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } +} \ No newline at end of file diff --git a/Essentials/src/net/ess3/api/events/StateChangeEvent.java b/Essentials/src/net/ess3/api/events/StateChangeEvent.java index bec9ca3ee35..e4fe0ee14b9 100644 --- a/Essentials/src/net/ess3/api/events/StateChangeEvent.java +++ b/Essentials/src/net/ess3/api/events/StateChangeEvent.java @@ -15,6 +15,7 @@ public abstract class StateChangeEvent extends Event implements Cancellable { private boolean cancelled = false; IUser affected; IUser controller; + private boolean newValue; public StateChangeEvent(IUser affected, IUser controller) { super(); diff --git a/Essentials/src/net/ess3/api/events/TempBanStatusChangeEvent.java b/Essentials/src/net/ess3/api/events/TempBanStatusChangeEvent.java new file mode 100644 index 00000000000..27ef845d365 --- /dev/null +++ b/Essentials/src/net/ess3/api/events/TempBanStatusChangeEvent.java @@ -0,0 +1,22 @@ +package net.ess3.api.events; + +import net.ess3.api.IUser; + +public class TempBanStatusChangeEvent extends BanStatusChangeEvent implements TimestampEvent { + private long timestamp; + + public TempBanStatusChangeEvent(IUser affected, IUser controller, String reason, long banTimestamp) { + super(affected, controller, true, reason); + this.timestamp = banTimestamp; + } + + @Override + public long getTimestamp() { + return timestamp; + } + + @Override + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } +} diff --git a/Essentials/src/net/ess3/api/events/TempMuteStatusChangeEvent.java b/Essentials/src/net/ess3/api/events/TempMuteStatusChangeEvent.java new file mode 100644 index 00000000000..d007ee1eb82 --- /dev/null +++ b/Essentials/src/net/ess3/api/events/TempMuteStatusChangeEvent.java @@ -0,0 +1,22 @@ +package net.ess3.api.events; + +import net.ess3.api.IUser; + +public class TempMuteStatusChangeEvent extends MuteStatusChangeEvent implements TimestampEvent { + private long timestamp; + + public TempMuteStatusChangeEvent(IUser affected, IUser controller, String reason, long banTimestamp) { + super(affected, controller, true, reason); + this.timestamp = banTimestamp; + } + + @Override + public long getTimestamp() { + return timestamp; + } + + @Override + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } +} diff --git a/Essentials/src/net/ess3/api/events/TimestampEvent.java b/Essentials/src/net/ess3/api/events/TimestampEvent.java new file mode 100644 index 00000000000..114a4d7f7ca --- /dev/null +++ b/Essentials/src/net/ess3/api/events/TimestampEvent.java @@ -0,0 +1,6 @@ +package net.ess3.api.events; + +public interface TimestampEvent { + long getTimestamp(); + void setTimestamp(long timestamp); +}