stop the server if no players are detected for a given time

This commit is contained in:
2026-02-02 14:21:05 +01:00
parent 4c9593283e
commit 1fd8be0180
3 changed files with 133 additions and 1 deletions

View File

@@ -1,18 +1,59 @@
use std::error::Error;
use std::time::Duration;
use rcon::Connection;
use tokio::time::Instant;
use tokio::{io::copy_bidirectional, main};
use tokio::net::{TcpListener, TcpStream};
fn parse_players_online(s: &str) -> Option<u32> {
s.split_whitespace()
.find_map(|tok| tok.parse::<u32>().ok())
}
#[main]
async fn main() -> Result<(), Box<dyn Error>> {
let listen_addr = "0.0.0.0:8080";
let server_addr = "127.0.0.1:25565";
let rcon_addr = "127.0.0.1:25575";
println!("Listening on {listen_addr}");
println!("Proxying to {server_addr}");
let listener = TcpListener::bind(listen_addr).await?;
tokio::spawn(async move {
let mut conn = <Connection<TcpStream>>::builder()
.enable_minecraft_quirks(true)
.connect(rcon_addr, "Lusia669")
.await.unwrap();
let mut idle = false;
let mut last_online = Instant::now();
let idle_timeout = Duration::from_secs(10);
loop {
let players_cmd_output = conn.cmd("list").await.unwrap();
let players_number = parse_players_online(&players_cmd_output).unwrap();
if players_number > 0 {
last_online = Instant::now();
}
println!("{players_number} {idle}");
if Instant::now() - last_online > idle_timeout {
idle = true;
println!("Stopping the server");
conn.cmd("stop").await.unwrap();
} else {
idle = false;
}
tokio::time::sleep(Duration::from_millis(250)).await;
};
});
while let Ok((mut inbound, _)) = listener.accept().await {
let mut outbound = TcpStream::connect(server_addr).await?;