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/TimingsCommand.java b/src/main/java/co/aikar/timings/TimingsCommand.java index 3132dc98d26c54c5e46162e53aaed195d7335c8d..58c99863043b16996f52479a503deb3bba83434c 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); + } 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); + } 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) || @@ -97,7 +101,9 @@ public class TimingsCommand extends BukkitCommand { "merged".equalsIgnoreCase(arg) || "separate".equalsIgnoreCase(arg) ) { - Timings.generateReport(sender); + TimingsReportListener listener = new TimingsReportListener(new ArrayList<>()); + listener.setOnDone(() -> new co.aikar.timings.event.TimingsGenerateReportEvent(sender, listener.getTimingsURL())); + Timings.generateReport(listener); } else { sender.sendMessage(text("Usage: " + this.usageMessage, NamedTextColor.RED)); } diff --git a/src/main/java/co/aikar/timings/TimingsReportListener.java b/src/main/java/co/aikar/timings/TimingsReportListener.java index 34f4c02c3bdbe571a7efb1f8c61d8924b0c81268..e00b5149b10310b3b2bf7c9fcab1bce3d0b5c50e 100644 --- a/src/main/java/co/aikar/timings/TimingsReportListener.java +++ b/src/main/java/co/aikar/timings/TimingsReportListener.java @@ -15,7 +15,7 @@ import java.util.List; @SuppressWarnings("WeakerAccess") public class TimingsReportListener implements net.kyori.adventure.audience.ForwardingAudience, MessageCommandSender { private final List senders; - private final Runnable onDone; + private Runnable onDone; private String timingsURL; public TimingsReportListener(@NotNull CommandSender senders) { @@ -35,6 +35,10 @@ public class TimingsReportListener implements net.kyori.adventure.audience.Forwa this.onDone = onDone; } + public void setOnDone(Runnable onDone) { + this.onDone = onDone; + } + @Nullable public String getTimingsURL() { return timingsURL; @@ -58,7 +62,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 +75,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..b25dc51f73a0c323dc1872c28c6d6bb7a103de57 --- /dev/null +++ b/src/main/java/co/aikar/timings/event/TimingsEvent.java @@ -0,0 +1,32 @@ +package co.aikar.timings.event; + +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) { + 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 + } + +}