make tmp cli scrape impl

This commit is contained in:
yggverse 2026-03-05 22:05:56 +02:00
parent 105409a76b
commit e52ed711ba
8 changed files with 312 additions and 47 deletions

View file

@ -1,10 +1,11 @@
use serde::Deserialize;
use rocket::serde::Deserialize;
use std::{
collections::HashSet,
net::{IpAddr, SocketAddr},
};
#[derive(Debug, Deserialize)]
#[serde(crate = "rocket::serde")]
pub struct Config {
pub debug: bool,
pub description: Option<String>,

View file

@ -5,30 +5,58 @@ mod argument;
mod config;
mod global;
mod meta;
mod scrape;
use chrono::{DateTime, Utc};
use global::Global;
use meta::Meta;
use rocket::{State, http::Status, serde::Serialize};
use rocket::{State, http::Status};
use rocket_dyn_templates::{Template, context};
#[get("/")]
fn index(meta: &State<Meta>, global: &State<Global>) -> Result<Template, Status> {
#[derive(Serialize)]
#[serde(crate = "rocket::serde")]
struct Server {
name: String,
// @TODO: requires library impl
// https://github.com/FWGS/xash3d-master/issues/4
let scrape = std::process::Command::new("xash3d-query")
.arg("all")
.arg("-M")
.arg(
global
.masters
.iter()
.map(|a| a.to_string())
.collect::<Vec<_>>()
.join(","),
)
.arg("-j")
.output()
.map_err(|e| {
error!("Make sure `xash3d-query` is installed: {e}");
Status::InternalServerError
})?;
if scrape.status.success() {
let result: scrape::Result = rocket::serde::json::serde_json::from_str(
str::from_utf8(&scrape.stdout).map_err(|e| {
error!("stdout parse error: {e}");
Status::InternalServerError
})?,
)
.map_err(|e| {
error!("JSON parse error: {e}");
Status::InternalServerError
})?;
Ok(Template::render(
"index",
context! {
masters: &global.masters,
title: &meta.title,
version: &meta.version,
servers: result.servers,
},
))
} else {
error!("Make sure `xash3d-query` is installed!");
Err(Status::InternalServerError)
}
let servers: Vec<Server> = Vec::new();
Ok(Template::render(
"index",
context! {
masters: &global.masters,
servers: servers,
title: &meta.title,
version: &meta.version,
},
))
}
#[launch]
@ -59,9 +87,3 @@ fn rocket() -> _ {
})
.mount("/", routes![index])
}
const S: &str = "";
fn time(timestamp: i64) -> DateTime<Utc> {
DateTime::<Utc>::from_timestamp(timestamp, 0).unwrap()
}

View file

@ -0,0 +1,33 @@
use rocket::serde::{Deserialize, Serialize};
use std::net::SocketAddr;
#[derive(Debug, Deserialize, Serialize)]
#[serde(crate = "rocket::serde")]
pub struct Result {
pub protocol: Vec<i32>,
pub master_timeout: u32,
pub server_timeout: u32,
pub masters: Vec<SocketAddr>,
pub filter: String,
pub servers: Vec<Info>,
}
#[derive(Debug, Deserialize, Serialize)]
#[serde(crate = "rocket::serde")]
pub struct Info {
pub time: i64,
pub address: SocketAddr,
pub ping: f64,
pub status: String,
pub gamedir: String,
pub map: String,
pub host: String,
pub protocol: i32,
pub numcl: u32,
pub maxcl: u32,
pub dm: bool,
pub team: bool,
pub coop: bool,
pub password: bool,
pub dedicated: bool,
}