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)
......
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)
......
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,9 +72,10 @@ internal suspend fun <E : Event> E.broadcastInternal(): E { ...@@ -64,9 +72,10 @@ 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>)
} }
...@@ -74,3 +83,14 @@ internal suspend fun <E : Event> E.broadcastInternal(): E { ...@@ -74,3 +83,14 @@ internal suspend fun <E : Event> E.broadcastInternal(): 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
...@@ -335,24 +327,3 @@ fun DataInputStream.gotoWhere(matcher: ByteArray): DataInputStream { ...@@ -335,24 +327,3 @@ fun DataInputStream.gotoWhere(matcher: ByteArray): DataInputStream {
} }
} while (true) } while (true)
} }
\ No newline at end of file
@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