Updated network

This commit is contained in:
Him188moe 2019-09-13 12:35:59 +08:00
parent ef98f22d54
commit fcaadfdb24
7 changed files with 49 additions and 66 deletions

View File

@ -2,7 +2,10 @@ package net.mamoe.mirai.network
import net.mamoe.mirai.network.BotNetworkHandlerImpl.BotSocket
import net.mamoe.mirai.network.BotNetworkHandlerImpl.Login
import net.mamoe.mirai.network.handler.*
import net.mamoe.mirai.network.handler.ActionPacketHandler
import net.mamoe.mirai.network.handler.DataPacketSocket
import net.mamoe.mirai.network.handler.MessagePacketHandler
import net.mamoe.mirai.network.handler.PacketHandler
import net.mamoe.mirai.network.packet.ClientPacket
import net.mamoe.mirai.network.packet.Packet
import net.mamoe.mirai.network.packet.ServerEventPacket
@ -35,13 +38,6 @@ interface BotNetworkHandler : Closeable {
*/
val socket: DataPacketSocket
/**
* Debug 包处理器. 仅输出包的信息. 调试阶段使用
*
* java 调用方式: `botNetWorkHandler.getDebug()`
*/
var debug: DebugPacketHandler
/**
* 消息处理. 如发送好友消息, 接受群消息并触发事件
*

View File

@ -35,7 +35,6 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
lateinit var login: Login
override lateinit var debug: DebugPacketHandler
override lateinit var message: MessagePacketHandler
override lateinit var action: ActionPacketHandler
@ -75,11 +74,9 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
private fun onLoggedIn(sessionKey: ByteArray) {
val session = LoginSession(bot, sessionKey, socket)
debug = DebugPacketHandler(session)
message = MessagePacketHandler(session)
action = ActionPacketHandler(session)
packetHandlers.add(debug.asNode())
packetHandlers.add(message.asNode())
packetHandlers.add(action.asNode())
}
@ -104,8 +101,18 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
return
}
//For debug
kotlin.run {
if (!packet.javaClass.name.endsWith("Encrypted") && !packet.javaClass.name.endsWith("Raw")) {
bot.notice("Packet received: $packet")
}
if (packet is ServerEventPacket) {
sendPacket(ClientMessageResponsePacket(bot.account.qqNumber, packet.packetId, sessionKey, packet.eventIdentity))
}
}
if (ServerPacketReceivedEvent(bot, packet).broadcast().isCancelled) {
debug.onPacketReceived(packet)
return
}
@ -368,6 +375,14 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
socket.sendPacket(ClientHeartbeatPacket(bot.account.qqNumber, sessionKey))
}, 90000, 90000, TimeUnit.MILLISECONDS)
this.tlv0105 = packet.tlv0105
socket.loginFuture!!.complete(LoginState.SUCCESS)
login.changeOnlineStatus(ClientLoginStatus.ONLINE)
}
is ServerLoginSuccessPacket -> {
BotLoginSucceedEvent(bot).broadcast()
//登录成功后会收到大量上次的消息, 忽略掉
@ -375,9 +390,6 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
message.ignoreMessage = false
}, 3, TimeUnit.SECONDS)
this.tlv0105 = packet.tlv0105
socket.loginFuture!!.complete(LoginState.SUCCESS)
onLoggedIn(sessionKey)
}
@ -391,7 +403,6 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
is ServerTouchResponsePacket.Encrypted -> socket.distributePacket(packet.decrypt())
is ServerLoginSuccessPacket,
is ServerHeartbeatResponsePacket,
is UnknownServerPacket -> {
//ignored
@ -402,6 +413,10 @@ internal class BotNetworkHandlerImpl(private val bot: Bot) : BotNetworkHandler {
}
}
fun changeOnlineStatus(status: ClientLoginStatus) {
socket.sendPacket(ClientChangeOnlineStatusPacket(bot.account.qqNumber, sessionKey, status))
}
override fun close() {
this.captchaCache = null

View File

@ -9,9 +9,7 @@ import net.mamoe.mirai.network.packet.action.ServerCanAddFriendResponsePacket
import net.mamoe.mirai.network.packet.image.ServerTryUploadGroupImageFailedPacket
import net.mamoe.mirai.network.packet.image.ServerTryUploadGroupImageResponsePacket
import net.mamoe.mirai.network.packet.image.ServerTryUploadGroupImageSuccessPacket
import net.mamoe.mirai.network.packet.login.ClientChangeOnlineStatusPacket
import net.mamoe.mirai.task.MiraiThreadPool
import net.mamoe.mirai.utils.ClientLoginStatus
import net.mamoe.mirai.utils.getGTK
import java.awt.image.BufferedImage
import java.io.Closeable
@ -96,11 +94,6 @@ class ActionPacketHandler(session: LoginSession) : PacketHandler(session) {
session.socket.sendPacket(ClientSKeyRequestPacket(session.bot.account.qqNumber, session.sessionKey))
}
@ExperimentalUnsignedTypes
fun changeOnlineStatus(status: ClientLoginStatus) {
session.socket.sendPacket(ClientChangeOnlineStatusPacket(session.bot.account.qqNumber, session.sessionKey, status))
}
@ExperimentalUnsignedTypes
fun requestAccountInfo() {
session.socket.sendPacket(ClientAccountInfoRequestPacket(session.bot.account.qqNumber, session.sessionKey))

View File

@ -1,26 +0,0 @@
package net.mamoe.mirai.network.handler
import net.mamoe.mirai.network.LoginSession
import net.mamoe.mirai.network.packet.ClientMessageResponsePacket
import net.mamoe.mirai.network.packet.ServerEventPacket
import net.mamoe.mirai.network.packet.ServerPacket
import net.mamoe.mirai.utils.notice
/**
* Kind of [PacketHandler] that prints all packets received in the format of hex byte array.
*
* @author Him188moe
*/
class DebugPacketHandler(session: LoginSession) : PacketHandler(session) {
@ExperimentalUnsignedTypes
override fun onPacketReceived(packet: ServerPacket) {
if (!packet.javaClass.name.endsWith("Encrypted") && !packet.javaClass.name.endsWith("Raw")) {
session.bot.notice("Packet received: $packet")
}
if (packet is ServerEventPacket) {
session.socket.sendPacket(ClientMessageResponsePacket(session.bot.account.qqNumber, packet.packetId, session.sessionKey, packet.eventIdentity))
}
}
}

View File

@ -1,3 +1,7 @@
@file:Suppress("EXPERIMENTAL_API_USAGE")
//to simplify code
package net.mamoe.mirai.network.packet
import net.mamoe.mirai.network.packet.PacketNameFormatter.adjustName
@ -46,7 +50,6 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
companion object {
@ExperimentalUnsignedTypes
fun ofByteArray(bytes: ByteArray): ServerPacket {
val stream = bytes.dataInputStream()
@ -119,9 +122,8 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
}
@ExperimentalUnsignedTypes
override fun toString(): String {
return adjustName(this.javaClass.simpleName + "(${this.getFixedId()})") + this.getAllDeclaredFields().filterNot { it.name == "idHex" || it.name == "encoded" }.joinToString(", ", "{", "}") {
return adjustName(this.javaClass.simpleName + "(${this.getFixedId()})") + this.getAllDeclaredFields().filterNot { it.name == "idHex" || it.name == "idByteArray" || it.name == "encoded" }.joinToString(", ", "{", "}") {
it.trySetAccessible(); it.name + "=" + it.get(this).let { value ->
when (value) {
is ByteArray -> value.toUHexString()
@ -146,26 +148,26 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
return decryptAsByteArray(key).dataInputStream()
}
@ExperimentalUnsignedTypes
fun decryptBy(keyHex: String): DataInputStream {
return this.decryptBy(keyHex.hexToBytes())
}
fun decryptBy(key1: ByteArray, key2: ByteArray): DataInputStream {
return TEA.decrypt(this.decryptAsByteArray(key1), key2).dataInputStream();
return TEA.decrypt(this.decryptAsByteArray(key1), key2).dataInputStream()
}
@ExperimentalUnsignedTypes
fun decryptBy(key1: String, key2: ByteArray): DataInputStream {
return this.decryptBy(key1.hexToBytes(), key2)
}
@ExperimentalUnsignedTypes
fun decryptBy(key1: ByteArray, key2: String): DataInputStream {
return this.decryptBy(key1, key2.hexToBytes())
}
@ExperimentalUnsignedTypes
fun decryptBy(keyHex1: String, keyHex2: String): DataInputStream {
return this.decryptBy(keyHex1.hexToBytes(), keyHex2.hexToBytes())
}
@ -177,7 +179,6 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
}
@ExperimentalUnsignedTypes
fun DataInputStream.readIP(): String {
var buff = ""
for (i in 0..3) {
@ -208,7 +209,7 @@ fun ByteArray.dataInputStream(): DataInputStream = DataInputStream(this.inputStr
*/
infix fun <N : Number> DataInputStream.goto(position: N): DataInputStream {
this.reset()
this.skip(position.toLong());
this.skip(position.toLong())
return this
}
@ -239,26 +240,26 @@ fun DataInputStream.readNBytesIn(range: IntRange): ByteArray {
fun <N : Number> DataInputStream.readIntAt(position: N): Int {
this.goto(position)
return this.readInt();
return this.readInt()
}
@ExperimentalUnsignedTypes
fun <N : Number> DataInputStream.readUIntAt(position: N): UInt {
this.goto(position)
return this.readNBytes(4).toUInt();
return this.readNBytes(4).toUInt()
}
fun <N : Number> DataInputStream.readByteAt(position: N): Byte {
this.goto(position)
return this.readByte();
return this.readByte()
}
fun <N : Number> DataInputStream.readShortAt(position: N): Short {
this.goto(position)
return this.readShort();
return this.readShort()
}
@ExperimentalUnsignedTypes
@JvmSynthetic
fun DataInputStream.gotoWhere(matcher: UByteArray): DataInputStream {
return this.gotoWhere(matcher.toByteArray())

View File

@ -29,4 +29,6 @@ class ClientChangeOnlineStatusPacket(
it.writeHex("00 01 00 01 00 04 00 00 00 00")
}
}
}
}

View File

@ -1,5 +1,6 @@
package net.mamoe.mirai.network.packet.login
import net.mamoe.mirai.network.packet.PacketId
import net.mamoe.mirai.network.packet.ServerPacket
import java.io.DataInputStream
@ -8,4 +9,5 @@ import java.io.DataInputStream
*
* @author Him188moe
*/
@PacketId("00 EC")
class ServerLoginSuccessPacket(input: DataInputStream) : ServerPacket(input)