Merge remote-tracking branch 'origin/master'

This commit is contained in:
PeratX 2019-10-09 17:44:58 +08:00
commit 0ea0bf233b
19 changed files with 136 additions and 150 deletions

View File

@ -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)
/**
* 监听一个事件. 可同时进行多种方式的监听

View File

@ -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)

View File

@ -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
}
}

View File

@ -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)
}
}

View File

@ -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)

View File

@ -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
}

View File

@ -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)

View File

@ -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
}

View File

@ -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)

View File

@ -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
}

View File

@ -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)

View File

@ -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)
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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()
}
}
}

View File

@ -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()

View File

@ -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 "停止"