diff --git a/Essentials/src/main/java/com/earth2me/essentials/EssentialsEntityListener.java b/Essentials/src/main/java/com/earth2me/essentials/EssentialsEntityListener.java index 1d1fbff1ee..a7361bc950 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/EssentialsEntityListener.java +++ b/Essentials/src/main/java/com/earth2me/essentials/EssentialsEntityListener.java @@ -272,4 +272,14 @@ public void onEntityTarget(final EntityTargetEvent event) { } } } + @EventHandler(priority = EventPriority.HIGHEST) + public void onPhantomSpawn(final EntitySpawnEvent event) { + if (event.getEntity() instanceof Phantom) { + final Phantom phantom = (Phantom) event.getEntity(); + final User user = ess.getUser((Player) phantom.getTarget()); + if (user.isVanished()) { + event.setCancelled(true); + } + } + } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java index 60d3b4c25f..c50977b225 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java @@ -21,6 +21,7 @@ import io.papermc.paper.event.player.PlayerServerFullCheckEvent; import net.ess3.api.IEssentials; import net.ess3.api.events.AfkStatusChangeEvent; +import net.ess3.api.events.VanishStatusChangeEvent; import net.ess3.provider.CommandSendListenerProvider; import net.ess3.provider.FormattedCommandAliasProvider; import net.ess3.provider.InventoryViewProvider; @@ -30,12 +31,7 @@ import net.ess3.provider.providers.PaperCommandSendListenerProvider; import net.essentialsx.PaperAdventureSmuggler; import net.essentialsx.api.v2.events.AsyncUserDataLoadEvent; -import org.bukkit.BanEntry; -import org.bukkit.BanList; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.World; +import org.bukkit.*; import org.bukkit.command.Command; import org.bukkit.command.FormattedCommandAlias; import org.bukkit.command.PluginCommand; @@ -70,6 +66,7 @@ import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; +import org.eclipse.sisu.Priority; import java.io.IOException; import java.lang.management.ManagementFactory; @@ -147,6 +144,7 @@ private static boolean isGameEventEvent() { public void registerEvents() { ess.getServer().getPluginManager().registerEvents(this, ess); + ess.getServer().getPluginManager().registerEvents(new VanishListener(), ess); if (isArrowPickupEvent()) { ess.getServer().getPluginManager().registerEvents(new ArrowPickupListener(), ess); @@ -1285,4 +1283,17 @@ private boolean isEssentialsCommand(final String label) { && (ess.getSettings().isCommandOverridden(label) || ess.getAlternativeCommandsHandler().getAlternative(label) == null); } } + private class VanishListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + private void vanishEvent(VanishStatusChangeEvent event) { + User user = ess.getUser(event.getAffected().getUUID()); + if(event.getValue()){ + user.setLastSleptBeforeVanish(user.getBase().getStatistic(Statistic.TIME_SINCE_REST)); + return; + } + user.getBase().setStatistic(Statistic.TIME_SINCE_REST, user.getLastSleptBeforeVanish()); + } + + } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/User.java b/Essentials/src/main/java/com/earth2me/essentials/User.java index ab0281910e..0181127756 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/User.java +++ b/Essentials/src/main/java/com/earth2me/essentials/User.java @@ -103,6 +103,7 @@ public class User extends UserData implements Comparable, IMessageRecipien private transient int flightTick = -1; private String lastLocaleString; private Locale playerLocale; + private int lastSleptBeforeVanish; public User(final Player base, final IEssentials ess) { super(base, ess); @@ -1376,4 +1377,11 @@ public int getFlightTick() { public void setFlightTick(int flightTick) { this.flightTick = flightTick; } + + public void setLastSleptBeforeVanish(int lastSleptBeforeVanish) { + this.lastSleptBeforeVanish = lastSleptBeforeVanish; + } + public int getLastSleptBeforeVanish() { + return this.lastSleptBeforeVanish; + } } diff --git a/Essentials/src/test/java/com/earth2me/essentials/VanishListenerTest.java b/Essentials/src/test/java/com/earth2me/essentials/VanishListenerTest.java new file mode 100644 index 0000000000..22bc140945 --- /dev/null +++ b/Essentials/src/test/java/com/earth2me/essentials/VanishListenerTest.java @@ -0,0 +1,71 @@ +package com.earth2me.essentials; + +import net.ess3.api.IUser; +import net.ess3.api.events.VanishStatusChangeEvent; +import org.bukkit.Statistic; +import org.bukkit.event.entity.PlayerLeashEntityEvent; +import org.bukkit.event.player.PlayerBedEnterEvent; +import org.bukkit.event.player.PlayerBedLeaveEvent; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockbukkit.mockbukkit.MockBukkit; +import org.mockbukkit.mockbukkit.ServerMock; +import org.mockbukkit.mockbukkit.entity.PlayerMock; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class VanishListenerTest { + + private ServerMock server; + private Essentials ess; + private PlayerMock player; + private User user; + private IUser vanishedUser; + + @BeforeEach + public void setUp() { + this.server = MockBukkit.mock(); + Essentials.TESTING = true; + ess = MockBukkit.load(Essentials.class); + player = server.addPlayer("testPlayer"); + ess.getUser(player); + user = ess.getUser(player); + assertNotNull(user); + } + + @AfterEach + public void tearDown() { + MockBukkit.unmock(); + } + + @Test + public void shouldSaveTimeSinceRestWhenEnteringVanish() { + player.setStatistic(Statistic.TIME_SINCE_REST, 1200); + VanishStatusChangeEvent event = new VanishStatusChangeEvent(user, user, true); + assertEquals(user, event.getAffected()); + server.getPluginManager().callEvent(event); + assertEquals(1200, user.getLastSleptBeforeVanish()); + } + + @Test + public void shouldRestoreTimeSinceRestWhenLeavingVanish() { + player.setStatistic(Statistic.TIME_SINCE_REST, 1200); + server.getPluginManager().callEvent(new VanishStatusChangeEvent(user, user, true)); + player.setStatistic(Statistic.TIME_SINCE_REST, 8000); + server.getPluginManager().callEvent(new VanishStatusChangeEvent(user, user, false)); + assertEquals(1200, player.getStatistic(Statistic.TIME_SINCE_REST)); + } + + @Test + public void shouldPreserveTimeSinceRestWhenSleepingWhileVanished() { + player.setStatistic(Statistic.TIME_SINCE_REST, 1200); + server.getPluginManager().callEvent(new VanishStatusChangeEvent(user, user, true)); + server.getPluginManager().callEvent(new PlayerBedEnterEvent(player, player.getLocation().getBlock(), PlayerBedEnterEvent.BedEnterResult.OK)); + server.getScheduler().performTicks(1500); + server.getPluginManager().callEvent(new PlayerBedLeaveEvent(player, player.getLocation().getBlock(), true)); + server.getPluginManager().callEvent(new VanishStatusChangeEvent(user, user, false)); + assertEquals(1200, player.getStatistic(Statistic.TIME_SINCE_REST)); + } +} \ No newline at end of file diff --git a/EssentialsChat/src/main/java/com/earth2me/essentials/chat/EssentialsChat.java b/EssentialsChat/src/main/java/com/earth2me/essentials/chat/EssentialsChat.java index f7db3796d2..d734310353 100644 --- a/EssentialsChat/src/main/java/com/earth2me/essentials/chat/EssentialsChat.java +++ b/EssentialsChat/src/main/java/com/earth2me/essentials/chat/EssentialsChat.java @@ -2,6 +2,7 @@ import com.earth2me.essentials.Essentials; import com.earth2me.essentials.EssentialsLogger; +import com.earth2me.essentials.chat.processing.AntiSpam; import com.earth2me.essentials.chat.processing.ChatHandler; import com.earth2me.essentials.chat.processing.PaperChatHandler; import com.earth2me.essentials.metrics.MetricsWrapper; @@ -19,6 +20,7 @@ public class EssentialsChat extends JavaPlugin { private transient IEssentials ess; private transient MetricsWrapper metrics = null; + public transient AntiSpam antiSpam = new AntiSpam(); @Override public void onEnable() { diff --git a/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/AntiSpam.java b/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/AntiSpam.java new file mode 100644 index 0000000000..71ffd9e16d --- /dev/null +++ b/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/AntiSpam.java @@ -0,0 +1,25 @@ +package com.earth2me.essentials.chat.processing; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class AntiSpam { + static AntiSpam antiSpam; + public AntiSpam() { + antiSpam = this; + } + //Needs a listener, last message cache, compare to last message, + Map lastMessage = new HashMap<>(); + public boolean newMessage(UUID uuid, String message){ + String storedMessage = lastMessage.get(uuid); + if(storedMessage.equalsIgnoreCase(message) || storedMessage.startsWith(message)) { + return true; + } + lastMessage.put(uuid, message); + return false; + } + public static AntiSpam getAntiSpam(){ + return antiSpam; + } +} diff --git a/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/ChatHandler.java b/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/ChatHandler.java index eb53654525..ba2a6faaee 100644 --- a/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/ChatHandler.java +++ b/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/ChatHandler.java @@ -47,6 +47,9 @@ public void onPlayerChat(AsyncPlayerChatEvent event) { final AbstractChatEvent absEvent = wrap(event); handleChatPostFormat(absEvent); handleChatSubmit(absEvent); + + event.setCancelled(AntiSpam.getAntiSpam().newMessage(event.getPlayer().getUniqueId(), + event.getMessage())); } } } diff --git a/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/PaperChatHandler.java b/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/PaperChatHandler.java index 989816f069..a2b155bd85 100644 --- a/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/PaperChatHandler.java +++ b/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/PaperChatHandler.java @@ -10,7 +10,6 @@ public class PaperChatHandler extends AbstractChatHandler { public PaperChatHandler(Essentials ess, EssentialsChat essChat) { super(ess, essChat); } - public void registerListeners() { final PluginManager pm = essChat.getServer().getPluginManager(); pm.registerEvents(new ChatListener(), essChat); @@ -31,6 +30,8 @@ public void onChatNormal(AbstractChatEvent event) { public void onChatHighest(AbstractChatEvent event) { handleChatPostFormat(event); handleChatSubmit(event); + event.setCancelled(AntiSpam.getAntiSpam().newMessage(event.getPlayer().getUniqueId(), + event.getMessage())); } } } diff --git a/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/SpigotChatEvent.java b/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/SpigotChatEvent.java index 04ee58f376..6006710703 100644 --- a/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/SpigotChatEvent.java +++ b/EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/SpigotChatEvent.java @@ -13,6 +13,8 @@ public class SpigotChatEvent implements AbstractChatEvent { public SpigotChatEvent(AsyncPlayerChatEvent event) { this.event = event; + event.setCancelled(AntiSpam.getAntiSpam().newMessage(event.getPlayer().getUniqueId(), + event.getMessage())); } @Override @@ -69,4 +71,5 @@ public void removeRecipients(Predicate predicate) { public void addRecipient(Player player) { event.getRecipients().add(player); } + }