mirror of
https://github.com/mamoe/mirai.git
synced 2025-02-08 20:39:36 +08:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
0ea0bf233b
@ -10,6 +10,8 @@ enum class ListeningStatus {
|
||||
STOPPED
|
||||
}
|
||||
|
||||
/* KClass 的扩展方法 */
|
||||
|
||||
@Synchronized
|
||||
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)
|
||||
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)
|
||||
|
||||
/* 顶层方法 */
|
||||
|
||||
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)
|
||||
|
||||
|
||||
/**
|
||||
* 监听一个事件. 可同时进行多种方式的监听
|
||||
|
@ -0,0 +1,11 @@
|
||||
package net.mamoe.mirai.event.events
|
||||
|
||||
import net.mamoe.mirai.Bot
|
||||
import net.mamoe.mirai.event.Event
|
||||
|
||||
/**
|
||||
* @author Him188moe
|
||||
*/
|
||||
abstract class BotEvent(val bot: Bot) : Event()
|
||||
|
||||
class BotLoginSucceedEvent(bot: Bot) : BotEvent(bot)
|
@ -1,10 +1,14 @@
|
||||
package net.mamoe.mirai.event.events.qq
|
||||
package net.mamoe.mirai.event.events
|
||||
|
||||
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
|
||||
*/
|
||||
abstract class FriendEvent(bot: Bot, val sender: QQ) : BotEvent(bot)
|
||||
|
||||
/**
|
||||
* 接受好友消息事件
|
||||
@ -12,8 +16,6 @@ import kotlin.reflect.KClass
|
||||
* @author Him188moe
|
||||
*/
|
||||
class FriendMessageEvent(bot: Bot, sender: QQ, val message: MessageChain) : FriendEvent(bot, sender) {
|
||||
companion object : KClass<FriendMessageEvent> by FriendMessageEvent::class
|
||||
|
||||
@JvmSynthetic
|
||||
suspend inline fun reply(message: Message) = sender.sendMessage(message)
|
||||
|
||||
@ -25,4 +27,4 @@ class FriendMessageEvent(bot: Bot, sender: QQ, val message: MessageChain) : Frie
|
||||
|
||||
@JvmSynthetic
|
||||
suspend inline fun reply(message: MessageChain) = sender.sendMessage(message)//shortcut
|
||||
}
|
||||
}
|
@ -1,18 +1,20 @@
|
||||
package net.mamoe.mirai.event.events.group
|
||||
package net.mamoe.mirai.event.events
|
||||
|
||||
import net.mamoe.mirai.Bot
|
||||
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
|
||||
*/
|
||||
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<GroupMessageEvent> by GroupMessageEvent::class
|
||||
|
||||
@JvmSynthetic
|
||||
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
|
||||
|
||||
@JvmSynthetic
|
||||
suspend inline fun reply(message: MessageChain) = group.sendMessage(message)
|
||||
}
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
package net.mamoe.mirai.event.events
|
||||
|
||||
import net.mamoe.mirai.Bot
|
||||
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
|
||||
|
||||
/* 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 BeforePacketSendEvent<P : ClientPacket>(bot: Bot, packet: P) : ClientPacketEvent<P>(bot, packet), Cancellable
|
||||
|
||||
|
||||
/* 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)
|
@ -1,14 +0,0 @@
|
||||
package net.mamoe.mirai.event.events.bot
|
||||
|
||||
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<BotLoginSucceedEvent> by BotLoginSucceedEvent::class
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
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)
|
@ -1,22 +0,0 @@
|
||||
package net.mamoe.mirai.event.events.network
|
||||
|
||||
import net.mamoe.mirai.Bot
|
||||
import net.mamoe.mirai.event.Cancellable
|
||||
import net.mamoe.mirai.network.protocol.tim.packet.ClientPacket
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
abstract 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) {
|
||||
companion object : KClass<PacketSentEvent<*>> by PacketSentEvent::class
|
||||
}
|
||||
|
||||
/**
|
||||
* 包发送前. 可被取消
|
||||
*/
|
||||
class BeforePacketSendEvent<P : ClientPacket>(bot: Bot, packet: P) : ClientPacketEvent<P>(bot, packet), Cancellable {
|
||||
companion object : KClass<BeforePacketSendEvent<*>> by BeforePacketSendEvent::class
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
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)
|
@ -1,12 +0,0 @@
|
||||
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
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
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)
|
@ -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 <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
|
||||
internal class EventListeners<E : Event> : MutableList<Listener<E>> by mutableListOf()
|
||||
|
||||
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")
|
||||
internal fun <E : Event> get(clazz: KClass<E>): EventListeners<E> {
|
||||
synchronized(clazz) {
|
||||
if (REGISTRIES.containsKey(clazz)) {
|
||||
return REGISTRIES[clazz] as EventListeners<E>
|
||||
if (registries.containsKey(clazz)) {
|
||||
return registries[clazz] as EventListeners<E>
|
||||
} else {
|
||||
EventListeners<E>().let {
|
||||
REGISTRIES[clazz] = it
|
||||
registries[clazz] = it
|
||||
return it
|
||||
}
|
||||
}
|
||||
@ -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 {
|
||||
//println("super: " + it.simpleName)
|
||||
//todo multi platform
|
||||
if (Event::class.java.isAssignableFrom(it.java)) {
|
||||
callListeners((it as KClass<out Event>).listeners as EventListeners<in E>)
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
@ -6,10 +6,10 @@ import kotlinx.coroutines.sync.withLock
|
||||
import net.mamoe.mirai.Bot
|
||||
import net.mamoe.mirai.event.ListeningStatus
|
||||
import net.mamoe.mirai.event.broadcast
|
||||
import net.mamoe.mirai.event.events.bot.BotLoginSucceedEvent
|
||||
import net.mamoe.mirai.event.events.network.BeforePacketSendEvent
|
||||
import net.mamoe.mirai.event.events.network.PacketSentEvent
|
||||
import net.mamoe.mirai.event.events.network.ServerPacketReceivedEvent
|
||||
import net.mamoe.mirai.event.events.BeforePacketSendEvent
|
||||
import net.mamoe.mirai.event.events.BotLoginSucceedEvent
|
||||
import net.mamoe.mirai.event.events.PacketSentEvent
|
||||
import net.mamoe.mirai.event.events.ServerPacketReceivedEvent
|
||||
import net.mamoe.mirai.event.subscribe
|
||||
import net.mamoe.mirai.network.BotNetworkHandler
|
||||
import net.mamoe.mirai.network.LoginSession
|
||||
@ -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
|
||||
|
@ -1,9 +1,9 @@
|
||||
package net.mamoe.mirai.network.protocol.tim.handler
|
||||
|
||||
import net.mamoe.mirai.Bot
|
||||
import net.mamoe.mirai.event.events.network.ServerPacketReceivedEvent
|
||||
import net.mamoe.mirai.network.protocol.tim.TIMBotNetworkHandler
|
||||
import net.mamoe.mirai.event.events.ServerPacketReceivedEvent
|
||||
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.ServerPacket
|
||||
|
||||
|
@ -3,8 +3,8 @@ package net.mamoe.mirai.network.protocol.tim.handler
|
||||
import net.mamoe.mirai.contact.Group
|
||||
import net.mamoe.mirai.contact.QQ
|
||||
import net.mamoe.mirai.event.broadcast
|
||||
import net.mamoe.mirai.event.events.group.GroupMessageEvent
|
||||
import net.mamoe.mirai.event.events.qq.FriendMessageEvent
|
||||
import net.mamoe.mirai.event.events.FriendMessageEvent
|
||||
import net.mamoe.mirai.event.events.GroupMessageEvent
|
||||
import net.mamoe.mirai.getGroupByNumber
|
||||
import net.mamoe.mirai.getQQ
|
||||
import net.mamoe.mirai.message.defaults.MessageChain
|
||||
|
@ -41,7 +41,7 @@ abstract class ClientPacket : ByteArrayDataOutputStream(), 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)
|
||||
protected abstract fun encode()
|
||||
|
@ -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.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.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 <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()
|
||||
}
|
||||
}
|
||||
}
|
@ -85,7 +85,7 @@ object Main {
|
||||
* 4. 双击跳转
|
||||
* 5. 断点并在TIM发送消息以触发
|
||||
* 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()
|
||||
|
||||
|
@ -2,8 +2,8 @@ package demo1
|
||||
|
||||
import net.mamoe.mirai.Bot
|
||||
import net.mamoe.mirai.contact.Group
|
||||
import net.mamoe.mirai.event.events.group.GroupMessageEvent
|
||||
import net.mamoe.mirai.event.events.qq.FriendMessageEvent
|
||||
import net.mamoe.mirai.event.events.FriendMessageEvent
|
||||
import net.mamoe.mirai.event.events.GroupMessageEvent
|
||||
import net.mamoe.mirai.event.subscribeAll
|
||||
import net.mamoe.mirai.event.subscribeAlways
|
||||
import net.mamoe.mirai.event.subscribeUntilFalse
|
||||
@ -33,18 +33,8 @@ suspend fun main() {
|
||||
}
|
||||
|
||||
|
||||
//DSL 监听
|
||||
FriendMessageEvent.subscribeAll {
|
||||
always {
|
||||
//获取第一个纯文本消息
|
||||
val firstText = it.message[PlainText]
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//监听事件:
|
||||
FriendMessageEvent.subscribeAlways {
|
||||
//提供泛型以监听事件
|
||||
subscribeAlways<FriendMessageEvent> {
|
||||
//获取第一个纯文本消息
|
||||
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<FriendMessageEvent> { event ->
|
||||
if (event.message eq "记笔记") {
|
||||
FriendMessageEvent.subscribeUntilFalse {
|
||||
FriendMessageEvent::class.subscribeUntilFalse {
|
||||
it.reply("你发送了 ${it.message}")
|
||||
|
||||
it.message eq "停止"
|
||||
|
Loading…
Reference in New Issue
Block a user