152 lines
5.3 KiB
Java
152 lines
5.3 KiB
Java
package xyz.etztech.minealert.listeners;
|
|
|
|
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.Location;
|
|
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.minealert.Color;
|
|
import xyz.etztech.minealert.Lang;
|
|
import xyz.etztech.minealert.MineAlert;
|
|
import xyz.etztech.minealert.MuteType;
|
|
|
|
import java.util.*;
|
|
|
|
public class GriefAlertListener implements Listener {
|
|
private final MineAlert plugin;
|
|
private final Map<String, List<Date>> 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<List<Date>> it = map.values().iterator(); it.hasNext(); ) {
|
|
List<Date> dates = it.next();
|
|
dates.removeIf(date -> new Date(date.getTime() + purge).before(now));
|
|
if (dates.size() == 0) it.remove();
|
|
}
|
|
}
|
|
|
|
public void addAlert(Player player, Location eventLocation, Lang lang) {
|
|
if (MineAlert.hasIgnoreAlertPerm(player, MuteType.GRIEFALERT_MUTE)) {
|
|
return;
|
|
}
|
|
|
|
String playerName = player.getName();
|
|
String alert = lang.getMessage(playerName);
|
|
purge();
|
|
|
|
int aboveY = this.plugin.getConfigIntFallback(
|
|
0,
|
|
"grief.above_y"
|
|
);
|
|
|
|
int belowY = this.plugin.getConfigIntFallback(
|
|
255,
|
|
"grief.below_y"
|
|
);
|
|
|
|
int eventYLevel = eventLocation.getBlockY();
|
|
if (eventYLevel > belowY || eventYLevel < aboveY) {
|
|
return;
|
|
}
|
|
|
|
List<Date> dates = map.getOrDefault(alert, new ArrayList<>());
|
|
dates.add(new Date());
|
|
map.put(alert, dates);
|
|
|
|
if (MuteType.GRIEFALERT_MUTE.hasMuteStatus(player, plugin)) {
|
|
return;
|
|
}
|
|
|
|
Color color = new Color(plugin.getConfigStringFallback(
|
|
"#FFA500",
|
|
"grief.color"
|
|
));
|
|
String usernameURL = this.plugin.getConfigStringFallback(
|
|
"",
|
|
"grief.url",
|
|
"url"
|
|
);
|
|
|
|
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");
|
|
this.plugin.sendWebhook(webhook, color, player, eventLocation, alert, usernameURL);
|
|
}
|
|
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 &&
|
|
this.plugin.getConfig().getStringList("grief.enabled").contains("ignition") &&
|
|
(
|
|
event.getCause() == BlockIgniteEvent.IgniteCause.FLINT_AND_STEEL ||
|
|
event.getCause() == BlockIgniteEvent.IgniteCause.FIREBALL
|
|
)
|
|
) {
|
|
addAlert(event.getPlayer(), event.getBlock().getLocation(), Lang.IGNITE_ALERT);
|
|
}
|
|
}
|
|
|
|
@EventHandler
|
|
public void onBlockPlace(BlockPlaceEvent event) {
|
|
if(
|
|
this.plugin.getConfig().getStringList("grief.enabled").contains("tnt") &&
|
|
event.getBlockPlaced().getType() == Material.TNT
|
|
) {
|
|
addAlert(event.getPlayer(), event.getBlock().getLocation(), Lang.TNT_ALERT);
|
|
}
|
|
}
|
|
|
|
@EventHandler
|
|
public void onBucketEmpty(PlayerBucketEmptyEvent event) {
|
|
if(
|
|
this.plugin.getConfig().getStringList("grief.enabled").contains("lava") &&
|
|
event.getBucket() == Material.LAVA_BUCKET
|
|
) {
|
|
addAlert(event.getPlayer(), event.getBlock().getLocation(), Lang.LAVA_ALERT);
|
|
}
|
|
}
|
|
|
|
} |