onEvent(Class eventClass, Consumer action) {
+ this.listener = GlobalEventBus.subscribeAndRegister(eventClass, event -> {
+ action.accept(eventClass.cast(event));
+
+ if (unregisterAfterSuccess && listener != null) {
+ GlobalEventBus.unregister(listener);
+ }
+ });
+ return this;
+ }
+
+ /**
+ * Subscribes a listener for events without requiring the event class explicitly.
+ * The listener will attempt to cast each posted event to the expected type.
+ * If the cast fails, the event is ignored silently.
+ *
+ * This overload provides more concise syntax, but relies on an unchecked cast
+ * at runtime. Use {@link #onEvent(Class, Consumer)} if you prefer explicit
+ * type safety.
+ *
+ * {@code
+ * new EventPublisher<>(MyEvent.class)
+ * .onEvent((MyEvent e) -> logger.info("Received: " + e))
+ * .postEvent();
+ * }
+ *
+ * @param action the action to execute when a matching event is received
+ * @param the type of the event to subscribe to
+ * @return this EventPublisher instance, for chainable calls
+ */
+ @SuppressWarnings("unchecked")
+ public EventPublisher onEvent(Consumer action) {
+ this.listener = GlobalEventBus.subscribeAndRegister(event -> {
+ try {
+ // unchecked cast – if wrong type, ClassCastException is caught
+ TT typedEvent = (TT) event;
+ action.accept(typedEvent);
+
+ if (unregisterAfterSuccess && listener != null) {
+ GlobalEventBus.unregister(listener);
+ }
+ } catch (ClassCastException ignored) {
+ // Ignore events of unrelated types
+ }
+ });
+ return this;
+ }
+
/**
* Posts the event to the global event bus. This should generally be the
* final call in the chain.
@@ -164,6 +241,13 @@ public class EventPublisher {
return this;
}
+ public EventPublisher unregisterNow() {
+ if (unregisterAfterSuccess && listener != null) {
+ GlobalEventBus.unregister(listener);
+ }
+ return this;
+ }
+
public Map getResult() {
if (this.result != null) {
return this.result;
diff --git a/src/main/java/org/toop/eventbus/events/Events.java b/src/main/java/org/toop/eventbus/events/Events.java
index 1f5e50e..b83c3b0 100644
--- a/src/main/java/org/toop/eventbus/events/Events.java
+++ b/src/main/java/org/toop/eventbus/events/Events.java
@@ -7,7 +7,7 @@ import java.util.concurrent.CompletableFuture;
import org.toop.core.Window;
/** Events that are used in the GlobalEventBus class. */
-public class Events implements IEvents {
+public class Events implements IEvent {
/**
* WIP, DO NOT USE!
diff --git a/src/main/java/org/toop/eventbus/events/IEvents.java b/src/main/java/org/toop/eventbus/events/IEvent.java
similarity index 55%
rename from src/main/java/org/toop/eventbus/events/IEvents.java
rename to src/main/java/org/toop/eventbus/events/IEvent.java
index bbe8faa..41ee649 100644
--- a/src/main/java/org/toop/eventbus/events/IEvents.java
+++ b/src/main/java/org/toop/eventbus/events/IEvent.java
@@ -1,3 +1,3 @@
package org.toop.eventbus.events;
-public interface IEvents {}
+public interface IEvent {}
diff --git a/src/main/java/org/toop/frontend/networking/NetworkingClientManager.java b/src/main/java/org/toop/frontend/networking/NetworkingClientManager.java
index d41c5b8..9610976 100644
--- a/src/main/java/org/toop/frontend/networking/NetworkingClientManager.java
+++ b/src/main/java/org/toop/frontend/networking/NetworkingClientManager.java
@@ -9,6 +9,7 @@ import java.util.concurrent.ConcurrentHashMap;
import com.google.common.base.Supplier;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+import org.toop.eventbus.EventPublisher;
import org.toop.eventbus.events.Events;
import org.toop.eventbus.GlobalEventBus;
import org.toop.eventbus.events.NetworkEvents;
diff --git a/src/test/java/org/toop/eventbus/EventPublisherStressTest.java b/src/test/java/org/toop/eventbus/EventPublisherStressTest.java
index b1bb392..c825ea7 100644
--- a/src/test/java/org/toop/eventbus/EventPublisherStressTest.java
+++ b/src/test/java/org/toop/eventbus/EventPublisherStressTest.java
@@ -20,8 +20,8 @@ class EventPublisherStressTest {
}
}
- private static final int THREADS = 100;
- private static final long EVENTS_PER_THREAD = 2_000_000;
+ private static final int THREADS = 1;
+ private static final long EVENTS_PER_THREAD = 2_000_000_000;
@Tag("stress")
@Test