Update all codec to suspend; added a default ProtocolCryptoContext implementation
This commit is contained in:
296 files changed
+2199
-1818
No files matched your search
@@ -7,8 +7,8 @@
|
||||
|
||||
package cn.rtast.libmc.mcping.bedrock
|
||||
|
||||
import cn.rtast.libmc.common.BytesBuffer
|
||||
import cn.rtast.libmc.common.PacketCodec
|
||||
import cn.rtast.libmc.common.stream.BytesBuffer
|
||||
import cn.rtast.libmc.common.packet.PacketCodec
|
||||
import kotlin.random.Random
|
||||
|
||||
private val RAKNET_MAGIC = byteArrayOf(
|
||||
@@ -33,14 +33,14 @@ internal data class BedrockRequestPacket(
|
||||
override val packetId: Byte = 0x01
|
||||
|
||||
companion object Codec : PacketCodec<BedrockRequestPacket> {
|
||||
override fun encode(buffer: BytesBuffer, value: BedrockRequestPacket) {
|
||||
override suspend fun encode(buffer: BytesBuffer, value: BedrockRequestPacket) {
|
||||
buffer.writeByte(value.packetId)
|
||||
buffer.writeLong(value.time)
|
||||
buffer.writeBytes(value.magic)
|
||||
buffer.writeLong(value.guid)
|
||||
}
|
||||
|
||||
override fun decode(buffer: BytesBuffer): BedrockRequestPacket = throw UnsupportedOperationException()
|
||||
override suspend fun decode(buffer: BytesBuffer): BedrockRequestPacket = throw UnsupportedOperationException()
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
@@ -72,8 +72,8 @@ internal data class BedrockResponsePacket(
|
||||
) : MinecraftBedrockPacket {
|
||||
|
||||
companion object Codec : PacketCodec<BedrockResponsePacket> {
|
||||
override fun encode(buffer: BytesBuffer, value: BedrockResponsePacket) = throw UnsupportedOperationException()
|
||||
override fun decode(buffer: BytesBuffer): BedrockResponsePacket {
|
||||
override suspend fun encode(buffer: BytesBuffer, value: BedrockResponsePacket) = throw UnsupportedOperationException()
|
||||
override suspend fun decode(buffer: BytesBuffer): BedrockResponsePacket {
|
||||
val packetId = buffer.readByte()
|
||||
if (packetId != 0x1C.toByte()) throw IllegalStateException("Expected pong id 0x1C, got $packetId")
|
||||
val time = buffer.readLong()
|
||||
|
||||
@@ -7,12 +7,12 @@
|
||||
|
||||
package cn.rtast.libmc.mcping.bedrock
|
||||
|
||||
import cn.rtast.libmc.common.BytesBuffer
|
||||
import cn.rtast.libmc.common.PacketCodec
|
||||
import cn.rtast.libmc.common.UdpSocket
|
||||
import cn.rtast.libmc.common.stream.BytesBuffer
|
||||
import cn.rtast.libmc.common.packet.PacketCodec
|
||||
import cn.rtast.libmc.common.stream.UdpSocket
|
||||
|
||||
|
||||
internal fun <T : MinecraftBedrockPacket> UdpSocket.sendPacket(packet: T, codec: PacketCodec<T>): ByteArray {
|
||||
internal suspend fun <T : MinecraftBedrockPacket> UdpSocket.sendPacket(packet: T, codec: PacketCodec<T>): ByteArray {
|
||||
val buf = BytesBuffer()
|
||||
codec.encode(buf, packet)
|
||||
return sendAndReceive(buf.toByteArray())
|
||||
|
||||
@@ -8,12 +8,12 @@
|
||||
package cn.rtast.libmc.mcping.bedrock
|
||||
|
||||
import cn.rtast.libmc.common.LibMCContext
|
||||
import cn.rtast.libmc.common.UdpSocket
|
||||
import cn.rtast.libmc.common.wrap
|
||||
import cn.rtast.libmc.common.stream.UdpSocket
|
||||
import cn.rtast.libmc.common.stream.wrap
|
||||
import cn.rtast.libmc.mcping.PingResponse
|
||||
import kotlin.time.Clock
|
||||
|
||||
internal fun pingBedrockServer(host: String, port: Int, context: LibMCContext): PingResponse {
|
||||
internal suspend fun pingBedrockServer(host: String, port: Int, context: LibMCContext): PingResponse {
|
||||
val socket = UdpSocket(host, port, context)
|
||||
return try {
|
||||
val sendTime = Clock.System.now().toEpochMilliseconds()
|
||||
|
||||
@@ -7,10 +7,10 @@
|
||||
|
||||
package cn.rtast.libmc.mcping.java
|
||||
|
||||
import cn.rtast.libmc.common.BytesBuffer
|
||||
import cn.rtast.libmc.common.McStringCodec
|
||||
import cn.rtast.libmc.common.PacketCodec
|
||||
import cn.rtast.libmc.common.VarIntCodec
|
||||
import cn.rtast.libmc.common.stream.BytesBuffer
|
||||
import cn.rtast.libmc.common.primitives.McStringCodec
|
||||
import cn.rtast.libmc.common.packet.PacketCodec
|
||||
import cn.rtast.libmc.common.primitives.VarIntCodec
|
||||
import cn.rtast.libmc.common.packet.MinecraftPacket
|
||||
|
||||
// ref https://minecraft.wiki/w/Java_Edition_protocol/Packets#Handshake
|
||||
@@ -22,30 +22,30 @@ internal data class HandshakePacket(
|
||||
val nextState: Int,
|
||||
) : MinecraftPacket {
|
||||
companion object Codec : PacketCodec<HandshakePacket> {
|
||||
override fun encode(buffer: BytesBuffer, value: HandshakePacket) {
|
||||
override suspend fun encode(buffer: BytesBuffer, value: HandshakePacket) {
|
||||
VarIntCodec.encode(buffer, value.protocolVersion)
|
||||
McStringCodec.encode(buffer, value.serverAddress)
|
||||
buffer.writeShort(value.serverPort.toShort())
|
||||
VarIntCodec.encode(buffer, value.nextState)
|
||||
}
|
||||
|
||||
override fun decode(buffer: BytesBuffer): HandshakePacket = throw UnsupportedOperationException()
|
||||
override suspend fun decode(buffer: BytesBuffer): HandshakePacket = throw UnsupportedOperationException()
|
||||
}
|
||||
}
|
||||
|
||||
// ref https://minecraft.wiki/w/Java_Edition_protocol/Packets#Status
|
||||
internal data object StatusRequestPacket : MinecraftPacket, PacketCodec<StatusRequestPacket> {
|
||||
override fun encode(buffer: BytesBuffer, value: StatusRequestPacket) {}
|
||||
override fun decode(buffer: BytesBuffer): StatusRequestPacket = throw UnsupportedOperationException()
|
||||
override suspend fun encode(buffer: BytesBuffer, value: StatusRequestPacket) {}
|
||||
override suspend fun decode(buffer: BytesBuffer): StatusRequestPacket = throw UnsupportedOperationException()
|
||||
}
|
||||
|
||||
internal data class PingPacket(val currentTime: Long) : MinecraftPacket {
|
||||
companion object : PacketCodec<PingPacket> {
|
||||
override fun encode(buffer: BytesBuffer, value: PingPacket) {
|
||||
override suspend fun encode(buffer: BytesBuffer, value: PingPacket) {
|
||||
buffer.writeLong(value.currentTime)
|
||||
}
|
||||
|
||||
override fun decode(buffer: BytesBuffer): PingPacket {
|
||||
override suspend fun decode(buffer: BytesBuffer): PingPacket {
|
||||
return PingPacket(buffer.readLong())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,11 +8,15 @@
|
||||
package cn.rtast.libmc.mcping.java
|
||||
|
||||
import cn.rtast.libmc.common.*
|
||||
import cn.rtast.libmc.common.primitives.McStringCodec
|
||||
import cn.rtast.libmc.common.primitives.VarIntCodec
|
||||
import cn.rtast.libmc.common.stream.Socket
|
||||
import cn.rtast.libmc.common.stream.readPacketFrame
|
||||
import cn.rtast.libmc.mcping.PingResponse
|
||||
import cn.rtast.libmc.mcping.sendPacket
|
||||
import kotlin.time.Clock
|
||||
|
||||
internal fun pingJavaServer(host: String, port: Int, context: LibMCContext): PingResponse {
|
||||
internal suspend fun pingJavaServer(host: String, port: Int, context: LibMCContext): PingResponse {
|
||||
val socket = Socket(host, port, context)
|
||||
val receiveChannel = socket.openReadChannel()
|
||||
val sendChannel = socket.openWriteChannel()
|
||||
|
||||
@@ -16,7 +16,7 @@ import kotlin.jvm.JvmName
|
||||
import kotlin.jvm.JvmOverloads
|
||||
|
||||
@JvmOverloads
|
||||
public fun mcping(
|
||||
public suspend fun mcping(
|
||||
host: String,
|
||||
port: Int,
|
||||
type: ServerType = ServerType.Java,
|
||||
|
||||
@@ -7,15 +7,19 @@
|
||||
|
||||
package cn.rtast.libmc.mcping
|
||||
|
||||
import cn.rtast.libmc.common.*
|
||||
import cn.rtast.libmc.common.stream.BytesBuffer
|
||||
import cn.rtast.libmc.common.primitives.VarIntCodec
|
||||
import cn.rtast.libmc.common.stream.WriteChannel
|
||||
import cn.rtast.libmc.common.packet.MinecraftPacket
|
||||
import cn.rtast.libmc.common.packet.PacketCodec
|
||||
import cn.rtast.libmc.common.packet.writeBuffer
|
||||
|
||||
public fun <T : MinecraftPacket> WriteChannel.sendPacket(packet: T, packetId: Int, codec: PacketCodec<T>) {
|
||||
public suspend fun <T : MinecraftPacket> WriteChannel.sendPacket(packet: T, packetId: Int, codec: PacketCodec<T>) {
|
||||
val bodyBuffer = BytesBuffer()
|
||||
bodyBuffer.write(packetId, VarIntCodec)
|
||||
VarIntCodec.encode(bodyBuffer, packetId)
|
||||
codec.encode(bodyBuffer, packet)
|
||||
val frameBuffer = BytesBuffer()
|
||||
frameBuffer.write(bodyBuffer.size, VarIntCodec)
|
||||
VarIntCodec.encode(bodyBuffer, bodyBuffer.size)
|
||||
frameBuffer.writeBuffer(bodyBuffer)
|
||||
val bytes = frameBuffer.toByteArray()
|
||||
this.writeFully(bytes, 0, bytes.size)
|
||||
|
||||
Reference in New Issue
Block a user