diff --git a/src/main.rs b/src/main.rs index 3d950a4..3a0f79e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,7 +16,7 @@ use tokio::{ }; use crate::{ - netty::WriteExtNetty, + netty::{WriteExtNetty, ReadExtNetty}, proto::{ClientboundControlMessage, ServerboundControlMessage}, }; @@ -279,6 +279,18 @@ async fn politely_disconnect( .await?; connection.write_varint(buf.len() as i32).await?; connection.write_all(&buf).await?; + let packet = netty::read_packet(&mut connection).await?; + let mut packet = packet.as_slice(); + let id = packet.read_varint()?; + if id != 1 { + return Err(anyhow!("Packet isn't a Ping Request(0x01), but {:#04x}", id)); + } + let payload = packet.read_long()?; + let mut buf = Vec::with_capacity(1 + 8); + buf.write_varint(1).await?; + buf.write_u64(payload).await?; + connection.write_varint(buf.len() as i32).await?; + connection.write_all(&buf).await?; } netty::HandshakeType::Login => { let _ = netty::read_packet(&mut connection).await?; diff --git a/src/netty.rs b/src/netty.rs index 1b379bd..5bf606a 100644 --- a/src/netty.rs +++ b/src/netty.rs @@ -39,6 +39,12 @@ pub trait ReadExtNetty: Read { Ok(u16::from_be_bytes(buf)) } + fn read_long(&mut self) -> Result { + let mut buf = [0u8; 8]; + self.read_exact(&mut buf)?; + Ok(u64::from_be_bytes(buf)) + } + fn read_string(&mut self) -> Result { let len = self.read_varint()?; let mut buf = vec![0u8; len as usize];