From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Blast-MC Date: Mon, 18 Jul 2022 20:15:42 -0400 Subject: [PATCH] Add Timings Events diff --git a/src/main/java/co/aikar/timings/Timings.java b/src/main/java/co/aikar/timings/Timings.java index dd72a34eaa4bedd9ea0b92eaa79091b00eb4dd09..90f8f7a0996cf1a6f6b3e9eef0243b2d629a1214 100644 --- a/src/main/java/co/aikar/timings/Timings.java +++ b/src/main/java/co/aikar/timings/Timings.java @@ -23,6 +23,8 @@ */ package co.aikar.timings; +import co.aikar.timings.event.TimingsModifyEvent; +import co.aikar.timings.event.TimingsModifyEvent.Action; import com.google.common.base.Preconditions; import com.google.common.collect.EvictingQueue; import com.google.common.collect.Lists; @@ -135,7 +137,24 @@ public final class Timings { * @param enabled Should timings be reported */ public static void setTimingsEnabled(boolean enabled) { + setTimingsEnabled(enabled, null); + } + + /** + *

Sets whether or not the Spigot Timings system should be enabled

+ * + * Calls a {@link TimingsModifyEvent}, if cancelled the timings will not be reset + * + * @param enabled Should timings be reported + * @param sender The sender asking to reset + */ + public static void setTimingsEnabled(boolean enabled, CommandSender sender) { timingsEnabled = enabled; + if (sender != null) { + if (!new co.aikar.timings.event.TimingsModifyEvent(sender, Action.RESET).callEvent()) { + return; + } + } reset(); } diff --git a/src/main/java/co/aikar/timings/TimingsCommand.java b/src/main/java/co/aikar/timings/TimingsCommand.java index 3132dc98d26c54c5e46162e53aaed195d7335c8d..f44ec5789bc98d5558eee6cff39770b4192c3e3c 100644 --- a/src/main/java/co/aikar/timings/TimingsCommand.java +++ b/src/main/java/co/aikar/timings/TimingsCommand.java @@ -59,12 +59,14 @@ public class TimingsCommand extends BukkitCommand { } final String arg = args[0]; if ("on".equalsIgnoreCase(arg)) { - Timings.setTimingsEnabled(true); - sender.sendMessage(text("Enabled Timings & Reset")); + if (new co.aikar.timings.event.TimingsModifyEvent(sender, co.aikar.timings.event.TimingsModifyEvent.Action.ENABLE).callEvent()) { + Timings.setTimingsEnabled(true, sender); + } return true; } else if ("off".equalsIgnoreCase(arg)) { - Timings.setTimingsEnabled(false); - sender.sendMessage(text("Disabled Timings")); + if (new co.aikar.timings.event.TimingsModifyEvent(sender, co.aikar.timings.event.TimingsModifyEvent.Action.DISABLE).callEvent()) { + Timings.setTimingsEnabled(false, sender); + } return true; } @@ -75,20 +77,22 @@ public class TimingsCommand extends BukkitCommand { long now = System.currentTimeMillis(); if ("verbon".equalsIgnoreCase(arg)) { - Timings.setVerboseTimingsEnabled(true); - sender.sendMessage(text("Enabled Verbose Timings")); + if (new co.aikar.timings.event.TimingsModifyEvent(sender, co.aikar.timings.event.TimingsModifyEvent.Action.VERBOSE_ON).callEvent()) { + Timings.setVerboseTimingsEnabled(true); + } return true; } else if ("verboff".equalsIgnoreCase(arg)) { - Timings.setVerboseTimingsEnabled(false); - sender.sendMessage(text("Disabled Verbose Timings")); + if (new co.aikar.timings.event.TimingsModifyEvent(sender, co.aikar.timings.event.TimingsModifyEvent.Action.VERBOSE_OFF).callEvent()) { + Timings.setVerboseTimingsEnabled(false); + } return true; } else if ("reset".equalsIgnoreCase(arg)) { if (now - lastResetAttempt < 30000) { - TimingsManager.reset(); - sender.sendMessage(text("Timings reset. Please wait 5-10 minutes before using /timings report.", NamedTextColor.RED)); + if (new co.aikar.timings.event.TimingsModifyEvent(sender, co.aikar.timings.event.TimingsModifyEvent.Action.RESET).callEvent()) { + TimingsManager.reset(); + } } else { lastResetAttempt = now; - sender.sendMessage(text("WARNING: Timings v2 should not be reset. If you are experiencing lag, please wait 3 minutes and then issue a report. The best timings will include 10+ minutes, with data before and after your lag period. If you really want to reset, run this command again within 30 seconds.", NamedTextColor.RED)); } } else if ( "paste".equalsIgnoreCase(arg) || diff --git a/src/main/java/co/aikar/timings/TimingsReportListener.java b/src/main/java/co/aikar/timings/TimingsReportListener.java index 34f4c02c3bdbe571a7efb1f8c61d8924b0c81268..093c1bc755061dc6f54e5dce1ef68fd027fc43a6 100644 --- a/src/main/java/co/aikar/timings/TimingsReportListener.java +++ b/src/main/java/co/aikar/timings/TimingsReportListener.java @@ -58,7 +58,9 @@ public class TimingsReportListener implements net.kyori.adventure.audience.Forwa @Override public void sendMessage(final @NotNull net.kyori.adventure.identity.Identity source, final @NotNull net.kyori.adventure.text.Component message, final @NotNull net.kyori.adventure.audience.MessageType type) { - net.kyori.adventure.audience.ForwardingAudience.super.sendMessage(source, message, type); + if (new co.aikar.timings.event.TimingsMessageEvent(this.senders, message).callEvent()) { + net.kyori.adventure.audience.ForwardingAudience.super.sendMessage(source, message, type); + } } @NotNull @@ -69,7 +71,9 @@ public class TimingsReportListener implements net.kyori.adventure.audience.Forwa @Override public void sendMessage(@NotNull String message) { - senders.forEach((sender) -> sender.sendMessage(message)); + if (new co.aikar.timings.event.TimingsMessageEvent(this.senders, net.kyori.adventure.text.Component.text(message)).callEvent()) { + senders.forEach((sender) -> sender.sendMessage(message)); + } } public void addConsoleIfNeeded() { diff --git a/src/main/java/co/aikar/timings/event/TimingsEvent.java b/src/main/java/co/aikar/timings/event/TimingsEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..df78c90859999ec18c7b8758e0f1c71281e1abe4 --- /dev/null +++ b/src/main/java/co/aikar/timings/event/TimingsEvent.java @@ -0,0 +1,34 @@ +package co.aikar.timings.event; + +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +import java.util.Set; + +public abstract class TimingsEvent extends Event { + + private final Set audience; + private static final HandlerList handlers = new HandlerList(); + + public TimingsEvent(Set audience) { + super(!Bukkit.isPrimaryThread()); + this.audience = audience; + } + + public Set getAudience() { + return this.audience; + } + + @Override + public @NotNull HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } + +} diff --git a/src/main/java/co/aikar/timings/event/TimingsGenerateReportEvent.java b/src/main/java/co/aikar/timings/event/TimingsGenerateReportEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..5ed7d1d4972842e93e2a9c2ffa799e6fc9136e63 --- /dev/null +++ b/src/main/java/co/aikar/timings/event/TimingsGenerateReportEvent.java @@ -0,0 +1,19 @@ +package co.aikar.timings.event; + +import org.bukkit.command.CommandSender; + +import java.util.Collections; + +public class TimingsGenerateReportEvent extends TimingsEvent { + + private final String paste; + + public TimingsGenerateReportEvent(CommandSender sender, String paste) { + super(Collections.singleton(sender)); + this.paste = paste; + } + + public String getPaste() { + return this.paste; + } +} diff --git a/src/main/java/co/aikar/timings/event/TimingsMessageEvent.java b/src/main/java/co/aikar/timings/event/TimingsMessageEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..04ec925cfa9e385e8ad4763b18570b7bf07c4007 --- /dev/null +++ b/src/main/java/co/aikar/timings/event/TimingsMessageEvent.java @@ -0,0 +1,33 @@ +package co.aikar.timings.event; + +import net.kyori.adventure.text.Component; +import org.bukkit.command.CommandSender; +import org.bukkit.event.Cancellable; + +import java.util.HashSet; +import java.util.List; + +public class TimingsMessageEvent extends TimingsEvent implements Cancellable { + + public Component message; + private boolean cancelled; + + public TimingsMessageEvent(List senders, Component message) { + super(new HashSet<>(senders)); + this.message = message; + } + + public Component getMessage() { + return this.message; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } +} diff --git a/src/main/java/co/aikar/timings/event/TimingsModifyEvent.java b/src/main/java/co/aikar/timings/event/TimingsModifyEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..1fe9bbedf23fdf7b02de02f5d184d8d956c7056b --- /dev/null +++ b/src/main/java/co/aikar/timings/event/TimingsModifyEvent.java @@ -0,0 +1,40 @@ +package co.aikar.timings.event; + +import org.bukkit.command.CommandSender; +import org.bukkit.event.Cancellable; + +import java.util.Collections; + +public class TimingsModifyEvent extends TimingsEvent implements Cancellable { + + private final Action action; + private boolean cancelled = false; + + public TimingsModifyEvent(CommandSender sender, Action action) { + super(Collections.singleton(sender)); + this.action = action; + } + + public Action getAction() { + return this.action; + } + + @Override + public boolean isCancelled() { + return this.cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } + + public enum Action { + ENABLE, + DISABLE, + RESET, + VERBOSE_ON, + VERBOSE_OFF + } + +}