Commit 9a0092ff authored by Him188's avatar Him188 Committed by Him188moe

Updated packets

parent 70dc6cf6
......@@ -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 {
......
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);
}
}
......@@ -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()
}
......
......@@ -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))
}
......
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