From d14ed0cecd799c37a57147d7692118f6bf224088 Mon Sep 17 00:00:00 2001
From: Him188 <Him188@mamoe.net>
Date: Thu, 29 Apr 2021 12:19:15 +0800
Subject: [PATCH] Dispatch events in Bot scope

---
 .../src/commonMain/kotlin/QQAndroidBot.kt     |  2 +-
 .../network/components/PacketHandler.kt       | 19 +++++++++++++------
 2 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/mirai-core/src/commonMain/kotlin/QQAndroidBot.kt b/mirai-core/src/commonMain/kotlin/QQAndroidBot.kt
index b381c1e9c..0584dd79e 100644
--- a/mirai-core/src/commonMain/kotlin/QQAndroidBot.kt
+++ b/mirai-core/src/commonMain/kotlin/QQAndroidBot.kt
@@ -139,7 +139,7 @@ internal open class QQAndroidBot constructor(
             set(
                 PacketHandler, PacketHandlerChain(
                     LoggingPacketHandlerAdapter(get(PacketLoggingStrategy), networkLogger),
-                    EventBroadcasterPacketHandler(networkLogger),
+                    EventBroadcasterPacketHandler(bot, networkLogger),
                     CallPacketFactoryPacketHandler(bot)
                 )
             )
diff --git a/mirai-core/src/commonMain/kotlin/network/components/PacketHandler.kt b/mirai-core/src/commonMain/kotlin/network/components/PacketHandler.kt
index 78c3c2830..38971856a 100644
--- a/mirai-core/src/commonMain/kotlin/network/components/PacketHandler.kt
+++ b/mirai-core/src/commonMain/kotlin/network/components/PacketHandler.kt
@@ -9,6 +9,9 @@
 
 package net.mamoe.mirai.internal.network.components
 
+import kotlinx.coroutines.CoroutineName
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.launch
 import net.mamoe.mirai.event.BroadcastControllable
 import net.mamoe.mirai.event.CancellableEvent
 import net.mamoe.mirai.event.Event
@@ -61,6 +64,7 @@ internal class LoggingPacketHandlerAdapter(
 }
 
 internal class EventBroadcasterPacketHandler(
+    private val targetScope: CoroutineScope,
     private val logger: MiraiLogger,
 ) : PacketHandler {
 
@@ -69,6 +73,7 @@ internal class EventBroadcasterPacketHandler(
         impl(data)
     }
 
+    private val coroutineName = CoroutineName("Mirai-EventDispatcher-${logger.identity}")
     private suspend fun impl(packet: Packet) {
         if (packet is MultiPacket<*>) {
             for (p in packet) {
@@ -79,12 +84,14 @@ internal class EventBroadcasterPacketHandler(
             packet is CancellableEvent && packet.isCancelled -> return
             packet is BroadcastControllable && !packet.shouldBroadcast -> return
             packet is Event -> {
-                try {
-                    packet.broadcast()
-                } catch (e: Throwable) {
-                    if (logger.isEnabled) {
-                        val msg = optimizeEventToString(packet)
-                        logger.error(IllegalStateException("Exception while broadcasting event '$msg'", e))
+                targetScope.launch(coroutineName) {
+                    try {
+                        packet.broadcast()
+                    } catch (e: Throwable) {
+                        if (logger.isEnabled) {
+                            val msg = optimizeEventToString(packet)
+                            logger.error(IllegalStateException("Exception while broadcasting event '$msg'", e))
+                        }
                     }
                 }
             }