From 6f29b43193d1dfd8b5b8b2f503683c40b796de3c Mon Sep 17 00:00:00 2001 From: Etzelia Date: Wed, 29 Jul 2020 12:31:54 -0500 Subject: [PATCH] Rename to MineAlert and add config helpers Signed-off-by: Etzelia --- README.md | 15 +++- pom.xml | 10 +-- .../{orealert => minealert}/Color.java | 2 +- .../etztech/{orealert => minealert}/Lang.java | 4 +- .../java/xyz/etztech/minealert/MineAlert.java | 60 ++++++++++++++ .../java/xyz/etztech/minealert/Webhook.java | 27 +++++++ .../commands/MainCommand.java | 24 +++--- .../listeners/BlockBreakListener.java | 80 ++++++++++--------- .../java/xyz/etztech/orealert/OreAlert.java | 30 ------- src/main/resources/config.yml | 56 +++++++------ src/main/resources/plugin.yml | 8 +- 11 files changed, 200 insertions(+), 116 deletions(-) rename src/main/java/xyz/etztech/{orealert => minealert}/Color.java (94%) rename src/main/java/xyz/etztech/{orealert => minealert}/Lang.java (93%) create mode 100644 src/main/java/xyz/etztech/minealert/MineAlert.java create mode 100644 src/main/java/xyz/etztech/minealert/Webhook.java rename src/main/java/xyz/etztech/{orealert => minealert}/commands/MainCommand.java (65%) rename src/main/java/xyz/etztech/{orealert => minealert}/listeners/BlockBreakListener.java (74%) delete mode 100644 src/main/java/xyz/etztech/orealert/OreAlert.java diff --git a/README.md b/README.md index d14b278..3fb80cb 100644 --- a/README.md +++ b/README.md @@ -1 +1,14 @@ -# OreAlert \ No newline at end of file +# MineAlert + +MineAlert is a plugin for monitoring events and alerting users. + +[Permissions and Commands](src/main/resources/plugin.yml) + +## OreAlert + +OreAlert monitors specific blocks and sends alerts when a player finds "too many" within a set timeframe. + +## GriefAlert + +TBA + diff --git a/pom.xml b/pom.xml index f5ae07c..ac64cf3 100644 --- a/pom.xml +++ b/pom.xml @@ -1,16 +1,16 @@ 4.0.0 xyz.etztech - OreAlert + MineAlert 0.0.1 jar - OreAlert + MineAlert Keep track of mining and alert if needed. - https://git.etztech.xyz/Minecraft/OreAlert + https://git.etztech.xyz/Minecraft/MineAlert @@ -23,7 +23,7 @@ EtzTech - xyz.etztech.orealert.OreAlert + xyz.etztech.minealert.MineAlert UTF-8 @@ -103,7 +103,7 @@ true lib/ - xyz.etztech.orealert.OreAlert + xyz.etztech.minealert.MineAlert diff --git a/src/main/java/xyz/etztech/orealert/Color.java b/src/main/java/xyz/etztech/minealert/Color.java similarity index 94% rename from src/main/java/xyz/etztech/orealert/Color.java rename to src/main/java/xyz/etztech/minealert/Color.java index 23e01e5..f901119 100644 --- a/src/main/java/xyz/etztech/orealert/Color.java +++ b/src/main/java/xyz/etztech/minealert/Color.java @@ -1,4 +1,4 @@ -package xyz.etztech.orealert; +package xyz.etztech.minealert; import net.md_5.bungee.api.ChatColor; diff --git a/src/main/java/xyz/etztech/orealert/Lang.java b/src/main/java/xyz/etztech/minealert/Lang.java similarity index 93% rename from src/main/java/xyz/etztech/orealert/Lang.java rename to src/main/java/xyz/etztech/minealert/Lang.java index e1e95fa..71f6cc4 100644 --- a/src/main/java/xyz/etztech/orealert/Lang.java +++ b/src/main/java/xyz/etztech/minealert/Lang.java @@ -1,4 +1,4 @@ -package xyz.etztech.orealert; +package xyz.etztech.minealert; import net.md_5.bungee.api.ChatColor; @@ -10,7 +10,7 @@ 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("MineAlert reloaded.", Color.INFO), ALERT("%s has found %d %s veins.", Color.DEFAULT); private final String message; diff --git a/src/main/java/xyz/etztech/minealert/MineAlert.java b/src/main/java/xyz/etztech/minealert/MineAlert.java new file mode 100644 index 0000000..fd47f97 --- /dev/null +++ b/src/main/java/xyz/etztech/minealert/MineAlert.java @@ -0,0 +1,60 @@ +package xyz.etztech.minealert; + + +import org.bukkit.plugin.java.JavaPlugin; +import xyz.etztech.minealert.commands.MainCommand; +import xyz.etztech.minealert.listeners.BlockBreakListener; + +import java.util.logging.Logger; + +public class MineAlert extends JavaPlugin { + + private final Logger log = Logger.getLogger( "Minecraft" ); + + public void onEnable() { + saveDefaultConfig(); + reloadConfig(); + + if (isEnabled()) { + new MainCommand(this); + new BlockBreakListener(this); + } + } + + public void log(String message) { + log.info( "[MineAlert]: " + message ); + } + + /** + * @param def The default if no paths resolve + * @param path Config paths to check, from specific -> fallback + * @return The resolved String value + */ + public String getConfigStringFallback(String def, String ...path) { + String fallback = ""; + for (String p : path) { + fallback = getConfig().getString(p, fallback); + if (!"".equals(fallback)) { + return fallback; + } + } + return def; + } + + /** + * @param def The default if no paths resolve + * @param path Config paths to check, from specific -> fallback + * @return The resolved Int value + */ + public int getConfigIntFallback(int def, String ...path) { + int fallback = 0; + for (String p : path) { + fallback = getConfig().getInt(p, fallback); + if (fallback != 0) { + return fallback; + } + } + return def; + } +} + diff --git a/src/main/java/xyz/etztech/minealert/Webhook.java b/src/main/java/xyz/etztech/minealert/Webhook.java new file mode 100644 index 0000000..5f36a1d --- /dev/null +++ b/src/main/java/xyz/etztech/minealert/Webhook.java @@ -0,0 +1,27 @@ +package xyz.etztech.minealert; + +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.StandardCharsets; + +public class Webhook { + + public static void send(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); + } +} diff --git a/src/main/java/xyz/etztech/orealert/commands/MainCommand.java b/src/main/java/xyz/etztech/minealert/commands/MainCommand.java similarity index 65% rename from src/main/java/xyz/etztech/orealert/commands/MainCommand.java rename to src/main/java/xyz/etztech/minealert/commands/MainCommand.java index 78dbe9e..866fb5a 100644 --- a/src/main/java/xyz/etztech/orealert/commands/MainCommand.java +++ b/src/main/java/xyz/etztech/minealert/commands/MainCommand.java @@ -1,4 +1,4 @@ -package xyz.etztech.orealert.commands; +package xyz.etztech.minealert.commands; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.ComponentBuilder; @@ -6,23 +6,23 @@ import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; -import xyz.etztech.orealert.Color; -import xyz.etztech.orealert.Lang; -import xyz.etztech.orealert.OreAlert; +import xyz.etztech.minealert.Color; +import xyz.etztech.minealert.Lang; +import xyz.etztech.minealert.MineAlert; public class MainCommand implements CommandExecutor { - OreAlert plugin; + MineAlert plugin; - public MainCommand(OreAlert plugin) { + public MainCommand(MineAlert plugin) { this.plugin = plugin; - this.plugin.getCommand("orealert").setExecutor(this); + this.plugin.getCommand("minealert").setExecutor(this); } @Override public boolean onCommand(CommandSender commandSender, Command command, String s, String[] args) { - if (!commandSender.hasPermission("orealert.admin")) { + if (!commandSender.hasPermission("minealert.admin")) { Lang.NO_PERMISSION.sms(commandSender); return true; } @@ -45,11 +45,11 @@ public class MainCommand implements CommandExecutor { } private void help(CommandSender commandSender) { - String version = Bukkit.getPluginManager().getPlugin("OreAlert").getDescription().getVersion(); + String version = Bukkit.getPluginManager().getPlugin("MineAlert").getDescription().getVersion(); BaseComponent[] message = new ComponentBuilder() - .append(String.format("===== OreAlert v%s =====", version)).color(Color.PRIMARY) - .append("\n/orealert help - Show this message").color(Color.INFO) - .append("\n/orealert reload - Reload the config").color(Color.INFO) + .append(String.format("===== MineAlert v%s =====", version)).color(Color.PRIMARY) + .append("\n/minealert help - Show this message").color(Color.INFO) + .append("\n/minealert reload - Reload the config").color(Color.INFO) .create(); commandSender.spigot().sendMessage(message); } diff --git a/src/main/java/xyz/etztech/orealert/listeners/BlockBreakListener.java b/src/main/java/xyz/etztech/minealert/listeners/BlockBreakListener.java similarity index 74% rename from src/main/java/xyz/etztech/orealert/listeners/BlockBreakListener.java rename to src/main/java/xyz/etztech/minealert/listeners/BlockBreakListener.java index 4846610..fb7f679 100644 --- a/src/main/java/xyz/etztech/orealert/listeners/BlockBreakListener.java +++ b/src/main/java/xyz/etztech/minealert/listeners/BlockBreakListener.java @@ -1,4 +1,4 @@ -package xyz.etztech.orealert.listeners; +package xyz.etztech.minealert.listeners; import com.google.gson.JsonArray; import com.google.gson.JsonObject; @@ -12,9 +12,10 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; -import xyz.etztech.orealert.Color; -import xyz.etztech.orealert.Lang; -import xyz.etztech.orealert.OreAlert; +import xyz.etztech.minealert.Color; +import xyz.etztech.minealert.Lang; +import xyz.etztech.minealert.MineAlert; +import xyz.etztech.minealert.Webhook; import java.io.OutputStream; import java.net.HttpURLConnection; @@ -26,23 +27,23 @@ import java.util.concurrent.ConcurrentLinkedQueue; public class BlockBreakListener implements Listener { - private final OreAlert plugin; + private final MineAlert plugin; private final Map> map = new HashMap<>(); private final Queue queue = new ConcurrentLinkedQueue<>(); - public BlockBreakListener(OreAlert plugin) { + public BlockBreakListener(MineAlert plugin) { this.plugin = plugin; this.plugin.getServer().getPluginManager().registerEvents(this, plugin); this.plugin.getServer().getScheduler().runTaskAsynchronously(this.plugin, this::task); this.plugin.getServer().getScheduler().runTaskTimerAsynchronously(this.plugin, this::cleanup, 0, - 20 * 60 * this.plugin.getConfig().getInt("cleanup", 5)); + 20 * 60 * this.plugin.getConfig().getInt("ore.cleanup", 5)); } @EventHandler public void onBlockBreak(BlockBreakEvent event) { queue.add(new BlockEvent(event.getPlayer(), event.getBlock().getType(), true)); - int radius = this.plugin.getConfig().getInt("radius", 3); + int radius = this.plugin.getConfig().getInt("ore.radius", 3); for (int x = -radius; x < radius; x++) { for (int y = -radius; y < radius; y++) { for (int z = -radius; z < radius; z++) { @@ -56,7 +57,7 @@ public class BlockBreakListener implements Listener { while (this.plugin.isEnabled()) { BlockEvent event = this.queue.poll(); if (event != null) { - for (String s: this.plugin.getConfig().getConfigurationSection("blocks").getKeys(false)) { + for (String s: this.plugin.getConfig().getConfigurationSection("ore.blocks").getKeys(false)) { if (Lang.getMaterialKey(event.getMaterial()).equals(s)) { addStrike(event); check(event); @@ -74,11 +75,22 @@ public class BlockBreakListener implements Listener { } private void check(BlockEvent event) { - FileConfiguration config = this.plugin.getConfig(); 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)); + int start = this.plugin.getConfigIntFallback( + 5, + String.format("ore.blocks.%s.start", blockKey), + "ore.start" + ); + int each = this.plugin.getConfigIntFallback( + 5, + String.format("ore.blocks.%s.each", blockKey), + "ore.each" + ); + int ping = this.plugin.getConfigIntFallback( + 5, + String.format("ore.blocks.%s.ping", blockKey), + "ore.ping" + ); purge(map.getOrDefault(event.getPlayer(), new ArrayList<>()).iterator()); int strikes = 0; @@ -112,10 +124,13 @@ public class BlockBreakListener implements Listener { private void purge(Iterator events) { Date now = Calendar.getInstance().getTime(); - 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.getMaterial())), globalPurge); + int purge = 1000 * 60 * this.plugin.getConfigIntFallback( + 30, + String.format("ore.blocks.%s.purge", Lang.getMaterialKey(e.getMaterial())), + "ore.purge" + ); if (new Date(e.getTime().getTime() + purge).before(now)) { events.remove(); } @@ -125,25 +140,33 @@ public class BlockBreakListener implements Listener { private void alert(BlockEvent event, int strikes, boolean ping) { String message = String.format(Lang.ALERT.getMessage(), event.getPlayer().getName(), strikes, Lang.getMaterialName(event.getMaterial())); - String hexColor = this.plugin.getConfig().getString(String.format("blocks.%s.color", Lang.getMaterialKey(event.getMaterial())), "#00ffff"); + String hexColor = this.plugin.getConfigStringFallback( + "#AAAAAA", + String.format("ore.blocks.%s.color", Lang.getMaterialKey(event.getMaterial())), + "ore.color" + ); BaseComponent[] component = new ComponentBuilder() .append(message).color(ChatColor.of(hexColor)) .create(); for (Player player : Bukkit.getOnlinePlayers()) { - if (player.hasPermission("orealert.alert")) { + if (player.hasPermission("minealert.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); + String webhook = this.plugin.getConfigStringFallback( + "", + String.format("ore.blocks.%s.webhook", Lang.getMaterialKey(event.getMaterial())), + "ore.webhook", + "webhook" + ); if (!"".equals(webhook)) { String embed = embed(event, message, ping, hexColor); this.plugin.getServer().getScheduler().runTaskAsynchronously(this.plugin, () -> { try { - sendWebhook(webhook, embed); + Webhook.send(webhook, embed); } catch (Exception e) { this.plugin.log(String.format("Could not send webhook: %s", e.getMessage())); } @@ -172,23 +195,6 @@ public class BlockBreakListener implements Listener { 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 { diff --git a/src/main/java/xyz/etztech/orealert/OreAlert.java b/src/main/java/xyz/etztech/orealert/OreAlert.java deleted file mode 100644 index a3a69d7..0000000 --- a/src/main/java/xyz/etztech/orealert/OreAlert.java +++ /dev/null @@ -1,30 +0,0 @@ -package xyz.etztech.orealert; - - -import org.bukkit.Bukkit; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.plugin.java.JavaPlugin; -import xyz.etztech.orealert.commands.MainCommand; -import xyz.etztech.orealert.listeners.BlockBreakListener; - -import java.util.logging.Logger; - -public class OreAlert extends JavaPlugin { - - private final Logger log = Logger.getLogger( "Minecraft" ); - - public void onEnable() { - saveDefaultConfig(); - reloadConfig(); - - if (isEnabled()) { - new MainCommand(this); - new BlockBreakListener(this); - } - } - - public void log(String message) { - log.info( "[OreAlert]: " + message ); - } -} - diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 456f968..e3d463f 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,26 +1,34 @@ -# Radius to search around block for similar blocks in the "vein" -radius: 3 -# How often to run cleanup task (in minutes) -cleanup: 5 - -# Global notification settings, for less arthritis -# How long until we purge a node strike (in minutes) -purge: 30 -# How many veins found within the above purge minutes to notify -start: 5 -# After the initial alert, how many should be found in addition before more alerts? -each: 1 -# After the initial alert, how many should be found in addition before more pings? -ping: 5 -# Discord webhook +# Global Discord webhook +# This can be set as a global fallback webhook: '' -# Only blocks listed here will be monitored -# Each of the above notify settings can be overridden per-block if needed -# Anything not overridden will default to the global setting -blocks: - diamond_ore: - color: '#b9f2ff' - ancient_debris: - color: '#933A16' - purge: 45 \ No newline at end of file +# OreAlert +ore: + # Radius to search around block for similar blocks in the "vein" + radius: 3 + # How often to run cleanup task (in minutes) + cleanup: 5 + + # Default notification settings, for less arthritis + # The color to use in chat and webhook alerts + color: '#AAAAAA' + # How long until we purge a node strike (in minutes) + purge: 30 + # How many veins found within the above purge minutes to notify + start: 5 + # After the initial alert, how many should be found in addition before more alerts? + each: 1 + # After the initial alert, how many should be found in addition before more pings? + ping: 5 + # Discord webhook + webhook: '' + + # Only blocks listed here will be monitored + # Each of the above notify settings can be overridden per-block if needed + # Anything not overridden will use the default setting + blocks: + diamond_ore: + color: '#B9F2FF' + ancient_debris: + color: '#933A16' + purge: 45 \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index c08abcb..e5c417d 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -6,13 +6,13 @@ website: ${url} main: ${mainClass} api-version: 1.16 commands: - orealert: - aliases: oa + minealert: + aliases: ma description: Base command permissions: - orealert.admin: + minealert.admin: description: Ability to reload the plugin default: op - orealert.alert: + minealert.alert: description: Get alerts default: op