use crate::protocol::parsing::Parsable; use crate::protocol::types::{Chat, Json, Uuid, VarInt}; #[derive(Clone, Debug, PartialEq)] pub struct CL00Disconnect { pub reason: Chat, } crate::protocol::packets::packet!( CL00Disconnect, 0x00, crate::protocol::ClientState::Login, false, |data: &'data [u8]| -> crate::protocol::parsing::IResult<&'data [u8], CL00Disconnect> { let (data, reason) = Json::parse(data)?; Ok((data, CL00Disconnect { reason })) }, |packet: &CL00Disconnect| -> Vec { packet.reason.serialize() } ); #[derive(Clone, Debug, PartialEq)] pub struct CL01EncryptionRequest { pub server_id: String, pub public_key: Vec, pub verify_token: Vec, } crate::protocol::packets::packet!( CL01EncryptionRequest, 0x01, crate::protocol::ClientState::Login, false, |data: &'data [u8]| -> crate::protocol::parsing::IResult<&'data [u8], CL01EncryptionRequest> { let (data, server_id) = String::parse(data)?; let (data, public_key) = u8::parse_vec(data)?; let (data, verify_token) = u8::parse_vec(data)?; Ok(( data, CL01EncryptionRequest { server_id, public_key, verify_token, }, )) }, |packet: &CL01EncryptionRequest| -> Vec { let mut output = vec![]; output.extend(packet.server_id.serialize()); output.extend(packet.public_key.serialize()); output.extend(packet.verify_token.serialize()); output } ); #[derive(Clone, Debug, PartialEq)] pub struct CL02LoginSuccess { pub uuid: Uuid, pub username: String, pub properties: Vec, } #[derive(Clone, Debug, PartialEq)] pub struct CL02LoginSuccessProperty { pub name: String, pub value: String, pub signature: Option, } impl Parsable for CL02LoginSuccessProperty { #[tracing::instrument] fn parse(data: &[u8]) -> crate::protocol::parsing::IResult<&[u8], Self> { let (data, name) = String::parse(data)?; let (data, value) = String::parse(data)?; let (data, signature) = String::parse_optional(data)?; Ok(( data, CL02LoginSuccessProperty { name, value, signature, }, )) } #[tracing::instrument] fn serialize(&self) -> Vec { let mut output = vec![]; output.extend(self.name.serialize()); output.extend(self.value.serialize()); output.extend(self.signature.serialize()); output } } crate::protocol::packets::packet!( CL02LoginSuccess, 0x02, crate::protocol::ClientState::Login, false, |data: &'data [u8]| -> crate::protocol::parsing::IResult<&'data [u8], CL02LoginSuccess> { let (data, uuid) = Uuid::parse(data)?; let (data, username) = String::parse(data)?; let (data, properties) = CL02LoginSuccessProperty::parse_vec(data)?; Ok(( data, CL02LoginSuccess { uuid, username, properties, }, )) }, |packet: &CL02LoginSuccess| -> Vec { let mut output = vec![]; output.extend(packet.uuid.serialize()); output.extend(packet.username.serialize()); output.extend(packet.properties.serialize()); output } ); #[derive(Copy, Clone, Debug, PartialEq)] pub struct CL03SetCompression { pub threshold: VarInt, } crate::protocol::packets::packet!( CL03SetCompression, 0x03, crate::protocol::ClientState::Login, false, |data: &'data [u8]| -> crate::protocol::parsing::IResult<&'data [u8], CL03SetCompression> { let (data, threshold) = VarInt::parse(data)?; Ok((data, CL03SetCompression { threshold })) }, |packet: &CL03SetCompression| -> Vec { packet.threshold.serialize() } ); #[derive(Clone, Debug, PartialEq)] pub struct CL04LoginPluginRequest { pub message_id: VarInt, pub channel: String, pub data: Vec, } crate::protocol::packets::packet!( CL04LoginPluginRequest, 0x04, crate::protocol::ClientState::Login, false, |data: &'data [u8]| -> crate::protocol::parsing::IResult<&'data [u8], CL04LoginPluginRequest> { let (data, message_id) = VarInt::parse(data)?; let (data, channel) = String::parse(data)?; Ok(( data, CL04LoginPluginRequest { message_id, channel, data: data.to_vec(), }, )) }, |packet: &CL04LoginPluginRequest| -> Vec { let mut output = vec![]; output.extend(packet.message_id.serialize()); output.extend(packet.channel.serialize()); output.extend(&packet.data); output } );