diff options
Diffstat (limited to 'src/main/kotlin/events')
-rw-r--r-- | src/main/kotlin/events/FirmamentEventBus.kt | 24 | ||||
-rw-r--r-- | src/main/kotlin/events/subscription/Subscription.kt | 1 | ||||
-rw-r--r-- | src/main/kotlin/events/subscription/SubscriptionList.kt | 25 |
3 files changed, 44 insertions, 6 deletions
diff --git a/src/main/kotlin/events/FirmamentEventBus.kt b/src/main/kotlin/events/FirmamentEventBus.kt index ee9e6c8..71331d1 100644 --- a/src/main/kotlin/events/FirmamentEventBus.kt +++ b/src/main/kotlin/events/FirmamentEventBus.kt @@ -1,8 +1,7 @@ - - package moe.nea.firmament.events import java.util.concurrent.CopyOnWriteArrayList +import org.apache.commons.lang3.reflect.TypeUtils import moe.nea.firmament.Firmament import moe.nea.firmament.util.MC @@ -13,18 +12,31 @@ import moe.nea.firmament.util.MC * Subscriptions may not necessarily be delivered in the order of registering. */ open class FirmamentEventBus<T : FirmamentEvent> { + companion object { + val allEventBuses = mutableListOf<FirmamentEventBus<*>>() + } + + val eventType = TypeUtils.getTypeArguments(javaClass, FirmamentEventBus::class.java)!!.values.single() + + init { + allEventBuses.add(this) + } + data class Handler<T>( val invocation: (T) -> Unit, val receivesCancelled: Boolean, var knownErrors: MutableSet<Class<*>> = mutableSetOf(), + val label: String, ) private val toHandle: MutableList<Handler<T>> = CopyOnWriteArrayList() - fun subscribe(handle: (T) -> Unit) { - subscribe(false, handle) + val handlers: List<Handler<T>> get() = toHandle + + fun subscribe(label: String, handle: (T) -> Unit) { + subscribe(false, label, handle) } - fun subscribe(receivesCancelled: Boolean, handle: (T) -> Unit) { - toHandle.add(Handler(handle, receivesCancelled)) + fun subscribe(receivesCancelled: Boolean, label: String, handle: (T) -> Unit) { + toHandle.add(Handler(handle, receivesCancelled, label = label)) } fun publish(event: T): T { diff --git a/src/main/kotlin/events/subscription/Subscription.kt b/src/main/kotlin/events/subscription/Subscription.kt index 83b91c9..1c1d3bd 100644 --- a/src/main/kotlin/events/subscription/Subscription.kt +++ b/src/main/kotlin/events/subscription/Subscription.kt @@ -13,4 +13,5 @@ data class Subscription<T : FirmamentEvent>( val owner: Any, val invoke: (T) -> Unit, val eventBus: FirmamentEventBus<T>, + val methodName: String, ) diff --git a/src/main/kotlin/events/subscription/SubscriptionList.kt b/src/main/kotlin/events/subscription/SubscriptionList.kt new file mode 100644 index 0000000..e74a65a --- /dev/null +++ b/src/main/kotlin/events/subscription/SubscriptionList.kt @@ -0,0 +1,25 @@ +package moe.nea.firmament.events.subscription + +import java.util.ServiceLoader +import kotlin.streams.asSequence +import moe.nea.firmament.Firmament + +interface SubscriptionList { + fun provideSubscriptions(addSubscription: (Subscription<*>) -> Unit) + + companion object { + val allLists by lazy { + ServiceLoader.load(SubscriptionList::class.java) + .stream() + .asSequence() + .mapNotNull { + kotlin.runCatching { it.get() } + .getOrElse { ex -> + Firmament.logger.error("Could not load subscriptions from ${it.type()}", ex) + null + } + } + .toList() + } + } +} |