diff --git a/pom.xml b/pom.xml index 3189991..1ae670b 100644 --- a/pom.xml +++ b/pom.xml @@ -34,11 +34,6 @@ 1.16.1-R0.1-SNAPSHOT provided - - xyz.etztech - EtzCore - 1.0.5 - commons-lang commons-lang @@ -52,17 +47,13 @@ spigotmc-repo https://hub.spigotmc.org/nexus/content/groups/public/ - - etztech-repo - http://repo.etztech.xyz - mvn-repo https://mvnrepository.com/artifact/ jcenter - http://jcenter.bintray.com + https://jcenter.bintray.com jitpack.io diff --git a/src/main/java/xyz/etztech/orealert/Lang.java b/src/main/java/xyz/etztech/orealert/Lang.java index d5880b4..ac1a211 100644 --- a/src/main/java/xyz/etztech/orealert/Lang.java +++ b/src/main/java/xyz/etztech/orealert/Lang.java @@ -10,7 +10,8 @@ import org.bukkit.command.CommandSender; 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("Plugin reloaded.", Color.INFO); + PLUGIN_RELOADED("Plugin reloaded.", Color.INFO), + ALERT("%s has found %d %s veins.", null); private final String message; private final ChatColor color; @@ -20,6 +21,14 @@ public enum Lang { this.color = color; } + public String getMessage() { + return this.message; + } + + public ChatColor getColor() { + return this.color; + } + public void sms(CommandSender sender) { TextComponent text = new TextComponent(this.message); text.setColor(this.color); @@ -29,7 +38,7 @@ public enum Lang { public static String getMaterialName(Material material) { String name = material.name(); name = name.replaceAll("_", " "); - name = WordUtils.capitalize(name); + name = WordUtils.capitalize(name.toLowerCase()); return name; } diff --git a/src/main/java/xyz/etztech/orealert/listeners/BlockBreakListener.java b/src/main/java/xyz/etztech/orealert/listeners/BlockBreakListener.java index 589352a..896c4e7 100644 --- a/src/main/java/xyz/etztech/orealert/listeners/BlockBreakListener.java +++ b/src/main/java/xyz/etztech/orealert/listeners/BlockBreakListener.java @@ -1,6 +1,11 @@ package xyz.etztech.orealert.listeners; -import org.bukkit.Location; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.configuration.file.FileConfiguration; @@ -11,7 +16,14 @@ import org.bukkit.event.block.BlockBreakEvent; import xyz.etztech.orealert.Lang; import xyz.etztech.orealert.OreAlert; -import java.time.LocalDateTime; +import java.awt.*; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Queue; import java.util.*; import java.util.concurrent.ConcurrentLinkedQueue; @@ -31,25 +43,24 @@ public class BlockBreakListener implements Listener { @EventHandler public void onBlockBreak(BlockBreakEvent event) { - queue.add(new BlockEvent(event.getPlayer(), event.getBlock(), true)); + queue.add(new BlockEvent(event.getPlayer(), event.getBlock().getType(), true)); int radius = this.plugin.getConfig().getInt("radius", 3); for (int x = -radius; x < radius; x++) { for (int y = -radius; y < radius; y++) { for (int z = -radius; z < radius; z++) { - queue.add(new BlockEvent(event.getPlayer(), event.getBlock().getRelative(x, y, z), false)); + queue.add(new BlockEvent(event.getPlayer(), event.getBlock().getRelative(x, y, z).getType(), false)); } } } } private void task() { - while (true) { + while (this.plugin.isEnabled()) { BlockEvent event = this.queue.poll(); if (event != null) { - List blocks = this.plugin.getConfig().getStringList("blocks"); - for (String s: blocks) { - if (Lang.getMaterialKey(event.getBlock().getType()).equals(s)) { + for (String s: this.plugin.getConfig().getConfigurationSection("blocks").getKeys(false)) { + if (Lang.getMaterialKey(event.getMaterial()).equals(s)) { addStrike(event); check(event); break; @@ -66,9 +77,8 @@ public class BlockBreakListener implements Listener { } private void check(BlockEvent event) { - List events = map.getOrDefault(event.getPlayer(), new ArrayList<>()); FileConfiguration config = this.plugin.getConfig(); - String blockKey = Lang.getMaterialKey(event.getBlock().getType()); + String blockKey = Lang.getMaterialKey(event.getMaterial()); int start = config.getInt(String.format("blocks.%s.start", blockKey), config.getInt("start", 5)); int each = config.getInt(String.format("blocks.%s.each", blockKey), config.getInt("each", 5)); int ping = config.getInt(String.format("blocks.%s.ping", blockKey), config.getInt("ping", 5)); @@ -81,7 +91,16 @@ public class BlockBreakListener implements Listener { } } - // TODO Notify + double alert = (double) strikes / start; + if (alert == 1) { + alert(event, strikes, true); + } else if (alert > 1) { + if (alert % ping == 0) { + alert(event, strikes, true); + } else if (alert % each == 0) { + alert(event, strikes, false); + } + } } private void cleanup() { @@ -99,23 +118,91 @@ public class BlockBreakListener implements Listener { int globalPurge = this.plugin.getConfig().getInt("purge", 30); while (events.hasNext()) { BlockEvent e = events.next(); - int purge = 1000 * 60 * this.plugin.getConfig().getInt(String.format("blocks.%s.purge", Lang.getMaterialKey(e.getBlock().getType())), globalPurge); + int purge = 1000 * 60 * this.plugin.getConfig().getInt(String.format("blocks.%s.purge", Lang.getMaterialKey(e.getMaterial())), globalPurge); if (new Date(e.getTime().getTime() + purge).before(now)) { events.remove(); } } } + + private void alert(BlockEvent event, int strikes, boolean ping) { + String message = String.format(Lang.ALERT.getMessage(), + event.getPlayer().getName(), strikes, Lang.getMaterialName(event.getMaterial())); + ChatColor color = ChatColor.of(this.plugin.getConfig().getString(String.format("blocks.%s.color", Lang.getMaterialKey(event.getMaterial())), "#00ffff")); + BaseComponent[] component = new ComponentBuilder() + .append(message).color(color) + .create(); + + for (Player player : Bukkit.getOnlinePlayers()) { + if (player.hasPermission("orealert.alert")) { + player.spigot().sendMessage(component); + } + } + + // Webhook + String globalWebhook = this.plugin.getConfig().getString("webhook", ""); + String webhook = this.plugin.getConfig().getString(String.format("blocks.%s.webhook", Lang.getMaterialKey(event.getMaterial())), globalWebhook); + if (!"".equals(webhook)) { + String embed = embed(event, message, ping, color.getColor()); + this.plugin.getServer().getScheduler().runTaskAsynchronously(this.plugin, () -> { + try { + sendWebhook(webhook, embed); + } catch (Exception e) { + this.plugin.log(String.format("Could not send webhook: %s", e.getMessage())); + } + }); + } + } + + private String embed(BlockEvent event, String message, boolean ping, Color color) { + JsonObject json = new JsonObject(); + if (ping) { + json.addProperty("content", "@here"); + } + JsonArray embeds = new JsonArray(); + + JsonObject embed = new JsonObject(); + embed.addProperty("color", color.getRGB()); + embed.addProperty("description", message); + + JsonObject author = new JsonObject(); + author.addProperty("name", event.getPlayer().getName()); + author.addProperty("icon_url", String.format("https://minotar.net/helm/%s/100.png", event.getPlayer().getName())); + embed.add("author", author); + + embeds.add(embed); + json.add("embeds", embeds); + + return json.toString(); + } + + private void sendWebhook(String webhook, String embed) throws Exception { + URL url = new URL(webhook); + URLConnection con = url.openConnection(); + HttpURLConnection http = (HttpURLConnection) con; + http.setRequestMethod("POST"); + http.setDoOutput(true); + + byte[] out = embed.getBytes(StandardCharsets.UTF_8); + int length = out.length; + http.setFixedLengthStreamingMode(length); + http.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); + http.connect(); + + OutputStream os = http.getOutputStream(); + os.write(out); + } } class BlockEvent { private final Player player; - private final Block block; + private final Material material; private final Boolean parent; private final Date time; - BlockEvent(Player player, Block block, Boolean parent) { + BlockEvent(Player player, Material material, Boolean parent) { this.player = player; - this.block = block; + this.material = material; this.parent = parent; this.time = Calendar.getInstance().getTime(); } @@ -124,8 +211,8 @@ class BlockEvent { return player; } - public Block getBlock() { - return block; + public Material getMaterial() { + return material; } public Boolean isParent() {