Commit 75352667 authored by Him188moe's avatar Him188moe

update

parent e530720f
...@@ -98,7 +98,8 @@ public class MiraiServer { ...@@ -98,7 +98,8 @@ public class MiraiServer {
Robot robot = new Robot(1994701021, "xiaoqqq"); Robot robot = new Robot(1994701021, "xiaoqqq");
try { try {
//System.out.println(Protocol.Companion.getSERVER_IP().toString()); //System.out.println(Protocol.Companion.getSERVER_IP().toString());
robot.connect("125.39.132.242", 8000); //robot.connect("127.0.0.1");
robot.connect("125.39.132.242");
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
System.exit(1); System.exit(1);
......
...@@ -3,10 +3,9 @@ package net.mamoe.mirai.network ...@@ -3,10 +3,9 @@ package net.mamoe.mirai.network
import io.netty.bootstrap.Bootstrap import io.netty.bootstrap.Bootstrap
import io.netty.channel.* import io.netty.channel.*
import io.netty.channel.nio.NioEventLoopGroup import io.netty.channel.nio.NioEventLoopGroup
import io.netty.channel.socket.SocketChannel import io.netty.channel.socket.nio.NioDatagramChannel
import io.netty.channel.socket.nio.NioSocketChannel import io.netty.handler.codec.MessageToMessageEncoder
import io.netty.handler.codec.bytes.ByteArrayDecoder 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.ClientPacket
import net.mamoe.mirai.network.packet.client.login.* import net.mamoe.mirai.network.packet.client.login.*
import net.mamoe.mirai.network.packet.client.touch.ClientTouchPacket import net.mamoe.mirai.network.packet.client.touch.ClientTouchPacket
...@@ -34,6 +33,7 @@ class Robot(val number: Int, private val password: String) { ...@@ -34,6 +33,7 @@ class Robot(val number: Int, private val password: String) {
private var serverIP: String = "" private var serverIP: String = ""
set(value) { set(value) {
serverAddress = InetSocketAddress(value, 8000) serverAddress = InetSocketAddress(value, 8000)
field = value
} }
private lateinit var serverAddress: InetSocketAddress; private lateinit var serverAddress: InetSocketAddress;
...@@ -61,7 +61,7 @@ class Robot(val number: Int, private val password: String) { ...@@ -61,7 +61,7 @@ class Robot(val number: Int, private val password: String) {
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
private fun onPacketReceived(packet: ServerPacket) { private fun onPacketReceived(packet: ServerPacket) {
packet.decode() packet.decode()
println(packet.toString()) println("Packet received: $packet")
when (packet) { when (packet) {
is ServerTouchResponsePacket -> { is ServerTouchResponsePacket -> {
if (packet.serverIP != null) {//redirection if (packet.serverIP != null) {//redirection
...@@ -130,51 +130,43 @@ class Robot(val number: Int, private val password: String) { ...@@ -130,51 +130,43 @@ class Robot(val number: Int, private val password: String) {
} }
packet.writeHex(Protocol.tail) packet.writeHex(Protocol.tail)
println("Packet sent: $packet") println("Packet sent: $packet")
val p = DatagramPacket(packet.toByteArray()); /*val p = DatagramPacket(packet.toByteArray());
p.socketAddress = this.serverAddress p.socketAddress = this.serverAddress*/
channel!!.writeAndFlush(p) channel!!.writeAndFlush(packet.toByteArray())
} }
companion object { private fun DatagramPacket(toByteArray: ByteArray): DatagramPacket = DatagramPacket(toByteArray, toByteArray.size, this.serverAddress)
private fun DatagramPacket(toByteArray: ByteArray): DatagramPacket = DatagramPacket(toByteArray, toByteArray.size)
}
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
@Throws(InterruptedException::class) @Throws(InterruptedException::class)
fun connect(ip: String, port: Int = 8000) { fun connect(ip: String) {
this.serverIP = ip; this.serverIP = ip;
val group = NioEventLoopGroup() val group = NioEventLoopGroup()
try { try {
val b = Bootstrap() val b = Bootstrap()
b.group(group) b.group(group)
.channel(NioSocketChannel::class.java) .channel(NioDatagramChannel::class.java)
.remoteAddress(InetSocketAddress("0.0.0.0", 62154))
.option(ChannelOption.SO_BROADCAST, true) .option(ChannelOption.SO_BROADCAST, true)
.handler(object : ChannelInitializer<SocketChannel>() { .handler(object : ChannelInitializer<NioDatagramChannel>() {
@Throws(Exception::class) @Throws(Exception::class)
override fun initChannel(ch: SocketChannel) { override fun initChannel(ch: NioDatagramChannel) {
ch.pipeline().addLast(ByteArrayEncoder()) ch.pipeline().addLast(object : MessageToMessageEncoder<ByteArray>() {
override fun encode(ctx: ChannelHandlerContext?, msg: ByteArray?, out: MutableList<Any>?) {
out!!.add(DatagramPacket(msg!!))
}
})
ch.pipeline().addLast(ByteArrayDecoder()) ch.pipeline().addLast(ByteArrayDecoder())
ch.pipeline().addLast(object : SimpleChannelInboundHandler<ByteArray>() { ch.pipeline().addLast(object : SimpleChannelInboundHandler<ByteArray>() {
override fun channelRead0(ctx: ChannelHandlerContext, bytes: ByteArray) { override fun channelRead0(ctx: ChannelHandlerContext, bytes: ByteArray) {
try { try {
/*val remaining = Reader.read(bytes);
if (Reader.isPacketAvailable()) {
robot.onPacketReceived(Reader.toServerPacket())
Reader.init()
remaining
}*/
this@Robot.onPacketReceived(ServerPacket.ofByteArray(bytes)) this@Robot.onPacketReceived(ServerPacket.ofByteArray(bytes))
} catch (e: Exception) { } catch (e: Exception) {
MiraiLogger.catching(e) MiraiLogger.catching(e)
} }
} }
override fun channelActive(ctx: ChannelHandlerContext) {
println("Successfully connected to server")
}
override fun exceptionCaught(ctx: ChannelHandlerContext, cause: Throwable) { override fun exceptionCaught(ctx: ChannelHandlerContext, cause: Throwable) {
MiraiLogger.catching(cause) MiraiLogger.catching(cause)
} }
...@@ -182,7 +174,7 @@ class Robot(val number: Int, private val password: String) { ...@@ -182,7 +174,7 @@ class Robot(val number: Int, private val password: String) {
} }
}) })
channel = b.connect().sync().channel() channel = b.bind(15345).sync().channel()
sendPacket(ClientTouchPacket(this@Robot.number, serverIP)) sendPacket(ClientTouchPacket(this@Robot.number, serverIP))
channel!!.closeFuture().sync() channel!!.closeFuture().sync()
......
...@@ -48,7 +48,7 @@ class ClientTouchPacket(val qq: Int, val serverIp: String) : ClientPacket() { ...@@ -48,7 +48,7 @@ class ClientTouchPacket(val qq: Int, val serverIp: String) : ClientPacket() {
} }
override fun toString(): String { override fun toString(): String {
return this.javaClass.simpleName + this.javaClass.declaredFields.joinToString(", ", "{", "}") { it.name + "=" + it.get(this) } return this.javaClass.simpleName + this.javaClass.declaredFields.joinToString(", ", "{", "}") { it.trySetAccessible(); it.name + "=" + it.get(this) }
} }
} }
......
package net.mamoe.mirai.network.packet.server package net.mamoe.mirai.network.packet.server
import net.mamoe.mirai.network.packet.Packet import net.mamoe.mirai.network.packet.Packet
import net.mamoe.mirai.network.packet.client.toHexString
import net.mamoe.mirai.network.packet.server.login.* import net.mamoe.mirai.network.packet.server.login.*
import net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacket import net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacket
import net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacketEncrypted import net.mamoe.mirai.network.packet.server.touch.ServerTouchResponsePacketEncrypted
...@@ -16,19 +17,20 @@ abstract class ServerPacket(val input: DataInputStream) : Packet { ...@@ -16,19 +17,20 @@ abstract class ServerPacket(val input: DataInputStream) : Packet {
companion object { companion object {
@ExperimentalUnsignedTypes
fun ofByteArray(bytes: ByteArray): ServerPacket { fun ofByteArray(bytes: ByteArray): ServerPacket {
println("Raw received: $bytes")
val stream = DataInputStream(bytes.inputStream()) val stream = bytes.dataInputStream()
stream.skipUntil(10) stream.skip(3)
val idBytes = stream.readUntil(11)
return when (val flag = idBytes.joinToString("") { it.toString(16) }) { return when (val idBytes = stream.readInt().toHexString(" ")) {
"08 25 31 01" -> ServerTouchResponsePacketEncrypted(ServerTouchResponsePacket.Type.TYPE_08_25_31_01, stream) "08 25 31 01" -> ServerTouchResponsePacketEncrypted(ServerTouchResponsePacket.Type.TYPE_08_25_31_01, stream)
"08 25 31 02" -> ServerTouchResponsePacketEncrypted(ServerTouchResponsePacket.Type.TYPE_08_25_31_02, stream) "08 25 31 02" -> ServerTouchResponsePacketEncrypted(ServerTouchResponsePacket.Type.TYPE_08_25_31_02, stream)
"08 36 31 03", "08 36 31 04", "08 36 31 05", "08 36 31 06" -> { "08 36 31 03", "08 36 31 04", "08 36 31 05", "08 36 31 06" -> {
when (bytes.size) { when (bytes.size) {
271, 207 -> return ServerLoginResponseResendPacketEncrypted(stream, when (flag) { 271, 207 -> return ServerLoginResponseResendPacketEncrypted(stream, when (idBytes) {
"08 36 31 03" -> ServerLoginResponseResendPacket.Flag.`08 36 31 03` "08 36 31 03" -> ServerLoginResponseResendPacket.Flag.`08 36 31 03`
else -> ServerLoginResponseResendPacket.Flag.OTHER else -> ServerLoginResponseResendPacket.Flag.OTHER
}) })
......
...@@ -21,6 +21,6 @@ object MiraiLogger{ ...@@ -21,6 +21,6 @@ object MiraiLogger{
private fun print(value:String?){ private fun print(value:String?){
val s = SimpleDateFormat("MM-dd HH:mm:ss").format(Date()) val s = SimpleDateFormat("MM-dd HH:mm:ss").format(Date())
System.out.println(LoggerTextFormat.BLUE.toString() + "[Mirai] $s : $value") println(LoggerTextFormat.BLUE.toString() + "[Mirai] $s : $value")
} }
} }
\ No newline at end of file
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