From 1d9d205d8c6b15d2fecd36b05658ea711cbd7c55 Mon Sep 17 00:00:00 2001 From: Tamipes Date: Thu, 11 Dec 2025 01:43:51 +0100 Subject: [PATCH] feat: gracefully handle status request, when server doesn't exist --- src/main.rs | 22 ++++++++++++++++------ src/mc_server.rs | 2 -- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/main.rs b/src/main.rs index ff09cb2..2a10663 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,9 +5,7 @@ use std::time::Duration; use tokio::net::{TcpListener, TcpStream}; use tracing_subscriber::{prelude::*, EnvFilter}; -use crate::mc_server::{ - complete_status_request, MinecraftAPI, MinecraftServerHandle, ServerDeploymentStatus, -}; +use crate::mc_server::{MinecraftAPI, MinecraftServerHandle, ServerDeploymentStatus}; use crate::opaque_error::OpaqueError; use crate::packets::clientbound::status::StatusStructNew; use crate::packets::serverbound::handshake::Handshake; @@ -141,7 +139,18 @@ async fn handle_status( "Could not find §kserver§r: §f§o{server_addr}§r\nMinecraft Ingress{bye_message}" ); - return complete_status_request(client_stream, status_struct).await; + mc_server::complete_status_request(client_stream, status_struct).await?; + + // Recieve the ping packet, so the client does not send it again + let _ping = Packet::parse(client_stream).await?; + // Send a bad ping packet back, so the client shows *searching* icon + let _pong = Packet::new(9, vec![0; 8]) + .ok_or("failed to create empty pong packet?")? + .send_packet(client_stream) + .await + .map_err(|_| "failed to send pong packet")?; + + return Ok(()); } }; tracing::debug!("kube server status: {:?}", server.query_status().await?); @@ -162,12 +171,13 @@ async fn handle_status( ServerDeploymentStatus::Offline => { status_struct.players.max = 1; status_struct.description.text = format!( - "Server is currently §onot§r running. \n§aJoin to start it!§r {bye_message}" + "Server is currently §onot§r running. \n§aJoin to start it!§r {bye_message}" ); } }; - return complete_status_request(client_stream, status_struct).await; + mc_server::complete_status_request(client_stream, status_struct).await?; + return mc_server::handle_ping(client_stream).await; } #[tracing::instrument(level = "info", fields(server_addr = handshake.get_server_address()),skip(client_stream, handshake, api))] diff --git a/src/mc_server.rs b/src/mc_server.rs index 03608b3..3d028fc 100644 --- a/src/mc_server.rs +++ b/src/mc_server.rs @@ -39,8 +39,6 @@ pub async fn complete_status_request( .send_packet(client_stream) .await .map_err(|_| "Failed to send status packet")?; - - mc_server::handle_ping(client_stream).await?; Ok(()) }