Commit 0ea0bf23 authored by PeratX's avatar PeratX

Merge remote-tracking branch 'origin/master'

parents 5c18b413 b9720385
...@@ -10,6 +10,8 @@ enum class ListeningStatus { ...@@ -10,6 +10,8 @@ enum class ListeningStatus {
STOPPED STOPPED
} }
/* KClass 的扩展方法 */
@Synchronized @Synchronized
fun <E : Event> KClass<E>.subscribe(handler: suspend (E) -> ListeningStatus) = this.listeners.add(Handler(handler)) fun <E : Event> KClass<E>.subscribe(handler: suspend (E) -> ListeningStatus) = this.listeners.add(Handler(handler))
...@@ -28,6 +30,25 @@ fun <E : Event> KClass<E>.subscribeWhileFalse(listener: suspend (E) -> Boolean) ...@@ -28,6 +30,25 @@ fun <E : Event> KClass<E>.subscribeWhileFalse(listener: suspend (E) -> Boolean)
fun <E : Event> KClass<E>.subscribeWhileTrue(listener: suspend (E) -> Boolean) = subscribeWhile(true, listener) fun <E : Event> KClass<E>.subscribeWhileTrue(listener: suspend (E) -> Boolean) = subscribeWhile(true, listener)
fun <E : Event> KClass<E>.subscribeWhileNull(listener: suspend (E) -> Any?) = subscribeWhile(null, listener) fun <E : Event> KClass<E>.subscribeWhileNull(listener: suspend (E) -> Any?) = subscribeWhile(null, listener)
/* 顶层方法 */
inline fun <reified E : Event> subscribe(noinline handler: suspend (E) -> ListeningStatus) = E::class.subscribe(handler)
inline fun <reified E : Event> subscribeAlways(noinline listener: suspend (E) -> Unit) = E::class.subscribeAlways(listener)
inline fun <reified E : Event> subscribeOnce(noinline listener: suspend (E) -> Unit) = E::class.subscribeOnce(listener)
inline fun <reified E : Event, T> subscribeUntil(valueIfStop: T, noinline listener: suspend (E) -> T) = E::class.subscribeUntil(valueIfStop, listener)
inline fun <reified E : Event> subscribeUntilFalse(noinline listener: suspend (E) -> Boolean) = E::class.subscribeUntilFalse(listener)
inline fun <reified E : Event> subscribeUntilTrue(noinline listener: suspend (E) -> Boolean) = E::class.subscribeUntilTrue(listener)
inline fun <reified E : Event> subscribeUntilNull(noinline listener: suspend (E) -> Any?) = E::class.subscribeUntilNull(listener)
inline fun <reified E : Event, T> subscribeWhile(valueIfContinue: T, noinline listener: suspend (E) -> T) = E::class.subscribeWhile(valueIfContinue, listener)
inline fun <reified E : Event> subscribeWhileFalse(noinline listener: suspend (E) -> Boolean) = E::class.subscribeWhileFalse(listener)
inline fun <reified E : Event> subscribeWhileTrue(noinline listener: suspend (E) -> Boolean) = E::class.subscribeWhileTrue(listener)
inline fun <reified E : Event> subscribeWhileNull(noinline listener: suspend (E) -> Any?) = E::class.subscribeWhileNull(listener)
/** /**
* 监听一个事件. 可同时进行多种方式的监听 * 监听一个事件. 可同时进行多种方式的监听
......
package net.mamoe.mirai.event.events.bot package net.mamoe.mirai.event.events
import net.mamoe.mirai.Bot import net.mamoe.mirai.Bot
import net.mamoe.mirai.event.Event import net.mamoe.mirai.event.Event
import kotlin.reflect.KClass
/** /**
* @author Him188moe * @author Him188moe
*/ */
abstract class BotEvent(val bot: Bot) : Event() abstract class BotEvent(val bot: Bot) : Event()
class BotLoginSucceedEvent(bot: Bot) : BotEvent(bot) { class BotLoginSucceedEvent(bot: Bot) : BotEvent(bot)
companion object : KClass<BotLoginSucceedEvent> by BotLoginSucceedEvent::class \ No newline at end of file
}
\ No newline at end of file
package net.mamoe.mirai.event.events.qq package net.mamoe.mirai.event.events
import net.mamoe.mirai.Bot import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.QQ import net.mamoe.mirai.contact.QQ
import net.mamoe.mirai.message.Message import net.mamoe.mirai.message.Message
import net.mamoe.mirai.message.defaults.MessageChain import net.mamoe.mirai.message.defaults.MessageChain
import kotlin.reflect.KClass
/**
* @author Him188moe
*/
abstract class FriendEvent(bot: Bot, val sender: QQ) : BotEvent(bot)
/** /**
* 接受好友消息事件 * 接受好友消息事件
...@@ -12,8 +16,6 @@ import kotlin.reflect.KClass ...@@ -12,8 +16,6 @@ import kotlin.reflect.KClass
* @author Him188moe * @author Him188moe
*/ */
class FriendMessageEvent(bot: Bot, sender: QQ, val message: MessageChain) : FriendEvent(bot, sender) { class FriendMessageEvent(bot: Bot, sender: QQ, val message: MessageChain) : FriendEvent(bot, sender) {
companion object : KClass<FriendMessageEvent> by FriendMessageEvent::class
@JvmSynthetic @JvmSynthetic
suspend inline fun reply(message: Message) = sender.sendMessage(message) suspend inline fun reply(message: Message) = sender.sendMessage(message)
...@@ -25,4 +27,4 @@ class FriendMessageEvent(bot: Bot, sender: QQ, val message: MessageChain) : Frie ...@@ -25,4 +27,4 @@ class FriendMessageEvent(bot: Bot, sender: QQ, val message: MessageChain) : Frie
@JvmSynthetic @JvmSynthetic
suspend inline fun reply(message: MessageChain) = sender.sendMessage(message)//shortcut suspend inline fun reply(message: MessageChain) = sender.sendMessage(message)//shortcut
} }
\ No newline at end of file
package net.mamoe.mirai.event.events.group package net.mamoe.mirai.event.events
import net.mamoe.mirai.Bot import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.Group import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.QQ import net.mamoe.mirai.contact.QQ
import net.mamoe.mirai.message.Message import net.mamoe.mirai.message.Message
import net.mamoe.mirai.message.defaults.MessageChain import net.mamoe.mirai.message.defaults.MessageChain
import kotlin.reflect.KClass
/** /**
* @author Him188moe * @author Him188moe
*/ */
class GroupMessageEvent(bot: Bot, group: Group, val sender: QQ, val message: MessageChain) : GroupEvent(bot, group) { abstract class GroupEvent(bot: Bot, val group: Group) : BotEvent(bot)
companion object : KClass<GroupMessageEvent> by GroupMessageEvent::class
/**
* @author Him188moe
*/
class GroupMessageEvent(bot: Bot, group: Group, val sender: QQ, val message: MessageChain) : GroupEvent(bot, group) {
@JvmSynthetic @JvmSynthetic
suspend inline fun reply(message: Message) = group.sendMessage(message) suspend inline fun reply(message: Message) = group.sendMessage(message)
...@@ -24,4 +26,4 @@ class GroupMessageEvent(bot: Bot, group: Group, val sender: QQ, val message: Mes ...@@ -24,4 +26,4 @@ class GroupMessageEvent(bot: Bot, group: Group, val sender: QQ, val message: Mes
@JvmSynthetic @JvmSynthetic
suspend inline fun reply(message: MessageChain) = group.sendMessage(message) suspend inline fun reply(message: MessageChain) = group.sendMessage(message)
} }
\ No newline at end of file
package net.mamoe.mirai.event.events.network package net.mamoe.mirai.event.events
import net.mamoe.mirai.Bot import net.mamoe.mirai.Bot
import net.mamoe.mirai.event.Cancellable import net.mamoe.mirai.event.Cancellable
import net.mamoe.mirai.network.protocol.tim.packet.ClientPacket import net.mamoe.mirai.network.protocol.tim.packet.ClientPacket
import kotlin.reflect.KClass import net.mamoe.mirai.network.protocol.tim.packet.Packet
import net.mamoe.mirai.network.protocol.tim.packet.ServerPacket
abstract class ClientPacketEvent<out P : ClientPacket>(bot: Bot, packet: P) : PacketEvent<P>(bot, packet) /* Abstract */
/**
* @author Him188moe
*/
sealed class PacketEvent<out P : Packet>(bot: Bot, open val packet: P) : BotEvent(bot)
/* Client to Server */
sealed class ClientPacketEvent<out P : ClientPacket>(bot: Bot, packet: P) : PacketEvent<P>(bot, packet)
/** /**
* 包已发送. 不可被取消 * 包已发送. 不可被取消
*/ */
class PacketSentEvent<P : ClientPacket>(bot: Bot, packet: P) : ClientPacketEvent<P>(bot, packet) { class PacketSentEvent<P : ClientPacket>(bot: Bot, packet: P) : ClientPacketEvent<P>(bot, packet)
companion object : KClass<PacketSentEvent<*>> by PacketSentEvent::class
}
/** /**
* 包发送前. 可被取消 * 包发送前. 可被取消
*/ */
class BeforePacketSendEvent<P : ClientPacket>(bot: Bot, packet: P) : ClientPacketEvent<P>(bot, packet), Cancellable { class BeforePacketSendEvent<P : ClientPacket>(bot: Bot, packet: P) : ClientPacketEvent<P>(bot, packet), Cancellable
companion object : KClass<BeforePacketSendEvent<*>> by BeforePacketSendEvent::class
}
\ No newline at end of file /* Server to Client */
sealed class ServerPacketEvent<out P : ServerPacket>(bot: Bot, packet: P) : PacketEvent<P>(bot, packet)
class ServerPacketReceivedEvent(bot: Bot, packet: ServerPacket) : ServerPacketEvent<ServerPacket>(bot, packet)
\ No newline at end of file
package net.mamoe.mirai.event.events.group
import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.event.events.bot.BotEvent
/**
* @author Him188moe
*/
abstract class GroupEvent(bot: Bot, val group: Group) : BotEvent(bot)
\ No newline at end of file
package net.mamoe.mirai.event.events.network
import net.mamoe.mirai.Bot
import net.mamoe.mirai.event.events.bot.BotEvent
import net.mamoe.mirai.network.protocol.tim.packet.Packet
/**
* @author Him188moe
*/
abstract class PacketEvent<out P : Packet>(bot: Bot, open val packet: P) : BotEvent(bot)
package net.mamoe.mirai.event.events.network
import net.mamoe.mirai.Bot
import net.mamoe.mirai.network.protocol.tim.packet.ServerPacket
import kotlin.reflect.KClass
abstract class ServerPacketEvent<out P : ServerPacket>(bot: Bot, packet: P) : PacketEvent<P>(bot, packet)
class ServerPacketReceivedEvent(bot: Bot, packet: ServerPacket) : ServerPacketEvent<ServerPacket>(bot, packet) {
companion object : KClass<ServerPacketReceivedEvent> by ServerPacketReceivedEvent::class
}
\ No newline at end of file
package net.mamoe.mirai.event.events.qq
import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.QQ
import net.mamoe.mirai.event.events.bot.BotEvent
/**
* @author Him188moe
*/
abstract class FriendEvent(bot: Bot, val sender: QQ) : BotEvent(bot)
\ No newline at end of file
package net.mamoe.mirai.event.internal 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.Event
import net.mamoe.mirai.event.ListeningStatus 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.KClass
import kotlin.reflect.full.allSuperclasses import kotlin.reflect.full.allSuperclasses
...@@ -10,7 +19,6 @@ import kotlin.reflect.full.allSuperclasses ...@@ -10,7 +19,6 @@ import kotlin.reflect.full.allSuperclasses
* *
* @author Him188moe * @author Him188moe
*/ */
internal fun <E : Event> KClass<E>.subscribeInternal(listener: Listener<E>) = this.listeners.add(listener) internal fun <E : Event> KClass<E>.subscribeInternal(listener: Listener<E>) = this.listeners.add(listener)
/** /**
...@@ -36,16 +44,16 @@ internal val <E : Event> KClass<E>.listeners: EventListeners<E> get() = EventLis ...@@ -36,16 +44,16 @@ internal val <E : Event> KClass<E>.listeners: EventListeners<E> get() = EventLis
internal class EventListeners<E : Event> : MutableList<Listener<E>> by mutableListOf() internal class EventListeners<E : Event> : MutableList<Listener<E>> by mutableListOf()
internal object EventListenerManger { internal object EventListenerManger {
private val REGISTRIES: MutableMap<KClass<out Event>, EventListeners<out Event>> = mutableMapOf() private val registries: MutableMap<KClass<out Event>, EventListeners<out Event>> = mutableMapOf()
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
internal fun <E : Event> get(clazz: KClass<E>): EventListeners<E> { internal fun <E : Event> get(clazz: KClass<E>): EventListeners<E> {
synchronized(clazz) { synchronized(clazz) {
if (REGISTRIES.containsKey(clazz)) { if (registries.containsKey(clazz)) {
return REGISTRIES[clazz] as EventListeners<E> return registries[clazz] as EventListeners<E>
} else { } else {
EventListeners<E>().let { EventListeners<E>().let {
REGISTRIES[clazz] = it registries[clazz] = it
return it return it
} }
} }
...@@ -64,13 +72,25 @@ internal suspend fun <E : Event> E.broadcastInternal(): E { ...@@ -64,13 +72,25 @@ internal suspend fun <E : Event> E.broadcastInternal(): E {
} }
} }
callListeners(this::class.listeners as EventListeners<E>) callListeners(this::class.listeners as EventListeners<in E>)
this::class.allSuperclasses.forEach { this::class.allSuperclasses.forEach {
//println("super: " + it.simpleName) //println("super: " + it.simpleName)
//todo multi platform
if (Event::class.java.isAssignableFrom(it.java)) { if (Event::class.java.isAssignableFrom(it.java)) {
callListeners((it as KClass<out Event>).listeners as EventListeners<in E>) callListeners((it as KClass<out Event>).listeners as EventListeners<in E>)
} }
} }
return this 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
...@@ -6,10 +6,10 @@ import kotlinx.coroutines.sync.withLock ...@@ -6,10 +6,10 @@ import kotlinx.coroutines.sync.withLock
import net.mamoe.mirai.Bot import net.mamoe.mirai.Bot
import net.mamoe.mirai.event.ListeningStatus import net.mamoe.mirai.event.ListeningStatus
import net.mamoe.mirai.event.broadcast import net.mamoe.mirai.event.broadcast
import net.mamoe.mirai.event.events.bot.BotLoginSucceedEvent import net.mamoe.mirai.event.events.BeforePacketSendEvent
import net.mamoe.mirai.event.events.network.BeforePacketSendEvent import net.mamoe.mirai.event.events.BotLoginSucceedEvent
import net.mamoe.mirai.event.events.network.PacketSentEvent import net.mamoe.mirai.event.events.PacketSentEvent
import net.mamoe.mirai.event.events.network.ServerPacketReceivedEvent import net.mamoe.mirai.event.events.ServerPacketReceivedEvent
import net.mamoe.mirai.event.subscribe import net.mamoe.mirai.event.subscribe
import net.mamoe.mirai.network.BotNetworkHandler import net.mamoe.mirai.network.BotNetworkHandler
import net.mamoe.mirai.network.LoginSession import net.mamoe.mirai.network.LoginSession
...@@ -188,7 +188,7 @@ internal class TIMBotNetworkHandler(private val bot: Bot) : BotNetworkHandler { ...@@ -188,7 +188,7 @@ internal class TIMBotNetworkHandler(private val bot: Bot) : BotNetworkHandler {
// loginResult?.complete(LoginState.TIMEOUT) // loginResult?.complete(LoginState.TIMEOUT)
//} //}
val received = AtomicBoolean(false) val received = AtomicBoolean(false)
ServerPacketReceivedEvent.subscribe { ServerPacketReceivedEvent::class.subscribe {
if (it.packet is ServerTouchResponsePacket && it.bot === bot) { if (it.packet is ServerTouchResponsePacket && it.bot === bot) {
received.set(true) received.set(true)
ListeningStatus.STOPPED ListeningStatus.STOPPED
......
package net.mamoe.mirai.network.protocol.tim.handler package net.mamoe.mirai.network.protocol.tim.handler
import net.mamoe.mirai.Bot import net.mamoe.mirai.Bot
import net.mamoe.mirai.event.events.network.ServerPacketReceivedEvent import net.mamoe.mirai.event.events.ServerPacketReceivedEvent
import net.mamoe.mirai.network.protocol.tim.TIMBotNetworkHandler
import net.mamoe.mirai.network.LoginSession import net.mamoe.mirai.network.LoginSession
import net.mamoe.mirai.network.protocol.tim.TIMBotNetworkHandler
import net.mamoe.mirai.network.protocol.tim.packet.ClientPacket import net.mamoe.mirai.network.protocol.tim.packet.ClientPacket
import net.mamoe.mirai.network.protocol.tim.packet.ServerPacket import net.mamoe.mirai.network.protocol.tim.packet.ServerPacket
......
...@@ -3,8 +3,8 @@ package net.mamoe.mirai.network.protocol.tim.handler ...@@ -3,8 +3,8 @@ package net.mamoe.mirai.network.protocol.tim.handler
import net.mamoe.mirai.contact.Group import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.QQ import net.mamoe.mirai.contact.QQ
import net.mamoe.mirai.event.broadcast import net.mamoe.mirai.event.broadcast
import net.mamoe.mirai.event.events.group.GroupMessageEvent import net.mamoe.mirai.event.events.FriendMessageEvent
import net.mamoe.mirai.event.events.qq.FriendMessageEvent import net.mamoe.mirai.event.events.GroupMessageEvent
import net.mamoe.mirai.getGroupByNumber import net.mamoe.mirai.getGroupByNumber
import net.mamoe.mirai.getQQ import net.mamoe.mirai.getQQ
import net.mamoe.mirai.message.defaults.MessageChain import net.mamoe.mirai.message.defaults.MessageChain
......
...@@ -41,7 +41,7 @@ abstract class ClientPacket : ByteArrayDataOutputStream(), Packet { ...@@ -41,7 +41,7 @@ abstract class ClientPacket : ByteArrayDataOutputStream(), Packet {
* Encode this packet. * Encode this packet.
* *
* *
* Before sending the packet, a [tail][TIMProtocol.tail] will be added. * Before sending the packet, a [tail][TIMProtocol.tail] is added.
*/ */
@Throws(IOException::class) @Throws(IOException::class)
protected abstract fun encode() protected abstract fun encode()
......
...@@ -2,13 +2,6 @@ ...@@ -2,13 +2,6 @@
package net.mamoe.mirai.network.protocol.tim.packet 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.network.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.PacketNameFormatter.adjustName
import net.mamoe.mirai.network.protocol.tim.packet.action.ServerCanAddFriendResponsePacket import net.mamoe.mirai.network.protocol.tim.packet.action.ServerCanAddFriendResponsePacket
import net.mamoe.mirai.network.protocol.tim.packet.action.ServerSendFriendMessageResponsePacket import net.mamoe.mirai.network.protocol.tim.packet.action.ServerSendFriendMessageResponsePacket
...@@ -18,7 +11,6 @@ import net.mamoe.mirai.network.protocol.tim.packet.login.* ...@@ -18,7 +11,6 @@ import net.mamoe.mirai.network.protocol.tim.packet.login.*
import net.mamoe.mirai.utils.* import net.mamoe.mirai.utils.*
import java.io.DataInputStream import java.io.DataInputStream
import java.io.EOFException import java.io.EOFException
import kotlin.reflect.KClass
/** /**
* @author Him188moe * @author Him188moe
...@@ -334,25 +326,4 @@ fun DataInputStream.gotoWhere(matcher: ByteArray): DataInputStream { ...@@ -334,25 +326,4 @@ fun DataInputStream.gotoWhere(matcher: ByteArray): DataInputStream {
return this return this
} }
} while (true) } while (true)
}
@Suppress("UNCHECKED_CAST")
internal fun <P : ServerPacket> Bot.waitForPacket(packetClass: KClass<P>, 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
...@@ -85,7 +85,7 @@ object Main { ...@@ -85,7 +85,7 @@ object Main {
* 4. 双击跳转 * 4. 双击跳转
* 5. 断点并在TIM发送消息以触发 * 5. 断点并在TIM发送消息以触发
* 6. 运行到 `mov eax,dword ptr ss:[ebp+10]` * 6. 运行到 `mov eax,dword ptr ss:[ebp+10]`
* 7. 从 eax 开始的 16个 bytes 便是 `sessionKey` * 7. 查看内存, 从 `eax` 开始的 16 bytes 便是 `sessionKey`
*/ */
val sessionKey: ByteArray = "48 C0 11 42 2D FD 8F 36 6E BA BF FD D3 AA B7 AE".hexToBytes() val sessionKey: ByteArray = "48 C0 11 42 2D FD 8F 36 6E BA BF FD D3 AA B7 AE".hexToBytes()
......
...@@ -2,8 +2,8 @@ package demo1 ...@@ -2,8 +2,8 @@ package demo1
import net.mamoe.mirai.Bot import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.Group import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.event.events.group.GroupMessageEvent import net.mamoe.mirai.event.events.FriendMessageEvent
import net.mamoe.mirai.event.events.qq.FriendMessageEvent import net.mamoe.mirai.event.events.GroupMessageEvent
import net.mamoe.mirai.event.subscribeAll import net.mamoe.mirai.event.subscribeAll
import net.mamoe.mirai.event.subscribeAlways import net.mamoe.mirai.event.subscribeAlways
import net.mamoe.mirai.event.subscribeUntilFalse import net.mamoe.mirai.event.subscribeUntilFalse
...@@ -33,18 +33,8 @@ suspend fun main() { ...@@ -33,18 +33,8 @@ suspend fun main() {
} }
//DSL 监听 //提供泛型以监听事件
FriendMessageEvent.subscribeAll { subscribeAlways<FriendMessageEvent> {
always {
//获取第一个纯文本消息
val firstText = it.message[PlainText]
}
}
//监听事件:
FriendMessageEvent.subscribeAlways {
//获取第一个纯文本消息 //获取第一个纯文本消息
val firstText = it.message[PlainText] val firstText = it.message[PlainText]
...@@ -76,11 +66,22 @@ suspend fun main() { ...@@ -76,11 +66,22 @@ suspend fun main() {
} }
} }
//通过 KClass 扩展方式监听事件
GroupMessageEvent::class.subscribeAlways { GroupMessageEvent::class.subscribeAlways {
when { when {
it.message.contains("复读") -> it.reply(it.message) it.message.contains("复读") -> it.reply(it.message)
} }
} }
//DSL 监听
FriendMessageEvent::class.subscribeAll {
always {
//获取第一个纯文本消息
val firstText = it.message[PlainText]
}
}
} }
...@@ -90,9 +91,9 @@ suspend fun main() { ...@@ -90,9 +91,9 @@ suspend fun main() {
* 对机器人说 "停止", 机器人停止 * 对机器人说 "停止", 机器人停止
*/ */
fun demo2() { fun demo2() {
FriendMessageEvent.subscribeAlways { event -> subscribeAlways<FriendMessageEvent> { event ->
if (event.message eq "记笔记") { if (event.message eq "记笔记") {
FriendMessageEvent.subscribeUntilFalse { FriendMessageEvent::class.subscribeUntilFalse {
it.reply("你发送了 ${it.message}") it.reply("你发送了 ${it.message}")
it.message eq "停止" it.message eq "停止"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment