#[macro_use]
extern crate rocket;
mod argument;
mod config;
mod global;
mod meta;
mod scrape;
use global::Global;
use meta::Meta;
use rocket::{State, http::Status};
use rocket_dyn_templates::{Template, context};
#[get("/")]
fn index(meta: &State, global: &State) -> Result {
// @TODO: requires library impl
// https://github.com/FWGS/xash3d-master/issues/4
let scrape = std::process::Command::new(&global.query)
.arg("all")
.arg("-M")
.arg(
global
.masters
.iter()
.map(|a| a.to_string())
.collect::>()
.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)
}
}
#[launch]
fn rocket() -> _ {
use clap::Parser;
let argument = argument::Argument::parse();
let config: config::Config =
toml::from_str(&std::fs::read_to_string(argument.config).unwrap()).unwrap();
rocket::build()
.attach(Template::fairing())
.configure(rocket::Config {
port: config.port,
address: config.host,
..if config.debug {
rocket::Config::debug_default()
} else {
rocket::Config::release_default()
}
})
.manage(Global {
masters: config.masters,
query: config.query,
})
.manage(Meta {
title: config.title,
version: env!("CARGO_PKG_VERSION").into(),
})
.mount("/", routes![index])
}