From c159eea8fdef40446d6dcd81e49e287aafb4240a Mon Sep 17 00:00:00 2001 From: Etzelia Date: Sun, 2 Aug 2020 23:12:07 +0200 Subject: [PATCH] Add grief alert (#2) Merge branch 'master' into grief Merge branch 'master' of git.etztech.xyz:Minecraft/MineAlert into grief Signed-off-by: Etzelia Add OPEN_URL to spigot message Signed-off-by: Etzelia Add grief alert Signed-off-by: Etzelia Reviewed-on: https://git.etztech.xyz/Minecraft/MineAlert/pulls/2 Reviewed-by: ZeroHD --- pom.xml | 2 +- .../java/xyz/etztech/minealert/Color.java | 12 +- src/main/java/xyz/etztech/minealert/Lang.java | 14 +- .../java/xyz/etztech/minealert/MineAlert.java | 2 + .../listeners/GriefAlertListener.java | 134 ++++++++++++++++++ .../minealert/listeners/OreAlertListener.java | 2 +- src/main/resources/config.yml | 13 ++ 7 files changed, 166 insertions(+), 13 deletions(-) create mode 100644 src/main/java/xyz/etztech/minealert/listeners/GriefAlertListener.java diff --git a/pom.xml b/pom.xml index b1b72eb..183e846 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ xyz.etztech MineAlert - 0.0.2 + 0.0.3 jar diff --git a/src/main/java/xyz/etztech/minealert/Color.java b/src/main/java/xyz/etztech/minealert/Color.java index 3e77aad..c21356c 100644 --- a/src/main/java/xyz/etztech/minealert/Color.java +++ b/src/main/java/xyz/etztech/minealert/Color.java @@ -5,16 +5,16 @@ import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; -public enum Color { - DEFAULT("#AAAAAA"), - ERROR("#F14668"), - INFO("#3298DC"), - PRIMARY("#3273DC"); +public class Color { + public static Color DEFAULT = new Color("#AAAAAA"); + public static Color ERROR = new Color("#F14668"); + public static Color INFO = new Color("#3298DC"); + public static Color PRIMARY = new Color("#3273DC"); private final String hex; private final ChatColor chatColor; - Color(String hex) { + public Color(String hex) { this.hex = hex; this.chatColor = ChatColor.of(hex); } diff --git a/src/main/java/xyz/etztech/minealert/Lang.java b/src/main/java/xyz/etztech/minealert/Lang.java index 5cb8ebc..9100d0b 100644 --- a/src/main/java/xyz/etztech/minealert/Lang.java +++ b/src/main/java/xyz/etztech/minealert/Lang.java @@ -9,9 +9,13 @@ public enum Lang { NO_PERMISSION("You don't have permission to do that.", Color.ERROR), UNKNOWN_COMMAND("This command wasn't recognized.", Color.ERROR), PLUGIN_RELOADED("MineAlert reloaded.", Color.INFO), - ALERT("%s has found %d %s veins.", Color.DEFAULT), - NOT_ENOUGH_ARGS("%s requires %d arguments.", Color.ERROR), - WEBHOOK_FAILED("Could not send webhook.", Color.ERROR); + WEBHOOK_FAILED("Could not send webhook.", Color.ERROR), + + ORE_ALERT("%s has found %d %s veins.", Color.DEFAULT), + + IGNITE_ALERT("%s started a fire.", Color.DEFAULT), + TNT_ALERT("%s placed TnT.", Color.DEFAULT), + LAVA_ALERT("%s poured lava.", Color.DEFAULT); private final String message; private final Color color; @@ -21,8 +25,8 @@ public enum Lang { this.color = color; } - public String getMessage() { - return this.message; + public String getMessage(Object ...args) { + return String.format(this.message, args); } public Color getColor() { diff --git a/src/main/java/xyz/etztech/minealert/MineAlert.java b/src/main/java/xyz/etztech/minealert/MineAlert.java index dd8d09c..917c741 100644 --- a/src/main/java/xyz/etztech/minealert/MineAlert.java +++ b/src/main/java/xyz/etztech/minealert/MineAlert.java @@ -3,6 +3,7 @@ package xyz.etztech.minealert; import org.bukkit.plugin.java.JavaPlugin; import xyz.etztech.minealert.commands.MainCommand; +import xyz.etztech.minealert.listeners.GriefAlertListener; import xyz.etztech.minealert.listeners.OreAlertListener; import java.util.logging.Logger; @@ -19,6 +20,7 @@ public class MineAlert extends JavaPlugin { if (isEnabled()) { new MainCommand(this); + new GriefAlertListener(this); new OreAlertListener(this); } } diff --git a/src/main/java/xyz/etztech/minealert/listeners/GriefAlertListener.java b/src/main/java/xyz/etztech/minealert/listeners/GriefAlertListener.java new file mode 100644 index 0000000..db22cf6 --- /dev/null +++ b/src/main/java/xyz/etztech/minealert/listeners/GriefAlertListener.java @@ -0,0 +1,134 @@ +package xyz.etztech.minealert.listeners; + +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockIgniteEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.player.PlayerBucketEmptyEvent; +import xyz.etztech.Javacord; +import xyz.etztech.Webhook; +import xyz.etztech.embed.Author; +import xyz.etztech.embed.Embed; +import xyz.etztech.minealert.Color; +import xyz.etztech.minealert.Lang; +import xyz.etztech.minealert.MineAlert; + +import java.time.OffsetDateTime; +import java.util.*; + +public class GriefAlertListener implements Listener { + private final MineAlert plugin; + private final Map> map = new HashMap<>(); + + public GriefAlertListener(MineAlert plugin) { + this.plugin = plugin; + this.plugin.getServer().getPluginManager().registerEvents(this, this.plugin); + this.plugin.getServer().getScheduler().runTaskTimerAsynchronously(this.plugin, this::purge, 0, 20 * 60 ); + } + + public void purge() { + Date now = Calendar.getInstance().getTime(); + int purge = 1000 * 60 * this.plugin.getConfig().getInt("grief.reset", 10); + for (Iterator> it = map.values().iterator(); it.hasNext(); ) { + List dates = it.next(); + dates.removeIf(date -> new Date(date.getTime() + purge).before(now)); + if (dates.size() == 0) it.remove(); + } + } + + public void addAlert(String playerName, Lang lang) { + String alert = lang.getMessage(playerName); + purge(); + List dates = map.getOrDefault(alert, new ArrayList<>()); + dates.add(new Date()); + map.put(alert, dates); + + Color color = new Color(plugin.getConfigStringFallback( + "#FFA500", + "grief.color" + )); + String usernameURL = this.plugin.getConfigStringFallback( + "", + "grief.url", + "url" + ).replaceAll("\\{username}", playerName); + + int threshold = this.plugin.getConfig().getInt("grief.threshold", 5); + if (dates.size() <= threshold) { + StringBuilder extra = new StringBuilder(); + if (dates.size() == threshold) { + extra.append(" Suppressing more alerts for a while"); + String webhook = this.plugin.getConfigStringFallback( + "", + "grief.webhook", + "webhook" + ); + if (!"".equals(webhook)) { + extra.append(" and pinging Discord"); + Embed embed = new Embed() + .color(color.getInt()) + .description(alert) + .timestamp(OffsetDateTime.now()) + .author(new Author(Javacord.escapeFormat(playerName), + !"".equals(usernameURL) ? usernameURL : "", + String.format("https://minotar.net/helm/%s/100.png", playerName), + "")); + this.plugin.getServer().getScheduler().runTaskAsynchronously(this.plugin, () -> { + try { + Javacord.sendWebhook(webhook, new Webhook("@here", embed)); + } catch (Exception e) { + this.plugin.log(Lang.WEBHOOK_FAILED.getMessage()); + } + }); + } + extra.append("..."); + } + ComponentBuilder builder = new ComponentBuilder() + .append(alert + extra.toString()).color(color.getChatColor()); + if (!"".equals(usernameURL)) { + builder.event(new ClickEvent(ClickEvent.Action.OPEN_URL, usernameURL)); + } + sendAlert(builder.create()); + } + } + + public void sendAlert(BaseComponent[] message) { + for (Player player : Bukkit.getOnlinePlayers()) { + if (player.hasPermission("minealert.alert")) { + player.spigot().sendMessage(message); + } + } + } + + + @EventHandler + public void onBlockIgnite(BlockIgniteEvent event) { + if (event.getPlayer() != null && + (event.getCause() == BlockIgniteEvent.IgniteCause.FLINT_AND_STEEL || + event.getCause() == BlockIgniteEvent.IgniteCause.FIREBALL)) { + addAlert(event.getPlayer().getName(), Lang.IGNITE_ALERT); + } + } + + @EventHandler + public void onBlockPlace(BlockPlaceEvent event) { + if(event.getBlockPlaced().getType() == Material.TNT) { + addAlert(event.getPlayer().getName(), Lang.TNT_ALERT); + } + } + + @EventHandler + public void onBucketEmpty(PlayerBucketEmptyEvent event) { + if(event.getBucket() == Material.LAVA_BUCKET) { + addAlert(event.getPlayer().getName(), Lang.LAVA_ALERT); + } + } + +} diff --git a/src/main/java/xyz/etztech/minealert/listeners/OreAlertListener.java b/src/main/java/xyz/etztech/minealert/listeners/OreAlertListener.java index 06c5ea0..f152902 100644 --- a/src/main/java/xyz/etztech/minealert/listeners/OreAlertListener.java +++ b/src/main/java/xyz/etztech/minealert/listeners/OreAlertListener.java @@ -164,7 +164,7 @@ public class OreAlertListener implements Listener { } private void sendAlert(BlockEvent event, int strikes, boolean ping) { - String message = String.format(Lang.ALERT.getMessage(), + String message = String.format(Lang.ORE_ALERT.getMessage(), event.getPlayer().getName(), strikes, Lang.getMaterialName(event.getMaterial())); String hexColor = this.plugin.getConfigStringFallback( "#AAAAAA", diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 9e28406..d41920f 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -5,6 +5,19 @@ webhook: '' # Can use {username} as a placeholder for the player's username url: 'https://website.com/{username}' +# GriefAlert +grief: + # How many alerts before temporarily muting + threshold: 5 + # How long before un-muting (in minutes) + reset: 10 + # Discord webhook + webhook: '' + # Webhook color + color: '' + # Override + url: '' + # OreAlert ore: # Radius to search around block for similar blocks in the "vein"