diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/Subscribers.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/Subscribers.kt index f90baa72d..c24267f04 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/Subscribers.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/Subscribers.kt @@ -10,6 +10,8 @@ enum class ListeningStatus { STOPPED } +/* KClass 的扩展方法 */ + @Synchronized fun KClass.subscribe(handler: suspend (E) -> ListeningStatus) = this.listeners.add(Handler(handler)) @@ -28,6 +30,25 @@ fun KClass.subscribeWhileFalse(listener: suspend (E) -> Boolean) fun KClass.subscribeWhileTrue(listener: suspend (E) -> Boolean) = subscribeWhile(true, listener) fun KClass.subscribeWhileNull(listener: suspend (E) -> Any?) = subscribeWhile(null, listener) +/* 顶层方法 */ + +inline fun subscribe(noinline handler: suspend (E) -> ListeningStatus) = E::class.subscribe(handler) + +inline fun subscribeAlways(noinline listener: suspend (E) -> Unit) = E::class.subscribeAlways(listener) + +inline fun subscribeOnce(noinline listener: suspend (E) -> Unit) = E::class.subscribeOnce(listener) + +inline fun subscribeUntil(valueIfStop: T, noinline listener: suspend (E) -> T) = E::class.subscribeUntil(valueIfStop, listener) +inline fun subscribeUntilFalse(noinline listener: suspend (E) -> Boolean) = E::class.subscribeUntilFalse(listener) +inline fun subscribeUntilTrue(noinline listener: suspend (E) -> Boolean) = E::class.subscribeUntilTrue(listener) +inline fun subscribeUntilNull(noinline listener: suspend (E) -> Any?) = E::class.subscribeUntilNull(listener) + + +inline fun subscribeWhile(valueIfContinue: T, noinline listener: suspend (E) -> T) = E::class.subscribeWhile(valueIfContinue, listener) +inline fun subscribeWhileFalse(noinline listener: suspend (E) -> Boolean) = E::class.subscribeWhileFalse(listener) +inline fun subscribeWhileTrue(noinline listener: suspend (E) -> Boolean) = E::class.subscribeWhileTrue(listener) +inline fun subscribeWhileNull(noinline listener: suspend (E) -> Any?) = E::class.subscribeWhileNull(listener) + /** * 监听一个事件. 可同时进行多种方式的监听 diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/BotEvents.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/BotEvents.kt index c88ee1584..861d35475 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/BotEvents.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/BotEvents.kt @@ -2,13 +2,10 @@ package net.mamoe.mirai.event.events import net.mamoe.mirai.Bot import net.mamoe.mirai.event.Event -import kotlin.reflect.KClass /** * @author Him188moe */ abstract class BotEvent(val bot: Bot) : Event() -class BotLoginSucceedEvent(bot: Bot) : BotEvent(bot) { - companion object : KClass by BotLoginSucceedEvent::class -} \ No newline at end of file +class BotLoginSucceedEvent(bot: Bot) : BotEvent(bot) \ No newline at end of file diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/FriendEvents.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/FriendEvents.kt index e604aed08..b65d99569 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/FriendEvents.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/FriendEvents.kt @@ -4,7 +4,6 @@ import net.mamoe.mirai.Bot import net.mamoe.mirai.contact.QQ import net.mamoe.mirai.message.Message import net.mamoe.mirai.message.defaults.MessageChain -import kotlin.reflect.KClass /** * @author Him188moe @@ -17,8 +16,6 @@ abstract class FriendEvent(bot: Bot, val sender: QQ) : BotEvent(bot) * @author Him188moe */ class FriendMessageEvent(bot: Bot, sender: QQ, val message: MessageChain) : FriendEvent(bot, sender) { - companion object : KClass by FriendMessageEvent::class - @JvmSynthetic suspend inline fun reply(message: Message) = sender.sendMessage(message) diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/GroupEvents.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/GroupEvents.kt index 0140706dc..161d39b7b 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/GroupEvents.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/GroupEvents.kt @@ -5,7 +5,6 @@ import net.mamoe.mirai.contact.Group import net.mamoe.mirai.contact.QQ import net.mamoe.mirai.message.Message import net.mamoe.mirai.message.defaults.MessageChain -import kotlin.reflect.KClass /** * @author Him188moe @@ -16,8 +15,6 @@ abstract class GroupEvent(bot: Bot, val group: Group) : BotEvent(bot) * @author Him188moe */ class GroupMessageEvent(bot: Bot, group: Group, val sender: QQ, val message: MessageChain) : GroupEvent(bot, group) { - companion object : KClass by GroupMessageEvent::class - @JvmSynthetic suspend inline fun reply(message: Message) = group.sendMessage(message) diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/PacketEvents.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/PacketEvents.kt index 29eb1d1a8..fec20199d 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/PacketEvents.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/PacketEvents.kt @@ -5,7 +5,6 @@ import net.mamoe.mirai.event.Cancellable import net.mamoe.mirai.network.protocol.tim.packet.ClientPacket import net.mamoe.mirai.network.protocol.tim.packet.Packet import net.mamoe.mirai.network.protocol.tim.packet.ServerPacket -import kotlin.reflect.KClass /* Abstract */ @@ -22,22 +21,16 @@ sealed class ClientPacketEvent(bot: Bot, packet: P) : Pack /** * 包已发送. 不可被取消 */ -class PacketSentEvent

(bot: Bot, packet: P) : ClientPacketEvent

(bot, packet) { - companion object : KClass> by PacketSentEvent::class -} +class PacketSentEvent

(bot: Bot, packet: P) : ClientPacketEvent

(bot, packet) /** * 包发送前. 可被取消 */ -class BeforePacketSendEvent

(bot: Bot, packet: P) : ClientPacketEvent

(bot, packet), Cancellable { - companion object : KClass> by BeforePacketSendEvent::class -} +class BeforePacketSendEvent

(bot: Bot, packet: P) : ClientPacketEvent

(bot, packet), Cancellable /* Server to Client */ sealed class ServerPacketEvent(bot: Bot, packet: P) : PacketEvent

(bot, packet) -class ServerPacketReceivedEvent(bot: Bot, packet: ServerPacket) : ServerPacketEvent(bot, packet) { - companion object : KClass by ServerPacketReceivedEvent::class -} \ No newline at end of file +class ServerPacketReceivedEvent(bot: Bot, packet: ServerPacket) : ServerPacketEvent(bot, packet) \ No newline at end of file diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/internal/InternalEventListenres.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/internal/InternalEventListenres.kt index d4701c461..2d0aa7dad 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/internal/InternalEventListenres.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/internal/InternalEventListenres.kt @@ -1,7 +1,16 @@ package net.mamoe.mirai.event.internal +import kotlinx.coroutines.delay +import net.mamoe.mirai.Bot import net.mamoe.mirai.event.Event import net.mamoe.mirai.event.ListeningStatus +import net.mamoe.mirai.event.broadcast +import net.mamoe.mirai.event.events.ServerPacketReceivedEvent +import net.mamoe.mirai.event.subscribeAlways +import net.mamoe.mirai.network.protocol.tim.packet.ServerPacket +import net.mamoe.mirai.network.protocol.tim.packet.dataInputStream +import net.mamoe.mirai.utils.BotAccount +import net.mamoe.mirai.utils.Console import kotlin.reflect.KClass import kotlin.reflect.full.allSuperclasses @@ -10,7 +19,6 @@ import kotlin.reflect.full.allSuperclasses * * @author Him188moe */ - internal fun KClass.subscribeInternal(listener: Listener) = this.listeners.add(listener) /** @@ -36,16 +44,16 @@ internal val KClass.listeners: EventListeners get() = EventLis internal class EventListeners : MutableList> by mutableListOf() internal object EventListenerManger { - private val REGISTRIES: MutableMap, EventListeners> = mutableMapOf() + private val registries: MutableMap, EventListeners> = mutableMapOf() @Suppress("UNCHECKED_CAST") internal fun get(clazz: KClass): EventListeners { synchronized(clazz) { - if (REGISTRIES.containsKey(clazz)) { - return REGISTRIES[clazz] as EventListeners + if (registries.containsKey(clazz)) { + return registries[clazz] as EventListeners } else { EventListeners().let { - REGISTRIES[clazz] = it + registries[clazz] = it return it } } @@ -64,13 +72,25 @@ internal suspend fun E.broadcastInternal(): E { } } - callListeners(this::class.listeners as EventListeners) + callListeners(this::class.listeners as EventListeners) this::class.allSuperclasses.forEach { //println("super: " + it.simpleName) + //todo multi platform if (Event::class.java.isAssignableFrom(it.java)) { callListeners((it as KClass).listeners as EventListeners) } } return this +} + +suspend fun main() { + ServerPacketReceivedEvent::class.subscribeAlways { + println("got it") + } + + println(ServerPacketReceivedEvent::class.listeners.size) + + ServerPacketReceivedEvent(Bot(BotAccount(1, ""), Console()), object : ServerPacket(byteArrayOf().dataInputStream()) {}).broadcast() + delay(1000) } \ No newline at end of file diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/TIMBotNetworkHandler.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/TIMBotNetworkHandler.kt index dc8603332..735ee9988 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/TIMBotNetworkHandler.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/TIMBotNetworkHandler.kt @@ -188,7 +188,7 @@ internal class TIMBotNetworkHandler(private val bot: Bot) : BotNetworkHandler { // loginResult?.complete(LoginState.TIMEOUT) //} val received = AtomicBoolean(false) - ServerPacketReceivedEvent.subscribe { + ServerPacketReceivedEvent::class.subscribe { if (it.packet is ServerTouchResponsePacket && it.bot === bot) { received.set(true) ListeningStatus.STOPPED diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/packet/ServerPacket.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/packet/ServerPacket.kt index e83ff40bc..9b8cf15a0 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/packet/ServerPacket.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/packet/ServerPacket.kt @@ -2,13 +2,6 @@ package net.mamoe.mirai.network.protocol.tim.packet -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch -import net.mamoe.mirai.Bot -import net.mamoe.mirai.event.events.ServerPacketReceivedEvent -import net.mamoe.mirai.event.subscribeWhileTrue import net.mamoe.mirai.network.protocol.tim.packet.PacketNameFormatter.adjustName import net.mamoe.mirai.network.protocol.tim.packet.action.ServerCanAddFriendResponsePacket import net.mamoe.mirai.network.protocol.tim.packet.action.ServerSendFriendMessageResponsePacket @@ -18,7 +11,6 @@ import net.mamoe.mirai.network.protocol.tim.packet.login.* import net.mamoe.mirai.utils.* import java.io.DataInputStream import java.io.EOFException -import kotlin.reflect.KClass /** * @author Him188moe @@ -334,25 +326,4 @@ fun DataInputStream.gotoWhere(matcher: ByteArray): DataInputStream { return this } } while (true) -} - - -@Suppress("UNCHECKED_CAST") -internal fun

Bot.waitForPacket(packetClass: KClass

, timeoutMillis: Long = Long.MAX_VALUE, timeout: () -> Unit = {}) { - var got = false - ServerPacketReceivedEvent.subscribeWhileTrue { - if (packetClass.isInstance(it.packet) && it.bot === this) { - got = true - false - } else { - true - } - } - - GlobalScope.launch(Dispatchers.Unconfined) { - delay(timeoutMillis) - if (!got) { - timeout.invoke() - } - } } \ No newline at end of file diff --git a/mirai-demos/mirai-demo-1/src/main/java/demo1/Main.kt b/mirai-demos/mirai-demo-1/src/main/java/demo1/Main.kt index 812433fe6..0e7d9f95b 100644 --- a/mirai-demos/mirai-demo-1/src/main/java/demo1/Main.kt +++ b/mirai-demos/mirai-demo-1/src/main/java/demo1/Main.kt @@ -33,18 +33,8 @@ suspend fun main() { } - //DSL 监听 - FriendMessageEvent.subscribeAll { - always { - //获取第一个纯文本消息 - val firstText = it.message[PlainText] - - } - } - - - //监听事件: - FriendMessageEvent.subscribeAlways { + //提供泛型以监听事件 + subscribeAlways { //获取第一个纯文本消息 val firstText = it.message[PlainText] @@ -76,11 +66,22 @@ suspend fun main() { } } + //通过 KClass 扩展方式监听事件 GroupMessageEvent::class.subscribeAlways { when { it.message.contains("复读") -> it.reply(it.message) } } + + + //DSL 监听 + FriendMessageEvent::class.subscribeAll { + always { + //获取第一个纯文本消息 + val firstText = it.message[PlainText] + + } + } } @@ -90,9 +91,9 @@ suspend fun main() { * 对机器人说 "停止", 机器人停止 */ fun demo2() { - FriendMessageEvent.subscribeAlways { event -> + subscribeAlways { event -> if (event.message eq "记笔记") { - FriendMessageEvent.subscribeUntilFalse { + FriendMessageEvent::class.subscribeUntilFalse { it.reply("你发送了 ${it.message}") it.message eq "停止"