Add _EventBroadcast to allow tests to overrode implementation of Event.broadcast

This commit is contained in:
Him188 2021-06-07 18:29:15 +08:00
parent 9619338d5b
commit fc96ba96dd
3 changed files with 44 additions and 29 deletions

View File

@ -20,8 +20,8 @@ import net.mamoe.kjbb.JvmBlockingBridge
import net.mamoe.mirai.contact.*
import net.mamoe.mirai.data.UserProfile
import net.mamoe.mirai.event.Event
import net.mamoe.mirai.event._EventBroadcast
import net.mamoe.mirai.event.broadcast
import net.mamoe.mirai.event.broadcastImpl
import net.mamoe.mirai.event.events.BotInvitedJoinGroupRequestEvent
import net.mamoe.mirai.event.events.MemberJoinRequestEvent
import net.mamoe.mirai.event.events.NewFriendRequestEvent
@ -307,7 +307,7 @@ public interface IMirai : LowLevelApiAccessor {
* 广播一个事件. [Event.broadcast] 调用.
*/
public suspend fun broadcastEvent(event: Event) {
event.broadcastImpl()
_EventBroadcast.implementation.broadcastImpl(event)
}
}

View File

@ -145,43 +145,53 @@ public interface CancellableEvent : Event {
* @see __broadcastJava Java 使用
*/
@JvmSynthetic
public suspend fun <E : Event> E.broadcast(): E = apply { Mirai.broadcastEvent(this) }
public suspend fun <E : Event> E.broadcast(): E = _EventBroadcast.implementation.broadcastPublic(this)
@JvmName("broadcastImpl") // avoid mangling
internal suspend fun <E : Event> E.broadcastImpl(): E {
val event = this
check(event is AbstractEvent) {
"Events must extend AbstractEvent"
/**
* @since 2.7-M1
*/
@Suppress("ClassName")
internal open class _EventBroadcast {
companion object {
@Volatile
@JvmStatic
var implementation: _EventBroadcast = _EventBroadcast()
}
if (event is BroadcastControllable && !event.shouldBroadcast) {
open suspend fun <E : Event> broadcastPublic(event: E): E = event.apply { Mirai.broadcastEvent(this) }
@JvmName("broadcastImpl") // avoid mangling
internal suspend fun <E : Event> broadcastImpl(event: E): E {
check(event is AbstractEvent) { "Events must extend AbstractEvent" }
if (event is BroadcastControllable && !event.shouldBroadcast) {
return event
}
event.broadCastLock.withLock {
event._intercepted = false
if (EventDisabled) return@withLock
logEvent(event)
callAndRemoveIfRequired(event)
}
return event
}
event.broadCastLock.withLock {
event._intercepted = false
if (EventDisabled) return@withLock
logEvent(event)
callAndRemoveIfRequired(event)
}
return this
}
private fun logEvent(event: Event) {
if (event is Packet.NoEventLog) return
if (event is Packet.NoLog) return
if (event is MessageEvent) return // specially handled in [LoggingPacketHandlerAdapter]
private fun logEvent(event: Event) {
if (event is Packet.NoEventLog) return
if (event is Packet.NoLog) return
if (event is MessageEvent) return // specially handled in [LoggingPacketHandlerAdapter]
// if (this is Packet) return@withLock // all [Packet]s are logged in [LoggingPacketHandlerAdapter]
if (event is BotEvent) {
event.bot.logger.verbose { "Event: $event" }
} else {
topLevelEventLogger.verbose { "Event: $event" }
if (event is BotEvent) {
event.bot.logger.verbose { "Event: $event" }
} else {
topLevelEventLogger.verbose { "Event: $event" }
}
}
}
private val topLevelEventLogger by lazy { MiraiLogger.create("EventPipeline") }
private val topLevelEventLogger by lazy { MiraiLogger.create("EventPipeline") }
}
/**
* Java 广播一个事件的唯一途径.

View File

@ -44,12 +44,17 @@ internal class EventChannelTest {
@BeforeEach
fun x() {
runBlocking { semaphore.acquire() }
_EventBroadcast.implementation = object : _EventBroadcast() {
override suspend fun <E : Event> broadcastPublic(event: E): E =
broadcastImpl(event) // do not call MiraiImpl
}
}
@AfterEach
fun s() {
GlobalEventListeners.clear()
runBlocking { semaphore.release() }
_EventBroadcast.implementation = _EventBroadcast() // restore
}
@Test