Skip to main content

raknet_rust/handshake/
offline.rs

1use bytes::{Buf, Bytes};
2
3use crate::error::DecodeError;
4use crate::protocol::codec::RaknetCodec;
5use crate::protocol::constants::Magic;
6
7#[derive(Debug, Clone)]
8pub struct UnconnectedPing {
9    pub ping_time: i64,
10    pub client_guid: u64,
11    pub magic: Magic,
12}
13
14#[derive(Debug, Clone)]
15pub struct UnconnectedPong {
16    pub ping_time: i64,
17    pub server_guid: u64,
18    pub magic: Magic,
19    pub motd: Bytes,
20}
21
22pub(super) fn decode_ping(
23    src: &mut impl Buf,
24    expected_magic: Magic,
25) -> Result<UnconnectedPing, DecodeError> {
26    let ping_time = i64::decode_raknet(src)?;
27    let magic = super::validate_magic(Magic::decode_raknet(src)?, expected_magic)?;
28    let client_guid = u64::decode_raknet(src)?;
29
30    Ok(UnconnectedPing {
31        ping_time,
32        client_guid,
33        magic,
34    })
35}
36
37pub(super) fn decode_pong(
38    src: &mut impl Buf,
39    expected_magic: Magic,
40) -> Result<UnconnectedPong, DecodeError> {
41    let ping_time = i64::decode_raknet(src)?;
42    let server_guid = u64::decode_raknet(src)?;
43    let magic = super::validate_magic(Magic::decode_raknet(src)?, expected_magic)?;
44    let motd_len = u16::decode_raknet(src)? as usize;
45    if src.remaining() < motd_len {
46        return Err(DecodeError::UnexpectedEof);
47    }
48    let motd = src.copy_to_bytes(motd_len);
49
50    Ok(UnconnectedPong {
51        ping_time,
52        server_guid,
53        magic,
54        motd,
55    })
56}