Updated packets

This commit is contained in:
Him188 2019-09-06 22:20:16 +08:00 committed by Him188moe
parent 70dc6cf63c
commit 9a0092ffca
4 changed files with 41 additions and 25 deletions

View File

@ -5,6 +5,8 @@ import net.mamoe.mirai.network.packet.ClientPacket;
import org.jetbrains.annotations.NotNull;
/**
* Packet 已经 {@link ClientPacket#encode()}, 即将被发送
*
* @author Him188moe
*/
public final class BeforePacketSendEvent extends ClientPacketEvent implements Cancellable {

View File

@ -0,0 +1,15 @@
package net.mamoe.mirai.event.events.network;
import net.mamoe.mirai.network.packet.ClientPacket;
import org.jetbrains.annotations.NotNull;
/**
* Packet 已经发出
*
* @author Him188moe
*/
public final class PacketSentEvent extends ClientPacketEvent {
public PacketSentEvent(@NotNull ClientPacket packet) {
super(packet);
}
}

View File

@ -5,6 +5,8 @@ package net.mamoe.mirai.network
import net.mamoe.mirai.Robot
import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.QQ
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.qq.FriendMessageEvent
import net.mamoe.mirai.event.events.robot.RobotLoginSucceedEvent
@ -197,12 +199,17 @@ class RobotNetworkHandler(private val robot: Robot) : Closeable {
checkNotNull(socket) { "socket closed" }
try {
packet.encode()
packet.writeHex(Protocol.tail)
packet.encodePacket()
if (BeforePacketSendEvent(packet).broadcast().isCancelled) {
return
}
val data = packet.toByteArray()
socket!!.send(DatagramPacket(data, data.size))
MiraiLogger info "Packet sent: $packet"
PacketSentEvent(packet).broadcast()
} catch (e: Throwable) {
e.printStackTrace()
}

View File

@ -14,11 +14,13 @@ import java.security.MessageDigest
@ExperimentalUnsignedTypes
abstract class ClientPacket : ByteArrayDataOutputStream(), Packet {
@Getter
val packageId: String
val idHex: String
var encoded: Boolean = false
init {
val annotation = this.javaClass.getAnnotation(PacketId::class.java)
packageId = annotation.value
idHex = annotation.value
try {
this.writeHex(Protocol.head)
@ -32,7 +34,7 @@ abstract class ClientPacket : ByteArrayDataOutputStream(), Packet {
@Throws(IOException::class)
fun writePacketId() {
this.writeHex(this@ClientPacket.packageId)
this.writeHex(this@ClientPacket.idHex)
}
/**
@ -42,11 +44,19 @@ abstract class ClientPacket : ByteArrayDataOutputStream(), Packet {
* Before sending the packet, a [tail][Protocol.tail] will be added.
*/
@Throws(IOException::class)
abstract fun encode()
protected abstract fun encode()
fun encodePacket() {
if (encoded) {
return
}
encode()
writeHex(Protocol.tail)
}
@Throws(IOException::class)
fun encodeToByteArray(): ByteArray {
encode()
encodePacket()
return toByteArray()
}
@ -88,24 +98,6 @@ fun DataOutputStream.writeHex(hex: String) {
}
}
@ExperimentalUnsignedTypes
fun DataOutputStream.writeVarInt(dec: UInt) {
/*.判断开始 (n 256)
返回 (取文本右边 (0 取十六进制文本 (n), 2))
.判断 (n 256)
hex 取文本右边 (0 取十六进制文本 (n), 4)
返回 (取文本左边 (hex, 2) 取文本右边 (hex, 2))
.默认
返回 ()
.判断结束*/
when {
dec < 256u -> this.writeByte(dec.toByte().toInt())//drop other bits
dec > 256u -> this.writeShort(dec.toShort().toInt())
else -> throw IllegalArgumentException(dec.toString())
}
}
fun DataOutputStream.encryptAndWrite(byteArray: ByteArray, key: ByteArray) {
this.write(TEA.encrypt(byteArray, key))
}