135 lines
5.1 KiB
Java
135 lines
5.1 KiB
Java
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<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(String playerName, Lang lang) {
|
|
String alert = lang.getMessage(playerName);
|
|
purge();
|
|
List<Date> 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);
|
|
}
|
|
}
|
|
|
|
}
|