aboutsummaryrefslogtreecommitdiff
path: root/minecraft-protocol/src/server_status_pinger.rs
blob: ad3d4e52cafa34555ecdf4431616d03d272aa74c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
use crate::{
    connection::Connection,
    mc_buf,
    packets::{ClientIntentionPacket, ConnectionProtocol, ServerboundStatusRequestPacket},
    resolver, ServerAddress,
};
use tokio::io::AsyncReadExt;

pub async fn ping_server(address: &ServerAddress) -> Result<(), String> {
    let resolved_address = resolver::resolve_address(&address).await?;

    let mut conn = Connection::new(&resolved_address).await?;

    println!("resolved_address {}", &resolved_address.ip);
    println!("writing intention packet {}", address.host);

    conn.send_packet(&ClientIntentionPacket {
        protocol_version: 757,
        hostname: &address.host,
        port: address.port,
        intention: ConnectionProtocol::Status,
    })
    .await;
    conn.send_packet(&ServerboundStatusRequestPacket {}).await;

    let data = mc_buf::read_varint(conn.stream);
    println!("data {}", data);

    // log what the server sends back
    loop {
        if 0 == conn.stream.read_buf(&mut conn.buffer).await.unwrap() {
            // The remote closed the connection. For this to be a clean
            // shutdown, there should be no data in the read buffer. If
            // there is, this means that the peer closed the socket while
            // sending a frame.

            // log conn.buffer
            println!("{:?}", conn.buffer);
            if conn.buffer.is_empty() {
                println!("buffer is empty ok");
                return Ok(());
            } else {
                return Err("connection reset by peer".into());
            }
        }
    }
}