From e930eb2f82629ca52a87c2db403eab516a42cfe7 Mon Sep 17 00:00:00 2001 From: Skye Date: Tue, 6 Feb 2024 15:26:38 +0900 Subject: [PATCH] fix: be more polite to `ServerListPing`s --- src/main.rs | 14 +++++++++++++- src/netty.rs | 6 ++++++ 2 files changed, 19 insertions(+), 1 deletion(-) 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];