aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/events
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2024-09-01 22:21:19 +0200
committerLinnea Gräf <nea@nea.moe>2024-09-01 22:21:19 +0200
commit5ed74f2df49c93ed1617520a935078b59ad7e195 (patch)
treef0d52699fff7f820bd724902878988859bd43516 /src/main/kotlin/events
parent816f80f862d2f5de6bc9b0ae84cd6df0da341228 (diff)
downloadfirmament-5ed74f2df49c93ed1617520a935078b59ad7e195.tar.gz
firmament-5ed74f2df49c93ed1617520a935078b59ad7e195.tar.bz2
firmament-5ed74f2df49c93ed1617520a935078b59ad7e195.zip
Add per compat project event listeners
[no changelog]
Diffstat (limited to 'src/main/kotlin/events')
-rw-r--r--src/main/kotlin/events/FirmamentEventBus.kt24
-rw-r--r--src/main/kotlin/events/subscription/Subscription.kt1
-rw-r--r--src/main/kotlin/events/subscription/SubscriptionList.kt25
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()
+ }
+ }
+}