275 lines
10 KiB
Diff
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
|
|
+ }
|
|
+
|
|
+}
|