From 9001cd970166e06adcbadc85436d3581d0f5a534 Mon Sep 17 00:00:00 2001
From: ErrorNoInternet <errornointernet@envs.net>
Date: Thu, 6 Mar 2025 17:59:42 -0500
Subject: [PATCH] feat: call event listeners in tasks

---
 src/events.rs | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/src/events.rs b/src/events.rs
index cca235c..fdbc3f5 100644
--- a/src/events.rs
+++ b/src/events.rs
@@ -176,12 +176,19 @@ pub async fn handle_event(client: Client, event: Event, state: State) -> anyhow:
     Ok(())
 }
 
-async fn call_listeners<T: Clone + IntoLuaMulti>(state: &State, event_type: &str, data: T) {
-    if let Some(listeners) = state.event_listeners.read().await.get(event_type) {
+async fn call_listeners<T: Clone + IntoLuaMulti + Send + 'static>(
+    state: &State,
+    event_type: &'static str,
+    data: T,
+) {
+    if let Some(listeners) = state.event_listeners.read().await.get(event_type).cloned() {
         for (id, callback) in listeners {
-            if let Err(error) = callback.call_async::<()>(data.clone()).await {
-                error!("failed to call lua event listener {id} for {event_type}: {error:?}");
-            }
+            let data = data.clone();
+            tokio::spawn(async move {
+                if let Err(error) = callback.call_async::<()>(data).await {
+                    error!("failed to call lua event listener {id} for {event_type}: {error:?}");
+                }
+            });
         }
     }
 }