Files
ParchmentMC/patches/api/0012-Add-Timings-Events.patch
2023-04-07 14:53:06 -04:00

275 lines
10 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Blast-MC <cjblanton2@gmail.com>
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..91429282ed8f30abbb969b426b34826c6e28b75d 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;
@@ -145,8 +147,25 @@ public final class Timings {
* @param enabled Should timings be reported
*/
public static void setTimingsEnabled(boolean enabled) {
+ setTimingsEnabled(enabled, null);
+ }
+
+ /**
+ * <p>Sets whether or not the Spigot Timings system should be enabled</p>
+ *
+ * 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;
warnAboutDeprecationOnEnable();
+ 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 e801e79fa57c44b2e5d359647c920f88064826f1..0cbb970c42c3a71602ccd311a13e1f874067e2ae 100644
--- a/src/main/java/co/aikar/timings/TimingsCommand.java
+++ b/src/main/java/co/aikar/timings/TimingsCommand.java
@@ -63,12 +63,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;
}
@@ -79,20 +81,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 3af5b8ea795311582044c712de50d29412024b77..b509aa8d2b05e913277713308e2eea46e631a5df 100644
--- a/src/main/java/co/aikar/timings/TimingsReportListener.java
+++ b/src/main/java/co/aikar/timings/TimingsReportListener.java
@@ -59,7 +59,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
@@ -70,7 +72,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<CommandSender> audience;
+ private static final HandlerList handlers = new HandlerList();
+
+ public TimingsEvent(Set<CommandSender> audience) {
+ super(!Bukkit.isPrimaryThread());
+ this.audience = audience;
+ }
+
+ public Set<CommandSender> 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<CommandSender> 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
+ }
+
+}