mirror of
https://github.com/YGGverse/hlstate-rs.git
synced 2026-03-31 17:15:37 +00:00
init httpd crate skeleton
This commit is contained in:
parent
470a7d0e73
commit
802e0821e4
13 changed files with 1877 additions and 432 deletions
2106
Cargo.lock
generated
2106
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
|
@ -2,6 +2,6 @@
|
||||||
resolver = "2"
|
resolver = "2"
|
||||||
members = [
|
members = [
|
||||||
#"crates/crawler",
|
#"crates/crawler",
|
||||||
#"crates/http",
|
"crates/httpd",
|
||||||
"crates/mysql",
|
#"crates/mysql",
|
||||||
]
|
]
|
||||||
19
crates/httpd/Cargo.toml
Normal file
19
crates/httpd/Cargo.toml
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
[package]
|
||||||
|
name = "hlstate-httpd"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
license = "MIT"
|
||||||
|
readme = "README.md"
|
||||||
|
description = "Web stats for Xash3D servers, based on Rocket engine"
|
||||||
|
keywords = ["hlstate", "half-life", "xash3d", "http", "server"]
|
||||||
|
categories = ["parsing", "text-processing", "value-formatting"]
|
||||||
|
repository = "https://github.com/YGGverse/hlstate-rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
chrono = { version = "0.4.41", features = ["serde"] }
|
||||||
|
clap = { version = "4.5.54", features = ["derive"] }
|
||||||
|
#mysql = { package = "hlstate-mysql", version = "0.1.0", path = "../mysql" }
|
||||||
|
rocket = "0.5.1"
|
||||||
|
rocket_dyn_templates = { version = "0.2.0", features = ["tera"] }
|
||||||
|
serde = { version = "1.0.228", features = ["derive"] }
|
||||||
|
toml = "0.9.10"
|
||||||
21
crates/httpd/LICENSE
Normal file
21
crates/httpd/LICENSE
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2026 YGGverse
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
11
crates/httpd/README.md
Normal file
11
crates/httpd/README.md
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
# hlstate-httpd
|
||||||
|
|
||||||
|
Web server implementation based on the Rocket engine
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> In development!
|
||||||
|
|
||||||
|
```
|
||||||
|
cd crates/httpd
|
||||||
|
cargo run -- -c config.toml
|
||||||
|
```
|
||||||
12
crates/httpd/config.toml
Normal file
12
crates/httpd/config.toml
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
title = "HLState"
|
||||||
|
|
||||||
|
format_time = "%d/%m/%Y %H:%M"
|
||||||
|
|
||||||
|
# Bind server on given host
|
||||||
|
host = "127.0.0.1"
|
||||||
|
|
||||||
|
# Bind server on given port
|
||||||
|
port = 8000
|
||||||
|
|
||||||
|
#Configure instance in the debug mode
|
||||||
|
debug = true
|
||||||
12
crates/httpd/src/argument.rs
Normal file
12
crates/httpd/src/argument.rs
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
use clap::Parser;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
#[derive(Parser, Debug)]
|
||||||
|
#[command(version, about, long_about = None)]
|
||||||
|
pub struct Argument {
|
||||||
|
/// Path to config file
|
||||||
|
///
|
||||||
|
/// * see `config.toml`
|
||||||
|
#[arg(short, long)]
|
||||||
|
pub config: PathBuf,
|
||||||
|
}
|
||||||
12
crates/httpd/src/config.rs
Normal file
12
crates/httpd/src/config.rs
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
use serde::Deserialize;
|
||||||
|
use std::net::IpAddr;
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
pub struct Config {
|
||||||
|
pub title: String,
|
||||||
|
pub description: Option<String>,
|
||||||
|
pub format_time: String,
|
||||||
|
pub host: IpAddr,
|
||||||
|
pub port: u16,
|
||||||
|
pub debug: bool,
|
||||||
|
}
|
||||||
7
crates/httpd/src/global.rs
Normal file
7
crates/httpd/src/global.rs
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
use rocket::serde::Serialize;
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Serialize)]
|
||||||
|
#[serde(crate = "rocket::serde")]
|
||||||
|
pub struct Global {
|
||||||
|
pub format_time: String,
|
||||||
|
}
|
||||||
64
crates/httpd/src/main.rs
Normal file
64
crates/httpd/src/main.rs
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
#[macro_use]
|
||||||
|
extern crate rocket;
|
||||||
|
|
||||||
|
mod argument;
|
||||||
|
mod config;
|
||||||
|
mod global;
|
||||||
|
mod meta;
|
||||||
|
|
||||||
|
use chrono::{DateTime, Utc};
|
||||||
|
use global::Global;
|
||||||
|
use meta::Meta;
|
||||||
|
use rocket::{State, http::Status, serde::Serialize};
|
||||||
|
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,
|
||||||
|
}
|
||||||
|
let servers: Vec<Server> = Vec::new();
|
||||||
|
Ok(Template::render(
|
||||||
|
"index",
|
||||||
|
context! {
|
||||||
|
title: &meta.title,
|
||||||
|
servers: servers,
|
||||||
|
},
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[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 {
|
||||||
|
format_time: config.format_time,
|
||||||
|
})
|
||||||
|
.manage(Meta {
|
||||||
|
description: config.description,
|
||||||
|
title: config.title,
|
||||||
|
version: env!("CARGO_PKG_VERSION").into(),
|
||||||
|
})
|
||||||
|
.mount("/", routes![index])
|
||||||
|
}
|
||||||
|
|
||||||
|
const S: &str = " • ";
|
||||||
|
|
||||||
|
fn time(timestamp: i64) -> DateTime<Utc> {
|
||||||
|
DateTime::<Utc>::from_timestamp(timestamp, 0).unwrap()
|
||||||
|
}
|
||||||
9
crates/httpd/src/meta.rs
Normal file
9
crates/httpd/src/meta.rs
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
use rocket::serde::Serialize;
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Serialize)]
|
||||||
|
#[serde(crate = "rocket::serde")]
|
||||||
|
pub struct Meta {
|
||||||
|
pub description: Option<String>,
|
||||||
|
pub title: String,
|
||||||
|
pub version: String,
|
||||||
|
}
|
||||||
14
crates/httpd/templates/index.html.tera
Normal file
14
crates/httpd/templates/index.html.tera
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
{% extends "layout" %}
|
||||||
|
{% block content %}
|
||||||
|
{% if servers %}
|
||||||
|
{% for server in servers %}
|
||||||
|
<div>
|
||||||
|
<h2><a href="{{ server.host }}">{{ server.name }}</a></h2>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
<div>
|
||||||
|
<p>Nobody.</p>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock content %}
|
||||||
18
crates/httpd/templates/layout.html.tera
Normal file
18
crates/httpd/templates/layout.html.tera
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<title>{{ title }}</title>
|
||||||
|
<style>
|
||||||
|
* {color-scheme: light dark}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1><a href="/">{{ title }}</a></h1>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
{% block content %}{% endblock content %}
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Loading…
Add table
Add a link
Reference in a new issue