aboutsummaryrefslogtreecommitdiff
path: root/azalea-protocol/src/read.rs
diff options
context:
space:
mode:
authormat <github@matdoes.dev>2021-12-15 23:10:55 -0600
committermat <github@matdoes.dev>2021-12-15 23:10:55 -0600
commit9642558f8f8d983a7087f15d68be8cf07a85f0c2 (patch)
tree5f0a967f005cd5db510a13ab290c8ad6669b25aa /azalea-protocol/src/read.rs
parent72aefe871ca4983431b1a0b707b472e73ffea836 (diff)
downloadazalea-drasl-9642558f8f8d983a7087f15d68be8cf07a85f0c2.tar.xz
azalea
Diffstat (limited to 'azalea-protocol/src/read.rs')
-rw-r--r--azalea-protocol/src/read.rs28
1 files changed, 28 insertions, 0 deletions
diff --git a/azalea-protocol/src/read.rs b/azalea-protocol/src/read.rs
new file mode 100644
index 00000000..6f242e8b
--- /dev/null
+++ b/azalea-protocol/src/read.rs
@@ -0,0 +1,28 @@
+use tokio::{io::BufReader, net::TcpStream};
+
+use crate::{connect::PacketFlow, mc_buf::Readable, packets::ProtocolPacket};
+
+pub async fn read_packet<P: ProtocolPacket>(
+ flow: &PacketFlow,
+ stream: &mut TcpStream,
+) -> Result<P, String> {
+ // what this does:
+ // 1. reads the first 5 bytes, probably only some of this will be used to get the packet length
+ // 2. how much we should read = packet length - 5
+ // 3. read the rest of the packet and add it to the cursor
+ // 4. figure out what packet this is and parse it
+
+ // the first thing minecraft sends us is the length as a varint, which can be up to 5 bytes long
+ let mut buf = BufReader::with_capacity(4 * 1024 * 1024, stream);
+
+ let (_packet_size, _packet_size_varint_size) = buf.read_varint().await?;
+
+ // then, minecraft tells us the packet id as a varint
+ let (packet_id, _packet_id_size) = buf.read_varint().await?;
+
+ // if we recognize the packet id, parse it
+
+ let packet = P::read(packet_id.try_into().unwrap(), flow, &mut buf).await?;
+
+ Ok(packet)
+}