aboutsummaryrefslogtreecommitdiff
path: root/minecraft-protocol/src/packets/handshake
diff options
context:
space:
mode:
authormat <github@matdoes.dev>2021-12-15 13:08:36 -0600
committermat <github@matdoes.dev>2021-12-15 13:08:36 -0600
commitace140500734d33fe53126086a8d9278fa861e21 (patch)
tree7ed5ab284631272afd81ccc2ee2d3b774555a975 /minecraft-protocol/src/packets/handshake
parent0d6e4179e6cc16594a4be3ecd62d89411115f319 (diff)
downloadazalea-drasl-ace140500734d33fe53126086a8d9278fa861e21.tar.xz
isolate packets
Diffstat (limited to 'minecraft-protocol/src/packets/handshake')
-rw-r--r--minecraft-protocol/src/packets/handshake/client_intention_packet.rs15
-rw-r--r--minecraft-protocol/src/packets/handshake/mod.rs47
2 files changed, 54 insertions, 8 deletions
diff --git a/minecraft-protocol/src/packets/handshake/client_intention_packet.rs b/minecraft-protocol/src/packets/handshake/client_intention_packet.rs
index 76957c6f..54a08f39 100644
--- a/minecraft-protocol/src/packets/handshake/client_intention_packet.rs
+++ b/minecraft-protocol/src/packets/handshake/client_intention_packet.rs
@@ -8,6 +8,8 @@ use crate::{
packets::{ConnectionProtocol, Packet},
};
+use super::HandshakePacket;
+
#[derive(Hash, Clone, Debug)]
pub struct ClientIntentionPacket {
pub protocol_version: u32,
@@ -17,22 +19,21 @@ pub struct ClientIntentionPacket {
pub intention: ConnectionProtocol,
}
-#[async_trait]
impl ClientIntentionPacket {
- fn get(self) -> Packet {
- Packet::ClientIntentionPacket(self)
+ pub fn get(self) -> HandshakePacket {
+ HandshakePacket::ClientIntentionPacket(self)
}
- fn write(&self, buf: &mut Vec<u8>) {
+ pub fn write(&self, buf: &mut Vec<u8>) {
mc_buf::write_varint(buf, self.protocol_version as i32);
mc_buf::write_utf(buf, &self.hostname);
mc_buf::write_short(buf, self.port);
mc_buf::write_varint(buf, self.intention.clone() as i32);
}
- async fn read<T: tokio::io::AsyncRead + std::marker::Unpin + std::marker::Send>(
- _buf: &mut BufReader<T>,
- ) -> Result<Packet, String> {
+ pub async fn read<T: tokio::io::AsyncRead + std::marker::Unpin + std::marker::Send>(
+ buf: &mut BufReader<T>,
+ ) -> Result<HandshakePacket, String> {
Err("ClientIntentionPacket::parse not implemented".to_string())
// Ok(ClientIntentionPacket {}.get())
}
diff --git a/minecraft-protocol/src/packets/handshake/mod.rs b/minecraft-protocol/src/packets/handshake/mod.rs
index d2716299..792588b5 100644
--- a/minecraft-protocol/src/packets/handshake/mod.rs
+++ b/minecraft-protocol/src/packets/handshake/mod.rs
@@ -1,6 +1,51 @@
pub mod client_intention_packet;
+use std::f32::consts::E;
+
+use async_trait::async_trait;
+use tokio::io::BufReader;
+
+use crate::connect::PacketFlow;
+
+use super::ProtocolPacket;
+
#[derive(Clone, Debug)]
-pub enum HandshakePacket {
+pub enum HandshakePacket
+where
+ Self: Sized,
+{
ClientIntentionPacket(client_intention_packet::ClientIntentionPacket),
}
+
+#[async_trait]
+impl ProtocolPacket for HandshakePacket {
+ fn id(&self) -> u32 {
+ match self {
+ HandshakePacket::ClientIntentionPacket(_packet) => 0x00,
+ }
+ }
+
+ fn write(&self, buf: &mut Vec<u8>) {
+ match self {
+ HandshakePacket::ClientIntentionPacket(packet) => packet.write(buf),
+ }
+ }
+
+ /// Read a packet by its id, ConnectionProtocol, and flow
+ async fn read<T: tokio::io::AsyncRead + std::marker::Unpin + std::marker::Send>(
+ id: u32,
+ flow: &PacketFlow,
+ buf: &mut BufReader<T>,
+ ) -> Result<HandshakePacket, String>
+ where
+ Self: Sized,
+ {
+ match flow {
+ PacketFlow::ServerToClient => Err("HandshakePacket::read not implemented".to_string()),
+ PacketFlow::ClientToServer => match id {
+ 0x00 => Ok(client_intention_packet::ClientIntentionPacket::read(buf).await?),
+ _ => Err(format!("Unknown ClientToServer status packet id: {}", id)),
+ },
+ }
+ }
+}