From c423c58f41f0ea721effffcdb7d745f951fad9c2 Mon Sep 17 00:00:00 2001 From: cattyn Date: Sat, 15 Nov 2025 02:05:47 +0300 Subject: [PATCH] feat(EventBus): add event priority --- .../alpha432/oyvey/event/system/EventBus.java | 27 ++++++++++++++----- .../alpha432/oyvey/event/system/Listener.java | 6 ++--- .../oyvey/event/system/Subscribe.java | 1 + 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/main/java/me/alpha432/oyvey/event/system/EventBus.java b/src/main/java/me/alpha432/oyvey/event/system/EventBus.java index 50b7b99..d5304dd 100644 --- a/src/main/java/me/alpha432/oyvey/event/system/EventBus.java +++ b/src/main/java/me/alpha432/oyvey/event/system/EventBus.java @@ -13,14 +13,18 @@ public class EventBus { public void register(Object host) { for (Method method : host.getClass().getDeclaredMethods()) { - if (method.isAnnotationPresent(Subscribe.class)) { - Class[] params = method.getParameterTypes(); - if (params.length == 1) { - Class eventType = params[0]; + Subscribe subscribe = method.getAnnotation(Subscribe.class); + if (subscribe == null) continue; - listeners.computeIfAbsent(eventType, k -> new CopyOnWriteArrayList<>()) - .add(Listener.of(host, method)); - } + Class[] params = method.getParameterTypes(); + if (params.length == 1) { + Class eventType = params[0]; + + Listener listener = Listener.of(host, subscribe.priority(), method); + List registry = listeners.computeIfAbsent(eventType, + k -> new CopyOnWriteArrayList<>()); + + register(registry, listener); } } } @@ -40,4 +44,13 @@ public class EventBus { listener.invoke(event); } } + + private void register(List registry, Listener target) { + int i = 0; + for (Listener listener : registry) { + i++; + if (target.priority() > listener.priority()) break; + } + registry.add(i, target); + } } \ No newline at end of file diff --git a/src/main/java/me/alpha432/oyvey/event/system/Listener.java b/src/main/java/me/alpha432/oyvey/event/system/Listener.java index d655b07..85d2304 100644 --- a/src/main/java/me/alpha432/oyvey/event/system/Listener.java +++ b/src/main/java/me/alpha432/oyvey/event/system/Listener.java @@ -4,9 +4,9 @@ import java.lang.invoke.*; import java.lang.reflect.Method; import java.util.function.Consumer; -public record Listener(Object host, Consumer consumer) { - public static Listener of(Object host, Method method) { - return new Listener(host, buildLambdaMetafactory(host, method)); +public record Listener(Object host, int priority, Consumer consumer) { + public static Listener of(Object host, int priority, Method method) { + return new Listener(host, priority, buildLambdaMetafactory(host, method)); } public void invoke(Object event) { diff --git a/src/main/java/me/alpha432/oyvey/event/system/Subscribe.java b/src/main/java/me/alpha432/oyvey/event/system/Subscribe.java index b8b36c2..241042d 100644 --- a/src/main/java/me/alpha432/oyvey/event/system/Subscribe.java +++ b/src/main/java/me/alpha432/oyvey/event/system/Subscribe.java @@ -8,5 +8,6 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Subscribe { + int priority() default 0; }