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); } } }