@@ -6,8 +6,9 @@ mod packets {
66}
77
88use tokio:: io:: AsyncReadExt ;
9+ use std:: io:: Write ;
910
10- use crate :: net:: codec:: read_var;
11+ use crate :: net:: codec:: { read_var, write_var } ;
1112
1213pub enum ClientPacket {
1314 // status state
@@ -35,13 +36,58 @@ pub enum ProtocolState {
3536 Play
3637}
3738
38- pub async fn read_packet < R : AsyncReadExt + Unpin > ( stream : & mut R , state : & ProtocolState ) -> anyhow:: Result < Option < ClientPacket > > {
39+ pub fn encode_packet ( data : & [ u8 ] ) -> Vec < u8 > {
40+ let mut result = Vec :: new ( ) ;
41+
42+ if data. len ( ) > 256 {
43+ let uncompressed_len = data. len ( ) ;
44+
45+ let mut encoder = flate2:: write:: ZlibEncoder :: new ( Vec :: new ( ) , flate2:: Compression :: fast ( ) ) ;
46+ encoder. write_all ( & data) . unwrap ( ) ;
47+
48+ let compressed = encoder. finish ( ) . unwrap ( ) ;
49+
50+ let mut inner = Vec :: with_capacity ( 5 + compressed. len ( ) ) ;
51+ write_var ( & mut inner, uncompressed_len as i32 ) . unwrap ( ) ;
52+ inner. extend_from_slice ( & compressed) ;
53+
54+ write_var ( & mut result, inner. len ( ) as i32 ) . unwrap ( ) ;
55+ result. extend_from_slice ( & inner) ;
56+ } else {
57+ let mut inner = Vec :: with_capacity ( 5 ) ;
58+ write_var ( & mut inner, 0 ) . unwrap ( ) ;
59+ inner. extend_from_slice ( & data) ;
60+
61+ write_var ( & mut result, inner. len ( ) as i32 ) . unwrap ( ) ;
62+ result. extend_from_slice ( & inner) ;
63+ }
64+
65+ result
66+ }
67+
68+ pub async fn read_packet < R : AsyncReadExt + Unpin > ( stream : & mut R , state : & ProtocolState , compression : bool ) -> anyhow:: Result < Option < ClientPacket > > {
3969 let packet_len = read_var ( stream) . await . map_err ( |e| anyhow:: anyhow!( "Failed to read packet length: {}" , e) ) ?;
4070
4171 let mut packet_buf = vec ! [ 0u8 ; packet_len as usize ] ;
4272 stream. read_exact ( & mut packet_buf) . await . map_err ( |e| anyhow:: anyhow!( "Failed to read packet data: {}" , e) ) ?;
4373
4474 let mut cursor = std:: io:: Cursor :: new ( packet_buf) ;
75+
76+ if compression {
77+ let data_len = read_var ( & mut cursor) . await . map_err ( |e| anyhow:: anyhow!( "Failed to read data length: {}" , e) ) ?;
78+
79+ if data_len != 0 {
80+ let mut compressed = Vec :: new ( ) ;
81+ std:: io:: Read :: read_to_end ( & mut cursor, & mut compressed) . map_err ( |e| anyhow:: anyhow!( "Failed to read compressed data: {}" , e) ) ?;
82+
83+ let mut decoder = flate2:: read:: ZlibDecoder :: new ( & compressed[ ..] ) ;
84+ let mut decompressed = Vec :: with_capacity ( data_len as usize ) ;
85+ std:: io:: Read :: read_to_end ( & mut decoder, & mut decompressed) . map_err ( |e| anyhow:: anyhow!( "Failed to decompress data: {}" , e) ) ?;
86+
87+ cursor = std:: io:: Cursor :: new ( decompressed) ;
88+ }
89+ }
90+
4591 let packet_id = read_var ( & mut cursor) . await . map_err ( |e| anyhow:: anyhow!( "Failed to read packet ID: {}" , e) ) ?;
4692
4793 if packet_id != 0x0C && packet_id != 0x1D { // these packets are spammy
0 commit comments