From 974efe3824b28a1f3b2b150b85ed2cef7ffce24f Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Mon, 17 Mar 2025 17:28:57 -0400 Subject: [PATCH] Move compression logic out of send_packet and into it's own function --- src/packet/compression.rs | 31 +++++++++++++++++++++++++++++-- src/packet/packet.rs | 28 ++++++---------------------- 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/src/packet/compression.rs b/src/packet/compression.rs index f46c7ad..6258e30 100644 --- a/src/packet/compression.rs +++ b/src/packet/compression.rs @@ -1,4 +1,4 @@ -use binrw::binrw; +use binrw::{BinWrite, binrw}; use std::io::Cursor; use binrw::{BinRead, BinResult}; @@ -8,7 +8,7 @@ use crate::{ packet::{PacketHeader, PacketSegment}, }; -use super::ReadWriteIpcSegment; +use super::{PacketState, ReadWriteIpcSegment}; #[binrw] #[brw(repr = u8)] @@ -56,3 +56,30 @@ pub(crate) fn decompress( Ok(segments) } + +pub(crate) fn compress( + state: &mut PacketState, + compression_type: &CompressionType, + segments: &[PacketSegment], +) -> (Vec, usize) { + let mut segments_buffer = Cursor::new(Vec::new()); + for segment in segments { + segment + .write_le_args( + &mut segments_buffer, + (state.client_key.as_ref().map(|s: &[u8; 16]| s.as_slice()),), + ) + .unwrap(); + } + + let segments_buffer = segments_buffer.into_inner(); + let segments_buffer_len = segments_buffer.len(); + + match compression_type { + CompressionType::Uncompressed => (segments_buffer, 0), + CompressionType::Oodle => ( + state.clientbound_oodle.encode(segments_buffer), + segments_buffer_len, + ), + } +} diff --git a/src/packet/packet.rs b/src/packet/packet.rs index 4dea88b..dd0c54f 100644 --- a/src/packet/packet.rs +++ b/src/packet/packet.rs @@ -7,7 +7,11 @@ use std::{ use binrw::{BinRead, BinWrite, binrw}; use tokio::{io::AsyncWriteExt, net::TcpStream}; -use crate::{common::read_string, oodle::OodleNetwork, packet::encryption::decrypt}; +use crate::{ + common::read_string, + oodle::OodleNetwork, + packet::{compression::compress, encryption::decrypt}, +}; use super::{ CompressionType, compression::decompress, encryption::encrypt, ipc::ReadWriteIpcSegment, @@ -144,27 +148,7 @@ pub async fn send_packet( .try_into() .unwrap(); - let mut segments_buffer = Cursor::new(Vec::new()); - for segment in segments { - segment - .write_le_args( - &mut segments_buffer, - (state.client_key.as_ref().map(|s: &[u8; 16]| s.as_slice()),), - ) - .unwrap(); - } - - let segments_buffer = segments_buffer.into_inner(); - - let mut uncompressed_size = 0; - let data = match compression_type { - CompressionType::Uncompressed => segments_buffer, - CompressionType::Oodle => { - uncompressed_size = segments_buffer.len(); - state.clientbound_oodle.encode(segments_buffer) - } - }; - + let (data, uncompressed_size) = compress(state, &compression_type, segments); let size = std::mem::size_of::() + data.len(); let header = PacketHeader {