aboutsummaryrefslogtreecommitdiff
path: root/minecraft-client
diff options
context:
space:
mode:
Diffstat (limited to 'minecraft-client')
-rw-r--r--minecraft-client/src/lib.rs2
-rw-r--r--minecraft-client/src/ping.rs46
2 files changed, 47 insertions, 1 deletions
diff --git a/minecraft-client/src/lib.rs b/minecraft-client/src/lib.rs
index 3491f6ad..1fc97709 100644
--- a/minecraft-client/src/lib.rs
+++ b/minecraft-client/src/lib.rs
@@ -1,4 +1,4 @@
-
+pub mod ping;
#[cfg(test)]
mod tests {
diff --git a/minecraft-client/src/ping.rs b/minecraft-client/src/ping.rs
new file mode 100644
index 00000000..05aa84be
--- /dev/null
+++ b/minecraft-client/src/ping.rs
@@ -0,0 +1,46 @@
+///! Ping Minecraft servers.
+
+use minecraft_protocol::{
+ connection::Connection,
+ packets::{
+ handshake::client_intention_packet::ClientIntentionPacket,
+ status::{
+ clientbound_status_response_packet::ClientboundStatusResponsePacket,
+ serverbound_status_request_packet::ServerboundStatusRequestPacket,
+ },
+ ConnectionProtocol, Packet, PacketTrait,
+ },
+ resolver, ServerAddress,
+};
+
+pub async fn ping_server(
+ address: &ServerAddress,
+) -> Result<ClientboundStatusResponsePacket, String> {
+ let resolved_address = resolver::resolve_address(address).await?;
+
+ let mut conn = Connection::new(&resolved_address).await?;
+
+ // send the client intention packet and switch to the status state
+ conn.send_packet(
+ ClientIntentionPacket {
+ protocol_version: 757,
+ hostname: address.host.clone(),
+ port: address.port,
+ intention: ConnectionProtocol::Status,
+ }
+ .get(),
+ )
+ .await;
+ conn.switch_state(ConnectionProtocol::Status);
+
+ // send the empty status request packet
+ conn.send_packet(ServerboundStatusRequestPacket {}.get())
+ .await;
+
+ let packet = conn.read_packet().await.unwrap();
+
+ Ok(match packet {
+ Packet::ClientboundStatusResponsePacket(p) => p,
+ _ => Err("Invalid packet type".to_string())?,
+ })
+}