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 9812d668ad945aba486fbf6d5bf83c4292cb5d03..16198861748b29c537527151216e79c7c32e7204 100644 --- a/src/main/java/co/aikar/timings/Timings.java +++ b/src/main/java/co/aikar/timings/Timings.java @@ -145,8 +145,27 @@ public final class Timings { * @param enabled Should timings be reported */ public static void setTimingsEnabled(boolean enabled) { + // Parchment start + setTimingsEnabled(enabled, null); + } + + /** + *

Sets whether or not the Spigot Timings system should be enabled

+ * + * Calls a {@link co.aikar.timings.event.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; warnAboutDeprecationOnEnable(); + if (sender != null) { + if (!new co.aikar.timings.event.TimingsModifyEvent(sender, co.aikar.timings.event.TimingsModifyEvent.Action.RESET).callEvent()) { + return; + } + } + // Parchment end reset(); } diff --git a/src/main/java/co/aikar/timings/TimingsCommand.java b/src/main/java/co/aikar/timings/TimingsCommand.java index e801e79fa57c44b2e5d359647c920f88064826f1..012d2281c386d2e5f5a655079c0cbfa4545d6476 100644 --- a/src/main/java/co/aikar/timings/TimingsCommand.java +++ b/src/main/java/co/aikar/timings/TimingsCommand.java @@ -63,10 +63,12 @@ public class TimingsCommand extends BukkitCommand { } final String arg = args[0]; if ("on".equalsIgnoreCase(arg)) { - Timings.setTimingsEnabled(true); + if (!new co.aikar.timings.event.TimingsModifyEvent(sender, co.aikar.timings.event.TimingsModifyEvent.Action.ENABLE).callEvent()) return true; // Parchment + Timings.setTimingsEnabled(true, sender); sender.sendMessage(text("Enabled Timings & Reset")); return true; } else if ("off".equalsIgnoreCase(arg)) { + if (!new co.aikar.timings.event.TimingsModifyEvent(sender, co.aikar.timings.event.TimingsModifyEvent.Action.DISABLE).callEvent()) return true; // Parchment Timings.setTimingsEnabled(false); sender.sendMessage(text("Disabled Timings")); return true; @@ -79,15 +81,18 @@ public class TimingsCommand extends BukkitCommand { long now = System.currentTimeMillis(); if ("verbon".equalsIgnoreCase(arg)) { + if (!new co.aikar.timings.event.TimingsModifyEvent(sender, co.aikar.timings.event.TimingsModifyEvent.Action.VERBOSE_ON).callEvent()) return true; // Parchment Timings.setVerboseTimingsEnabled(true); sender.sendMessage(text("Enabled Verbose Timings")); return true; } else if ("verboff".equalsIgnoreCase(arg)) { + if (!new co.aikar.timings.event.TimingsModifyEvent(sender, co.aikar.timings.event.TimingsModifyEvent.Action.VERBOSE_OFF).callEvent()) return true; // Parchment Timings.setVerboseTimingsEnabled(false); sender.sendMessage(text("Disabled Verbose Timings")); return true; } else if ("reset".equalsIgnoreCase(arg)) { if (now - lastResetAttempt < 30000) { + if (!new co.aikar.timings.event.TimingsModifyEvent(sender, co.aikar.timings.event.TimingsModifyEvent.Action.RESET).callEvent()) return true; // Parchment TimingsManager.reset(); sender.sendMessage(text("Timings reset. Please wait 5-10 minutes before using /timings report.", NamedTextColor.RED)); } else { diff --git a/src/main/java/co/aikar/timings/TimingsReportListener.java b/src/main/java/co/aikar/timings/TimingsReportListener.java index 3af5b8ea795311582044c712de50d29412024b77..806a1e528aae9a26413b483855130bef78ca72fb 100644 --- a/src/main/java/co/aikar/timings/TimingsReportListener.java +++ b/src/main/java/co/aikar/timings/TimingsReportListener.java @@ -59,6 +59,7 @@ 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) { + if (!new co.aikar.timings.event.TimingsMessageEvent(this.senders, message).callEvent()) return; // Parchment net.kyori.adventure.audience.ForwardingAudience.super.sendMessage(source, message, type); } @@ -70,6 +71,7 @@ public class TimingsReportListener implements net.kyori.adventure.audience.Forwa @Override public void sendMessage(@NotNull String message) { + if (!new co.aikar.timings.event.TimingsMessageEvent(this.senders, net.kyori.adventure.text.Component.text(message)).callEvent()) return; // Parchment senders.forEach((sender) -> sender.sendMessage(message)); } 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..9ad67d72e6173d1629f862ca9fd13475950709f0 --- /dev/null +++ b/src/main/java/co/aikar/timings/event/TimingsEvent.java @@ -0,0 +1,36 @@ +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.Collection; +import java.util.HashSet; +import java.util.Set; + +public abstract class TimingsEvent extends Event { + + private final @NotNull Set audience; + private static final HandlerList handlers = new HandlerList(); + + public TimingsEvent(@NotNull Collection audience) { + super(!Bukkit.isPrimaryThread()); + this.audience = new HashSet<>(audience); + } + + public @NotNull Set getAudience() { + return this.audience; + } + + @Override + public @NotNull HandlerList getHandlers() { + return handlers; + } + + public static @NotNull 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..33152129508c526031eee68f2ae797563d97be0c --- /dev/null +++ b/src/main/java/co/aikar/timings/event/TimingsGenerateReportEvent.java @@ -0,0 +1,20 @@ +package co.aikar.timings.event; + +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; + +public class TimingsGenerateReportEvent extends TimingsEvent { + + private final @NotNull String paste; + + public TimingsGenerateReportEvent(@NotNull CommandSender sender, @NotNull String paste) { + super(Collections.singleton(sender)); + this.paste = paste; + } + + public @NotNull 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..626f25e164c6b23481c5a976a6e184e739104305 --- /dev/null +++ b/src/main/java/co/aikar/timings/event/TimingsMessageEvent.java @@ -0,0 +1,35 @@ +package co.aikar.timings.event; + +import net.kyori.adventure.text.Component; +import org.bukkit.command.CommandSender; +import org.bukkit.event.Cancellable; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.HashSet; +import java.util.List; + +public class TimingsMessageEvent extends TimingsEvent implements Cancellable { + + public @NotNull Component message; + private boolean cancelled; + + public TimingsMessageEvent(@NotNull Collection senders, @NotNull Component message) { + super(new HashSet<>(senders)); + this.message = message; + } + + public @NotNull 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..3faf845716d5d3adf360949f28a5e12aa7e20aa6 --- /dev/null +++ b/src/main/java/co/aikar/timings/event/TimingsModifyEvent.java @@ -0,0 +1,41 @@ +package co.aikar.timings.event; + +import org.bukkit.command.CommandSender; +import org.bukkit.event.Cancellable; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; + +public class TimingsModifyEvent extends TimingsEvent implements Cancellable { + + private final @NotNull Action action; + private boolean cancelled = false; + + public TimingsModifyEvent(@NotNull CommandSender sender, @NotNull Action action) { + super(Collections.singleton(sender)); + this.action = action; + } + + public @NotNull 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 + } + +}