From 011417249f0f4aaf548d6a9a6413c8addcc6a6cd Mon Sep 17 00:00:00 2001
From: Him188moe <Him188@mamoe.net>
Date: Sat, 17 Aug 2019 22:09:26 +0800
Subject: [PATCH 1/4] update

---
 .../src/main/java/net/mamoe/mirai/network/Robot.kt |  2 +-
 .../packet/client/ClientSendMessagePacket.kt       | 11 +++++++++++
 .../client/{ => login}/ClientHeartbeatPacket.kt    |  8 ++++++--
 .../{ => login}/ClientPasswordSubmissionPacket.kt  |  7 ++++---
 .../{ => login}/ClientServerRedirectionPacket.kt   |  6 +++++-
 .../ClientTouchPacket.kt}                          | 14 +++++++++++---
 .../network/packet/server/Server0825Packet.kt      |  3 +++
 7 files changed, 41 insertions(+), 10 deletions(-)
 create mode 100644 mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientSendMessagePacket.kt
 rename mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/{ => login}/ClientHeartbeatPacket.kt (66%)
 rename mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/{ => login}/ClientPasswordSubmissionPacket.kt (95%)
 rename mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/{ => login}/ClientServerRedirectionPacket.kt (82%)
 rename mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/{ClientLoginPacket.kt => login/ClientTouchPacket.kt} (91%)

diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt
index 204fd8404..2b05d4da0 100644
--- a/mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt
+++ b/mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt
@@ -11,7 +11,7 @@ import io.netty.channel.socket.nio.NioSocketChannel
 import io.netty.handler.codec.bytes.ByteArrayDecoder
 import io.netty.handler.codec.bytes.ByteArrayEncoder
 import net.mamoe.mirai.network.packet.client.ClientPacket
-import net.mamoe.mirai.network.packet.client.ClientServerRedirectionPacket
+import net.mamoe.mirai.network.packet.client.login.ClientServerRedirectionPacket
 import net.mamoe.mirai.network.packet.client.writeHex
 import net.mamoe.mirai.network.packet.server.Server0825Packet
 import net.mamoe.mirai.network.packet.server.ServerPacket
diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientSendMessagePacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientSendMessagePacket.kt
new file mode 100644
index 000000000..85244ef9b
--- /dev/null
+++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientSendMessagePacket.kt
@@ -0,0 +1,11 @@
+package net.mamoe.mirai.network.packet.client
+
+/**
+ * @author Him188moe @ Mirai Project
+ */
+@ExperimentalUnsignedTypes
+class ClientSendMessagePacket : ClientPacket() {
+    override fun encode() {
+
+    }
+}
\ No newline at end of file
diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientHeartbeatPacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientHeartbeatPacket.kt
similarity index 66%
rename from mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientHeartbeatPacket.kt
rename to mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientHeartbeatPacket.kt
index 31904d469..ec5457c86 100644
--- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientHeartbeatPacket.kt
+++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientHeartbeatPacket.kt
@@ -1,7 +1,11 @@
-package net.mamoe.mirai.network.packet.client
+package net.mamoe.mirai.network.packet.client.login
 
 import net.mamoe.mirai.network.Protocol
 import net.mamoe.mirai.network.packet.PacketId
+import net.mamoe.mirai.network.packet.client.ClientPacket
+import net.mamoe.mirai.network.packet.client.writeHex
+import net.mamoe.mirai.network.packet.client.writeQQ
+import net.mamoe.mirai.network.packet.client.writeRandom
 import net.mamoe.mirai.util.TEACryptor
 import java.io.IOException
 
@@ -9,7 +13,7 @@ import java.io.IOException
  * @author Him188moe @ Mirai Project
  */
 @ExperimentalUnsignedTypes
-@PacketId("00 58")
+@PacketId("00 58")//todo check
 class ClientHeartbeatPacket : ClientPacket() {
     var qq: Int = 0
     var sessionKey: ByteArray? = null//登录后获得
diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientPasswordSubmissionPacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientPasswordSubmissionPacket.kt
similarity index 95%
rename from mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientPasswordSubmissionPacket.kt
rename to mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientPasswordSubmissionPacket.kt
index fb633157e..070da00f9 100644
--- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientPasswordSubmissionPacket.kt
+++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientPasswordSubmissionPacket.kt
@@ -1,7 +1,8 @@
-package net.mamoe.mirai.network.packet.client
+package net.mamoe.mirai.network.packet.client.login
 
 import net.mamoe.mirai.network.Protocol
 import net.mamoe.mirai.network.packet.PacketId
+import net.mamoe.mirai.network.packet.client.*
 import net.mamoe.mirai.util.TEACryptor
 import net.mamoe.mirai.util.getCrc32
 import net.mamoe.mirai.util.getRandomKey
@@ -14,7 +15,7 @@ import java.net.InetAddress
  *
  * @author Him188moe @ Mirai Project
  */
-@PacketId("08 36 31 03")
+@PacketId("08 36 31 03")//may be 08 36, 31 03 has another meaning
 @ExperimentalUnsignedTypes
 class ClientPasswordSubmissionPacket(private val qq: Int, private val password: String, private val loginTime: ByteArray, private val loginIP: ByteArray, private val tgtgtKey: ByteArray, private val token0825: ByteArray) : ClientPacket() {
     @ExperimentalUnsignedTypes
@@ -81,7 +82,7 @@ class ClientPasswordSubmissionPacket(private val qq: Int, private val password:
 
                 this.writeHex("01 02")//tag
                 this.writeHex("00 62")//length
-                this.writeHex("00 01")//word?
+                this.writeHex("00 01")//word
                 this.writeHex("04 EB B7 C1 86 F9 08 96 ED 56 84 AB 50 85 2E 48")//key
                 this.writeHex("00 38")//length
                 //value
diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientServerRedirectionPacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientServerRedirectionPacket.kt
similarity index 82%
rename from mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientServerRedirectionPacket.kt
rename to mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientServerRedirectionPacket.kt
index 1d044b953..63b6ced5d 100644
--- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientServerRedirectionPacket.kt
+++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientServerRedirectionPacket.kt
@@ -1,7 +1,11 @@
-package net.mamoe.mirai.network.packet.client
+package net.mamoe.mirai.network.packet.client.login
 
 import net.mamoe.mirai.network.Protocol
 import net.mamoe.mirai.network.packet.PacketId
+import net.mamoe.mirai.network.packet.client.ClientPacket
+import net.mamoe.mirai.network.packet.client.writeHex
+import net.mamoe.mirai.network.packet.client.writeIp
+import net.mamoe.mirai.network.packet.client.writeQQ
 import net.mamoe.mirai.util.TEACryptor
 import net.mamoe.mirai.util.hexToBytes
 import java.io.IOException
diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientLoginPacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientTouchPacket.kt
similarity index 91%
rename from mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientLoginPacket.kt
rename to mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientTouchPacket.kt
index 1f97c6adc..1e9b1de34 100644
--- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientLoginPacket.kt
+++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientTouchPacket.kt
@@ -1,18 +1,26 @@
-package net.mamoe.mirai.network.packet.client
+package net.mamoe.mirai.network.packet.client.login
 
 import net.mamoe.mirai.network.Protocol
 import net.mamoe.mirai.network.packet.PacketId
+import net.mamoe.mirai.network.packet.client.ClientPacket
+import net.mamoe.mirai.network.packet.client.writeHex
+import net.mamoe.mirai.network.packet.client.writeIp
+import net.mamoe.mirai.network.packet.client.writeQQ
 import net.mamoe.mirai.util.ByteArrayDataOutputStream
 import net.mamoe.mirai.util.TEACryptor
 import net.mamoe.mirai.util.toHexString
 import java.io.IOException
 
 /**
+ * The packet to touch server.
+ *
+ * @see net.mamoe.mirai.network.packet.server.Server0825Packet
+ *
  * @author Him188moe @ Mirai Project
  */
 @ExperimentalUnsignedTypes
 @PacketId("08 25 31 01")
-class ClientLoginPacket : ClientPacket() {
+class ClientTouchPacket : ClientPacket() {
     var qq: Int = 0
 
     @ExperimentalUnsignedTypes
@@ -49,7 +57,7 @@ class ClientLoginPacket : ClientPacket() {
 
 @ExperimentalUnsignedTypes
 fun main() {
-    val pk = ClientLoginPacket()
+    val pk = ClientTouchPacket()
     pk.qq = 1994701021
     pk.encode()
     pk.writeHex(Protocol.tail)
diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/Server0825Packet.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/Server0825Packet.kt
index ce364b602..996937b3c 100644
--- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/Server0825Packet.kt
+++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/Server0825Packet.kt
@@ -6,6 +6,9 @@ import java.io.DataInputStream
 /**
  * A packet received when logging in, used to redirect server address
  *
+ * @see net.mamoe.mirai.network.packet.client.login.ClientServerRedirectionPacket
+ * @see net.mamoe.mirai.network.packet.client.login.ClientPasswordSubmissionPacket
+ *
  * @author Him188moe @ Mirai Project
  */
 class Server0825Packet(private val type: Type, inputStream: DataInputStream) : ServerPacket(inputStream) {

From fdde4cae5abcef11043741731c1dd7bd4fee8974 Mon Sep 17 00:00:00 2001
From: Him188moe <Him188@mamoe.net>
Date: Sat, 17 Aug 2019 22:14:05 +0800
Subject: [PATCH 2/4] update

---
 mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt   | 4 ++--
 .../mirai/network/packet/client/login/ClientTouchPacket.kt  | 2 +-
 .../net/mamoe/mirai/network/packet/server/ServerPacket.kt   | 5 ++---
 .../{Server0825Packet.kt => ServerTouchResponsePacket.kt}   | 2 +-
 mirai-core/src/test/java/NetworkTest.java                   | 6 ------
 mirai-core/src/test/java/PacketTest.kt                      | 6 ++----
 6 files changed, 8 insertions(+), 17 deletions(-)
 rename mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/{Server0825Packet.kt => ServerTouchResponsePacket.kt} (93%)

diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt
index 2b05d4da0..df83d8216 100644
--- a/mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt
+++ b/mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt
@@ -13,8 +13,8 @@ import io.netty.handler.codec.bytes.ByteArrayEncoder
 import net.mamoe.mirai.network.packet.client.ClientPacket
 import net.mamoe.mirai.network.packet.client.login.ClientServerRedirectionPacket
 import net.mamoe.mirai.network.packet.client.writeHex
-import net.mamoe.mirai.network.packet.server.Server0825Packet
 import net.mamoe.mirai.network.packet.server.ServerPacket
+import net.mamoe.mirai.network.packet.server.ServerTouchResponsePacket
 import net.mamoe.mirai.utils.MiraiLogger
 import java.net.DatagramPacket
 import java.net.InetSocketAddress
@@ -31,7 +31,7 @@ class Robot(val number: Int) {
     @ExperimentalUnsignedTypes
     internal fun onPacketReceived(packet: ServerPacket) {
         packet.decode()
-        if (packet is Server0825Packet) {
+        if (packet is ServerTouchResponsePacket) {
             connect(packet.serverIP)
             sendPacket(ClientServerRedirectionPacket(packet.serverIP, number))
         }
diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientTouchPacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientTouchPacket.kt
index 1e9b1de34..b3afbdee2 100644
--- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientTouchPacket.kt
+++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientTouchPacket.kt
@@ -14,7 +14,7 @@ import java.io.IOException
 /**
  * The packet to touch server.
  *
- * @see net.mamoe.mirai.network.packet.server.Server0825Packet
+ * @see net.mamoe.mirai.network.packet.server.ServerTouchResponsePacket
  *
  * @author Him188moe @ Mirai Project
  */
diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerPacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerPacket.kt
index 28f14998c..47bdc7a44 100644
--- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerPacket.kt
+++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerPacket.kt
@@ -1,7 +1,6 @@
 package net.mamoe.mirai.network.packet.server
 
 import net.mamoe.mirai.network.packet.Packet
-import net.mamoe.mirai.network.packet.client.toHexString
 import net.mamoe.mirai.util.toHexString
 
 import java.io.DataInputStream
@@ -23,8 +22,8 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
             val idBytes = stream.readUntil(11)
 
             return when (idBytes.joinToString("") { it.toString(16) }) {
-                "08 25 31 01" -> Server0825Packet(Server0825Packet.Type.TYPE_08_25_31_01, stream)
-                "08 25 31 02" -> Server0825Packet(Server0825Packet.Type.TYPE_08_25_31_02, stream)
+                "08 25 31 01" -> ServerTouchResponsePacket(ServerTouchResponsePacket.Type.TYPE_08_25_31_01, stream)
+                "08 25 31 02" -> ServerTouchResponsePacket(ServerTouchResponsePacket.Type.TYPE_08_25_31_02, stream)
 
                 else -> throw UnsupportedOperationException()
             }
diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/Server0825Packet.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerTouchResponsePacket.kt
similarity index 93%
rename from mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/Server0825Packet.kt
rename to mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerTouchResponsePacket.kt
index 5aac96a7e..72cfa0b72 100644
--- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/Server0825Packet.kt
+++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerTouchResponsePacket.kt
@@ -11,7 +11,7 @@ import java.io.DataInputStream
  *
  * @author Him188moe @ Mirai Project
  */
-class Server0825Packet(private val type: Type, inputStream: DataInputStream) : ServerPacket(inputStream) {
+class ServerTouchResponsePacket(private val type: Type, inputStream: DataInputStream) : ServerPacket(inputStream) {
     lateinit var serverIP: String;
 
     var loginTime: Int = 0
diff --git a/mirai-core/src/test/java/NetworkTest.java b/mirai-core/src/test/java/NetworkTest.java
index d2a6055ea..2a05a5bfd 100644
--- a/mirai-core/src/test/java/NetworkTest.java
+++ b/mirai-core/src/test/java/NetworkTest.java
@@ -1,9 +1,3 @@
-import net.mamoe.mirai.network.packet.server.Server0825Packet;
-
-import java.io.ByteArrayInputStream;
-import java.io.DataInputStream;
-import java.io.InputStream;
-
 /**
  * @author Him188moe @ Mirai Project
  */
diff --git a/mirai-core/src/test/java/PacketTest.kt b/mirai-core/src/test/java/PacketTest.kt
index 423d771d5..51775c691 100644
--- a/mirai-core/src/test/java/PacketTest.kt
+++ b/mirai-core/src/test/java/PacketTest.kt
@@ -1,8 +1,6 @@
 import net.mamoe.mirai.network.packet.client.toHexString
-import net.mamoe.mirai.network.packet.server.Server0825Packet
-import net.mamoe.mirai.util.TEACryptor
+import net.mamoe.mirai.network.packet.server.ServerTouchResponsePacket
 import net.mamoe.mirai.util.hexToBytes
-import net.mamoe.mirai.util.hexToUBytes
 import net.mamoe.mirai.util.toHexString
 import java.io.DataInputStream
 
@@ -10,7 +8,7 @@ import java.io.DataInputStream
 fun main(){
     val data = "00 37 13 08 25 31 01 76 E4 B8 DD 03 00 00 00 01 2E 01 00 00 68 52 00 00 00 00 A4 F1 91 88 C9 82 14 99 0C 9E 56 55 91 23 C8 3D C3 47 F0 25 A1 8E 74 EF 1E 0B 32 5B 20 8A FA 3B 0B 52 8F 86 E6 04 F1 D6 F8 63 75 60 8C 0C 7D 06 D1 E0 22 F8 49 EF AF 61 EE 7E 69 72 EB 10 08 30 69 50 1C 84 A9 C2 16 D7 52 B9 1C 79 CA 5A CF FD BC AE D8 A6 BB DC 21 6E 79 26 E1 A2 23 11 AA B0 9A 49 39 72 ED 61 12 B6 88 4D A2 56 23 E9 92 11 92 27 4A 70 00 C9 01 7B 03"
     val s = DataInputStream(data.hexToBytes().inputStream())
-    val packet = Server0825Packet(Server0825Packet.Type.TYPE_08_25_31_01,s)
+    val packet = ServerTouchResponsePacket(ServerTouchResponsePacket.Type.TYPE_08_25_31_01, s)
     packet.decode()
     System.out.println(packet.token.toUByteArray().toHexString(" "))
     System.out.println(packet.loginTime.toHexString(" "))

From 21ffb8a7f06e7b04f9fbb15e200ba7215be315a9 Mon Sep 17 00:00:00 2001
From: Him188moe <Him188@mamoe.net>
Date: Sat, 17 Aug 2019 22:37:39 +0800
Subject: [PATCH 3/4] update

---
 .../main/java/net/mamoe/mirai/network/Robot.kt | 18 +++++++++++++++---
 .../network/packet/client/ClientPacket.kt      |  8 ++++----
 .../login/ClientPasswordSubmissionPacket.kt    |  2 +-
 .../login/ClientServerRedirectionPacket.kt     |  4 ++--
 .../packet/client/login/ClientTouchPacket.kt   | 15 ++++++++-------
 .../network/packet/server/ServerPacket.kt      |  2 +-
 .../packet/server/ServerTouchResponsePacket.kt |  4 ++--
 7 files changed, 33 insertions(+), 20 deletions(-)

diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt
index df83d8216..4a63cc215 100644
--- a/mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt
+++ b/mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt
@@ -11,6 +11,7 @@ import io.netty.channel.socket.nio.NioSocketChannel
 import io.netty.handler.codec.bytes.ByteArrayDecoder
 import io.netty.handler.codec.bytes.ByteArrayEncoder
 import net.mamoe.mirai.network.packet.client.ClientPacket
+import net.mamoe.mirai.network.packet.client.login.ClientPasswordSubmissionPacket
 import net.mamoe.mirai.network.packet.client.login.ClientServerRedirectionPacket
 import net.mamoe.mirai.network.packet.client.writeHex
 import net.mamoe.mirai.network.packet.server.ServerPacket
@@ -24,7 +25,7 @@ import java.net.InetSocketAddress
  *
  * @author Him188moe @ Mirai Project
  */
-class Robot(val number: Int) {
+class Robot(val number: Int, private val password: String) {
     private lateinit var channel: Channel
 
 
@@ -32,8 +33,19 @@ class Robot(val number: Int) {
     internal fun onPacketReceived(packet: ServerPacket) {
         packet.decode()
         if (packet is ServerTouchResponsePacket) {
-            connect(packet.serverIP)
-            sendPacket(ClientServerRedirectionPacket(packet.serverIP, number))
+            if (packet.serverIP != null) {//redirection
+                connect(packet.serverIP!!)
+                sendPacket(ClientServerRedirectionPacket(packet.serverIP!!, number))
+            } else {//password submission
+                sendPacket(ClientPasswordSubmissionPacket(
+                        qq = this.number,
+                        password = this.password,
+                        loginTime = packet.loginTime,
+                        loginIP = packet.loginIP,
+                        token0825 = packet.token,
+                        tgtgtKey = packet.tgtgtKey
+                ))
+            }
         }
     }
 
diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientPacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientPacket.kt
index a39bcdb66..ede45f97b 100644
--- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientPacket.kt
+++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/ClientPacket.kt
@@ -58,7 +58,7 @@ abstract class ClientPacket : ByteArrayDataOutputStream(), Packet {
 
 
 @Throws(IOException::class)
-fun DataOutputStream.writeIp(ip: String) {
+fun DataOutputStream.writeIP(ip: String) {
     for (s in ip.split("\\.".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()) {
         this.writeByte(s.toInt())
     }
@@ -78,7 +78,7 @@ fun DataOutputStream.writeHex(hex: String) {
 
 @ExperimentalUnsignedTypes
 @Throws(IOException::class)
-fun DataOutputStream.writeTLV0006(qq: Int, password: String, loginTime: ByteArray, loginIP: ByteArray, tgtgtKey: ByteArray) {
+fun DataOutputStream.writeTLV0006(qq: Int, password: String, loginTime: Int, loginIP: String, tgtgtKey: ByteArray) {
     ByteArrayDataOutputStream().let {
         it.writeRandom(4)
         it.writeHex("00 02")
@@ -89,10 +89,10 @@ fun DataOutputStream.writeTLV0006(qq: Int, password: String, loginTime: ByteArra
         val md5_1 = md5(password);
         val md5_2 = md5(md5_1 + "00 00 00 00".hexToBytes() + qq.toByteArray())
         it.write(md5_1)
-        it.write(loginTime)//todo FIXED 12(maybe 11???) bytes??? check that
+        it.writeInt(loginTime)//todo FIXED 12(maybe 11???) bytes??? check that
         it.writeByte(0);
         it.writeZero(4 * 3)
-        it.write(loginIP)
+        it.writeIP(loginIP)
         it.writeHex("00 10")
         it.writeHex("15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B")
         it.write(tgtgtKey)
diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientPasswordSubmissionPacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientPasswordSubmissionPacket.kt
index 070da00f9..dc2d7f3b7 100644
--- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientPasswordSubmissionPacket.kt
+++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientPasswordSubmissionPacket.kt
@@ -17,7 +17,7 @@ import java.net.InetAddress
  */
 @PacketId("08 36 31 03")//may be 08 36, 31 03 has another meaning
 @ExperimentalUnsignedTypes
-class ClientPasswordSubmissionPacket(private val qq: Int, private val password: String, private val loginTime: ByteArray, private val loginIP: ByteArray, private val tgtgtKey: ByteArray, private val token0825: ByteArray) : ClientPacket() {
+class ClientPasswordSubmissionPacket(private val qq: Int, private val password: String, private val loginTime: Int, private val loginIP: String, private val tgtgtKey: ByteArray, private val token0825: ByteArray) : ClientPacket() {
     @ExperimentalUnsignedTypes
     override fun encode() {
         this.writeQQ(qq)
diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientServerRedirectionPacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientServerRedirectionPacket.kt
index 63b6ced5d..8820241f5 100644
--- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientServerRedirectionPacket.kt
+++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientServerRedirectionPacket.kt
@@ -4,7 +4,7 @@ import net.mamoe.mirai.network.Protocol
 import net.mamoe.mirai.network.packet.PacketId
 import net.mamoe.mirai.network.packet.client.ClientPacket
 import net.mamoe.mirai.network.packet.client.writeHex
-import net.mamoe.mirai.network.packet.client.writeIp
+import net.mamoe.mirai.network.packet.client.writeIP
 import net.mamoe.mirai.network.packet.client.writeQQ
 import net.mamoe.mirai.util.TEACryptor
 import net.mamoe.mirai.util.hexToBytes
@@ -32,7 +32,7 @@ class ClientServerRedirectionPacket(private val serverIP: String, private val qq
                 this.writeHex(Protocol._0825data2)
                 this.writeQQ(qq)
                 this.writeHex("00 01 00 00 03 09 00 0C 00 01")
-                this.writeIp(serverIP)
+                this.writeIP(serverIP)
                 this.writeHex("01 6F A1 58 22 01 00 36 00 12 00 02 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 14 00 1D 01 03 00 19")
                 this.writeHex(Protocol.publicKey)
             }
diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientTouchPacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientTouchPacket.kt
index b3afbdee2..8c4699db8 100644
--- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientTouchPacket.kt
+++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientTouchPacket.kt
@@ -4,7 +4,7 @@ import net.mamoe.mirai.network.Protocol
 import net.mamoe.mirai.network.packet.PacketId
 import net.mamoe.mirai.network.packet.client.ClientPacket
 import net.mamoe.mirai.network.packet.client.writeHex
-import net.mamoe.mirai.network.packet.client.writeIp
+import net.mamoe.mirai.network.packet.client.writeIP
 import net.mamoe.mirai.network.packet.client.writeQQ
 import net.mamoe.mirai.util.ByteArrayDataOutputStream
 import net.mamoe.mirai.util.TEACryptor
@@ -21,6 +21,7 @@ import java.io.IOException
 @ExperimentalUnsignedTypes
 @PacketId("08 25 31 01")
 class ClientTouchPacket : ClientPacket() {
+    //已经完成测试
     var qq: Int = 0
 
     @ExperimentalUnsignedTypes
@@ -42,9 +43,9 @@ class ClientTouchPacket : ClientPacket() {
                 this.writeHex(Protocol._0825data2)
                 this.writeQQ(qq)
                 this.writeHex("00 00 00 00 03 09 00 08 00 01")
-                this.writeIp("192.168.1.1");
-                //this.writeIp(Protocol.SERVER_IP[2]);
-                //this.writeIp("123456789")
+                this.writeIP("192.168.1.1");
+                //this.writeIP(Protocol.SERVER_IP[2]);
+                //this.writeIP("123456789")
                 this.writeHex("00 02 00 36 00 12 00 02 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 14 00 1D 01 02 00 19")
                 this.writeHex(Protocol.publicKey)
                 println(this.toUByteArray().toHexString(" "))
@@ -78,13 +79,13 @@ fun main() {
     println(object : ByteArrayDataOutputStream() {
         @Throws(IOException::class)
         override fun toUByteArray(): UByteArray {
-            //this.writeIp("192.168.1.1")
+            //this.writeIP("192.168.1.1")
             this.writeHex(Protocol._0825data0)
             this.writeHex(Protocol._0825data2)
             this.writeQQ(1994701021)
             this.writeHex("00 00 00 00 03 09 00 08 00 01")
-            //this.writeIp(Protocol.SERVER_IP.get(2));
-            this.writeIp("192.168.1.1")
+            //this.writeIP(Protocol.SERVER_IP.get(2));
+            this.writeIP("192.168.1.1")
             this.writeHex("00 02 00 36 00 12 00 02 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 14 00 1D 01 02 00 19")
             this.writeHex(Protocol.publicKey)
             return super.toUByteArray()
diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerPacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerPacket.kt
index 47bdc7a44..9b46c785a 100644
--- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerPacket.kt
+++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerPacket.kt
@@ -53,7 +53,7 @@ fun DataInputStream.readIP(): String {
         val byte = readByte();
         buff += (byte.toUByte().toString())
         if(i !=3)buff+="."
-        System.out.println(byte.toHexString())
+        println(byte.toHexString())
     }
     return buff
 }
diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerTouchResponsePacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerTouchResponsePacket.kt
index 72cfa0b72..e45caf75c 100644
--- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerTouchResponsePacket.kt
+++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/server/ServerTouchResponsePacket.kt
@@ -12,7 +12,7 @@ import java.io.DataInputStream
  * @author Him188moe @ Mirai Project
  */
 class ServerTouchResponsePacket(private val type: Type, inputStream: DataInputStream) : ServerPacket(inputStream) {
-    lateinit var serverIP: String;
+    var serverIP: String? = null;
 
     var loginTime: Int = 0
     lateinit var loginIP: String
@@ -35,7 +35,7 @@ class ServerTouchResponsePacket(private val type: Type, inputStream: DataInputSt
 
         when (data.readByte().toInt()) {
             0xFE -> {
-                System.out.println("0xfe")
+                println("0xfe")
                 serverIP = data.readIP()
             }
             0X00 -> {

From 699d29c663d4c002b6a817ceeca088db5657d53f Mon Sep 17 00:00:00 2001
From: Him188moe <Him188@mamoe.net>
Date: Sat, 17 Aug 2019 22:57:22 +0800
Subject: [PATCH 4/4] update

---
 .../java/net/mamoe/mirai/MiraiServer.java     |  2 +-
 .../java/net/mamoe/mirai/network/Robot.kt     |  5 ++-
 .../login/ClientPasswordSubmissionPacket.kt   | 32 +++++++++++++------
 3 files changed, 27 insertions(+), 12 deletions(-)

diff --git a/mirai-core/src/main/java/net/mamoe/mirai/MiraiServer.java b/mirai-core/src/main/java/net/mamoe/mirai/MiraiServer.java
index 386357336..6f2e5225b 100644
--- a/mirai-core/src/main/java/net/mamoe/mirai/MiraiServer.java
+++ b/mirai-core/src/main/java/net/mamoe/mirai/MiraiServer.java
@@ -95,7 +95,7 @@ public class MiraiServer {
         });
         */
 
-        Robot robot = new Robot(1994701021);
+        Robot robot = new Robot(1994701021, "xiaoqqq");
         try {
             robot.connect(Protocol.Companion.getSERVER_IP().get(2), 8000);
         } catch (InterruptedException e) {
diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt
index 4a63cc215..20544c564 100644
--- a/mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt
+++ b/mirai-core/src/main/java/net/mamoe/mirai/network/Robot.kt
@@ -35,7 +35,10 @@ class Robot(val number: Int, private val password: String) {
         if (packet is ServerTouchResponsePacket) {
             if (packet.serverIP != null) {//redirection
                 connect(packet.serverIP!!)
-                sendPacket(ClientServerRedirectionPacket(packet.serverIP!!, number))
+                sendPacket(ClientServerRedirectionPacket(
+                        serverIP = packet.serverIP!!,
+                        qq = number
+                ))
             } else {//password submission
                 sendPacket(ClientPasswordSubmissionPacket(
                         qq = this.number,
diff --git a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientPasswordSubmissionPacket.kt b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientPasswordSubmissionPacket.kt
index dc2d7f3b7..ce0c13c3d 100644
--- a/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientPasswordSubmissionPacket.kt
+++ b/mirai-core/src/main/java/net/mamoe/mirai/network/packet/client/login/ClientPasswordSubmissionPacket.kt
@@ -3,10 +3,7 @@ package net.mamoe.mirai.network.packet.client.login
 import net.mamoe.mirai.network.Protocol
 import net.mamoe.mirai.network.packet.PacketId
 import net.mamoe.mirai.network.packet.client.*
-import net.mamoe.mirai.util.TEACryptor
-import net.mamoe.mirai.util.getCrc32
-import net.mamoe.mirai.util.getRandomKey
-import net.mamoe.mirai.util.hexToBytes
+import net.mamoe.mirai.util.*
 import java.io.IOException
 import java.net.InetAddress
 
@@ -15,6 +12,21 @@ import java.net.InetAddress
  *
  * @author Him188moe @ Mirai Project
  */
+
+@ExperimentalUnsignedTypes
+fun main() {
+    val pk = ClientPasswordSubmissionPacket(
+            qq = 1994701021,
+            password = "D1 A5 C8 BB E1 Q3 CC DD",//其实这个就是普通的密码, 不是HEX
+            loginTime = 131513,
+            loginIP = "123.123.123.123",
+            token0825 = byteArrayOf(),
+            tgtgtKey = "AA BB CC DD EE FF AA BB CC".hexToBytes()
+    )
+
+    println(pk.encodeToByteArray().toHexString())
+}
+
 @PacketId("08 36 31 03")//may be 08 36, 31 03 has another meaning
 @ExperimentalUnsignedTypes
 class ClientPasswordSubmissionPacket(private val qq: Int, private val password: String, private val loginTime: Int, private val loginIP: String, private val tgtgtKey: ByteArray, private val token0825: ByteArray) : ClientPacket() {
@@ -27,12 +39,12 @@ class ClientPasswordSubmissionPacket(private val qq: Int, private val password:
         this.writeHex(Protocol._0836key1)
 
         //TEA 加密
-        this.write(TEACryptor.encrypt(object : ClientPacket() {
+        this.write(TEACryptor.encrypt(object : ByteArrayDataOutputStream() {
             @Throws(IOException::class)
-            override fun encode() {
+            override fun toByteArray(): ByteArray {
                 val hostName: String = InetAddress.getLocalHost().hostName.let { it.substring(0, it.length - 3) };
 
-                this.writeQQ(System.currentTimeMillis().toInt())//that's correct
+                this.writeInt(System.currentTimeMillis().toInt())
                 this.writeHex("01 12");//tag
                 this.writeHex("00 38");//length
                 this.write(token0825);//length
@@ -94,9 +106,9 @@ class ClientPasswordSubmissionPacket(private val qq: Int, private val password:
                     write(it)//key
                     writeLong(getCrc32(it))//todo may be int? check that.
                 }
+
+                return super.toByteArray();
             }
-        }.encodeToByteArray(), Protocol.shareKey.hexToBytes()))
+        }.toByteArray(), Protocol.shareKey.hexToBytes()))
     }
-
-
 }
\ No newline at end of file