From bc339caad6e7eb4e750e398d766e5a6cb3ff0faf Mon Sep 17 00:00:00 2001 From: Joey Hines Date: Sun, 6 Dec 2020 17:43:42 -0600 Subject: [PATCH] Added location information to webhooks + Added `World` and `Location` fields + Player Alert URLs can have fields for locations --- .../java/xyz/etztech/minealert/MineAlert.java | 75 +++++++++++++++++++ .../listeners/GriefAlertListener.java | 24 +----- .../minealert/listeners/OreAlertListener.java | 32 ++------ 3 files changed, 84 insertions(+), 47 deletions(-) diff --git a/src/main/java/xyz/etztech/minealert/MineAlert.java b/src/main/java/xyz/etztech/minealert/MineAlert.java index 9cb8ce1..66297dd 100644 --- a/src/main/java/xyz/etztech/minealert/MineAlert.java +++ b/src/main/java/xyz/etztech/minealert/MineAlert.java @@ -1,13 +1,20 @@ package xyz.etztech.minealert; +import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; +import xyz.etztech.Javacord; +import xyz.etztech.Webhook; +import xyz.etztech.embed.Author; +import xyz.etztech.embed.Embed; +import xyz.etztech.embed.Field; import xyz.etztech.minealert.commands.AlertMute; import xyz.etztech.minealert.commands.MainCommand; import xyz.etztech.minealert.listeners.GriefAlertListener; import xyz.etztech.minealert.listeners.OreAlertListener; +import java.time.OffsetDateTime; import java.util.logging.Logger; public class MineAlert extends JavaPlugin { @@ -68,8 +75,76 @@ public class MineAlert extends JavaPlugin { return def; } + /** + * @param player Player to check + * @param muteType Type of alert to check fo + * @return True if the player ignores the alert, false otherwise + */ static public Boolean hasIgnoreAlertPerm(Player player, MuteType muteType) { return player.hasPermission("minealert.ignore") || player.hasPermission(muteType.getMetadataValue()); } + + /** + * @param baseURL Template URL string + * @param player Player that generated the alert + * @param location Location of the alert + * @return Formatted alert URL + */ + static public String formatAlertURL(String baseURL, Player player, Location location) { + return baseURL.replaceAll("\\{username}", player.getName()) + .replaceAll("\\{x}", String.valueOf(location.getBlockX())) + .replaceAll("\\{y}", String.valueOf(location.getBlockY())) + .replaceAll("\\{z}", String.valueOf(location.getBlockZ())) + .replaceAll("\\{world_name}", location.getWorld().getName()); + } + + /** + * @param location Location to format + * @return Location string + */ + static public String formattedLocation(Location location) { + return String.format("%d %d %d", location.getBlockX(), location.getBlockY(), location.getBlockZ()); + } + + /** + * @param color Color of the embed + * @param player Player the alert is for + * @param location Location of the alert + * @param message Alert message + * @param baseURL Template url + * @return Alert Embed + */ + static public Embed buildAlertEmbed(Color color, Player player, Location location, String message, String baseURL) { + String usernameURL = formatAlertURL(baseURL, player, location); + return new Embed() + .color(color.getInt()) + .description(Javacord.escapeFormat(message)) + .timestamp(OffsetDateTime.now()) + .author(new Author(player.getName(), + !"".equals(usernameURL) ? usernameURL : "", + String.format("https://minotar.net/helm/%s/100.png", player.getName()), + "")) + .addField(new Field("Location", String.format("`%s`", MineAlert.formattedLocation(location)))) + .addField(new Field("World", String.format("`%s`", location.getWorld().getName()))); + } + + /** + * @param webhookURL URL to send the webhook to + * @param color Color of the embed + * @param player Player the alert is for + * @param location Location of the alert + * @param message Alert message + * @param baseURL Template url + */ + public void sendWebhook(String webhookURL, Color color, Player player, Location location, String message, String baseURL) { + this.getServer().getScheduler().runTaskAsynchronously(this, () -> { + Embed embed = buildAlertEmbed(color, player, location, message, baseURL); + try { + Javacord.sendWebhook(webhookURL, new Webhook("@here", embed)); + } catch (Exception e) { + this.log(Lang.WEBHOOK_FAILED.getMessage()); + } + }); + } } diff --git a/src/main/java/xyz/etztech/minealert/listeners/GriefAlertListener.java b/src/main/java/xyz/etztech/minealert/listeners/GriefAlertListener.java index ce72db7..b1826e3 100644 --- a/src/main/java/xyz/etztech/minealert/listeners/GriefAlertListener.java +++ b/src/main/java/xyz/etztech/minealert/listeners/GriefAlertListener.java @@ -1,6 +1,5 @@ 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; @@ -13,16 +12,11 @@ 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 xyz.etztech.minealert.MuteType; -import java.time.OffsetDateTime; import java.util.*; public class GriefAlertListener implements Listener { @@ -85,7 +79,7 @@ public class GriefAlertListener implements Listener { "", "grief.url", "url" - ).replaceAll("\\{username}", playerName); + ); int threshold = this.plugin.getConfig().getInt("grief.threshold", 5); if (dates.size() <= threshold) { @@ -99,21 +93,7 @@ public class GriefAlertListener implements Listener { ); if (!"".equals(webhook)) { extra.append(" and pinging Discord"); - Embed embed = new Embed() - .color(color.getInt()) - .description(Javacord.escapeFormat(alert)) - .timestamp(OffsetDateTime.now()) - .author(new Author(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()); - } - }); + this.plugin.sendWebhook(webhook, color, player, eventLocation, alert, usernameURL); } extra.append("..."); } diff --git a/src/main/java/xyz/etztech/minealert/listeners/OreAlertListener.java b/src/main/java/xyz/etztech/minealert/listeners/OreAlertListener.java index 6cc24a9..63acdce 100644 --- a/src/main/java/xyz/etztech/minealert/listeners/OreAlertListener.java +++ b/src/main/java/xyz/etztech/minealert/listeners/OreAlertListener.java @@ -1,6 +1,5 @@ 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; @@ -14,16 +13,11 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; -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 xyz.etztech.minealert.MuteType; -import java.time.OffsetDateTime; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; @@ -198,20 +192,22 @@ public class OreAlertListener implements Listener { private void sendAlert(BlockEvent event, int strikes, boolean ping) { String message = Lang.ORE_ALERT.getMessage(event.getPlayer().getName(), strikes, Lang.getMaterialName(event.getMaterial())); - String hexColor = this.plugin.getConfigStringFallback( + Color color = new Color(plugin.getConfigStringFallback( "#AAAAAA", String.format("ore.blocks.%s.color", Lang.getMaterialKey(event.getMaterial())), "ore.color" - ); + )); String usernameURL = this.plugin.getConfigStringFallback( "", String.format("ore.blocks.%s.url", Lang.getMaterialKey(event.getMaterial())), "ore.url", "url" - ).replaceAll("\\{username}", event.getPlayer().getName()); + ); + + usernameURL = MineAlert.formatAlertURL(usernameURL, event.getPlayer(), event.getLocation()); ComponentBuilder builder = new ComponentBuilder() - .append(message).color(ChatColor.of(hexColor)); + .append(message).color(color.getChatColor()); if (!"".equals(usernameURL)) { builder.event(new ClickEvent(ClickEvent.Action.OPEN_URL, usernameURL)); } @@ -230,21 +226,7 @@ public class OreAlertListener implements Listener { "webhook" ); if (!"".equals(webhook)) { - Embed embed = new Embed() - .color(Color.hexToInt(hexColor)) - .description(Javacord.escapeFormat(message)) - .timestamp(OffsetDateTime.now()) - .author(new Author(event.getPlayer().getName(), - !"".equals(usernameURL) ? usernameURL : "", - String.format("https://minotar.net/helm/%s/100.png", event.getPlayer().getName()), - "")); - this.plugin.getServer().getScheduler().runTaskAsynchronously(this.plugin, () -> { - try { - Javacord.sendWebhook(webhook, new Webhook(ping ? "@here" : "", embed)); - } catch (Exception e) { - this.plugin.log(Lang.WEBHOOK_FAILED.getMessage()); - } - }); + this.plugin.sendWebhook(webhook, color, event.getPlayer(), event.getLocation(), message, usernameURL); } }