embed web source
This commit is contained in:
parent
6bd7379df3
commit
f5ef251458
3 changed files with 44 additions and 62 deletions
106
src/main.rs
106
src/main.rs
|
@ -1,6 +1,6 @@
|
|||
use std::io::{Result};
|
||||
use std::net::{ToSocketAddrs};
|
||||
use std::{env, fs};
|
||||
use std::{env};
|
||||
|
||||
use mcstatusface::http::{HttpServer, StatusCode};
|
||||
use mcstatusface::{MinecraftStatus};
|
||||
|
@ -58,20 +58,11 @@ env!("CARGO_PKG_VERSION"));
|
|||
}
|
||||
|
||||
if request.path() == "/style/index.css" {
|
||||
match fs::read_to_string("./public/style/index.css") {
|
||||
Ok(content) => {
|
||||
response.set_header("Content-Type", "text/css".to_string());
|
||||
response.status(StatusCode::OK);
|
||||
response.body(content.to_string());
|
||||
return response.send();
|
||||
}
|
||||
Err(err) => {
|
||||
eprint!("failed to load index.css: {}\n", err.to_string());
|
||||
response.status(StatusCode::InternalServerError);
|
||||
response.body("Internal Server Error\n".to_string());
|
||||
return response.send();
|
||||
}
|
||||
}
|
||||
let content = include_str!("public/style/index.css");
|
||||
response.set_header("Content-Type", "text/css".to_string());
|
||||
response.status(StatusCode::OK);
|
||||
response.body(content.to_string());
|
||||
return response.send();
|
||||
}
|
||||
|
||||
if request.path() == "/" {
|
||||
|
@ -79,36 +70,35 @@ env!("CARGO_PKG_VERSION"));
|
|||
|accept| accept.contains("text/html")
|
||||
) {
|
||||
// HTML response
|
||||
match fs::read_to_string("./views/index.html") {
|
||||
Ok(mut content) => {
|
||||
response.set_header("Content-Type", "text/html".to_string());
|
||||
response.status(StatusCode::OK);
|
||||
let query_response: String;
|
||||
match request.query().get("s") {
|
||||
Some(query_address) => {
|
||||
let mut address = query_address.to_string();
|
||||
if !address.contains(":") { address.push_str(":25565"); }
|
||||
match address.to_socket_addrs() {
|
||||
Err(_) => {
|
||||
response.set_header("Content-Type", "text/html".to_string());
|
||||
response.status(StatusCode::BadRequest);
|
||||
response.body("Server address is invalid or unreachable.\n".to_string());
|
||||
return response.send();
|
||||
}
|
||||
Ok(mut addrs_iter) => {
|
||||
let address = addrs_iter.next().unwrap();
|
||||
let content = include_str!("views/index.html");
|
||||
response.set_header("Content-Type", "text/html".to_string());
|
||||
response.status(StatusCode::OK);
|
||||
let query_response: String;
|
||||
match request.query().get("s") {
|
||||
Some(query_address) => {
|
||||
let mut address = query_address.to_string();
|
||||
if !address.contains(":") { address.push_str(":25565"); }
|
||||
match address.to_socket_addrs() {
|
||||
Err(_) => {
|
||||
response.set_header("Content-Type", "text/html".to_string());
|
||||
response.status(StatusCode::BadRequest);
|
||||
response.body("Server address is invalid or unreachable.\n".to_string());
|
||||
return response.send();
|
||||
}
|
||||
Ok(mut addrs_iter) => {
|
||||
let address = addrs_iter.next().unwrap();
|
||||
|
||||
let status = MinecraftStatus::fetch(address).unwrap();
|
||||
let status = MinecraftStatus::fetch(address).unwrap();
|
||||
|
||||
let minecraft_status = MinecraftStatusResponse{
|
||||
version: &status.version.name,
|
||||
players: status.players.online,
|
||||
max_players: status.players.max,
|
||||
motd: status.parse_description(),
|
||||
};
|
||||
let minecraft_status = MinecraftStatusResponse{
|
||||
version: &status.version.name,
|
||||
players: status.players.online,
|
||||
max_players: status.players.max,
|
||||
motd: status.parse_description(),
|
||||
};
|
||||
|
||||
query_response = format!(
|
||||
"<hr/>
|
||||
query_response = format!(
|
||||
"<hr/>
|
||||
<h2>Server Details</h2>
|
||||
<p>
|
||||
<strong>Version:</strong> <code>{}</code><br/>
|
||||
|
@ -120,31 +110,23 @@ env!("CARGO_PKG_VERSION"));
|
|||
minecraft_status.players,
|
||||
minecraft_status.max_players,
|
||||
sanitize_html(&minecraft_status.motd).to_string(),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
None => {
|
||||
query_response = String::from("");
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
content = content
|
||||
.replace("{{response}}", &query_response)
|
||||
.replace("{{host}}", match request.headers().get("Host") {
|
||||
Some(host) => { host }
|
||||
None => { "mcq.bliss.town" }
|
||||
});
|
||||
response.body(content.to_string());
|
||||
return response.send();
|
||||
}
|
||||
Err(err) => {
|
||||
eprint!("failed to load index.html: {}\n", err.to_string());
|
||||
response.status(StatusCode::InternalServerError);
|
||||
response.body("Internal Server Error\n".to_string());
|
||||
return response.send();
|
||||
None => {
|
||||
query_response = String::from("");
|
||||
}
|
||||
}
|
||||
|
||||
let response_content = content
|
||||
.replace("{{response}}", &query_response)
|
||||
.replace("{{host}}", match request.headers().get("Host") {
|
||||
Some(host) => { host }
|
||||
None => { "mcq.bliss.town" }
|
||||
});
|
||||
response.body(response_content.to_string());
|
||||
return response.send();
|
||||
}
|
||||
|
||||
// JSON response
|
||||
|
|
58
src/public/style/index.css
Normal file
58
src/public/style/index.css
Normal file
|
@ -0,0 +1,58 @@
|
|||
:root {
|
||||
--accent: #7ca82f;
|
||||
}
|
||||
|
||||
body {
|
||||
font-size: 16px;
|
||||
font-family: 'Inter', sans-serif;
|
||||
}
|
||||
|
||||
a {
|
||||
color: var(--accent);
|
||||
text-decoration: none;
|
||||
}
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
form {
|
||||
width: fit-content;
|
||||
padding: .5em;
|
||||
border: 1px solid black;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
form input[type="text"] {
|
||||
width: fit-content;
|
||||
min-width: 16em;
|
||||
}
|
||||
|
||||
form button {
|
||||
margin-top: .5em;
|
||||
padding: .2em .3em;
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
border: 1px solid black;
|
||||
border-radius: 4px;
|
||||
color: white;
|
||||
background-color: var(--accent);
|
||||
}
|
||||
|
||||
pre code {
|
||||
padding: .5em;
|
||||
border: 1px solid black;
|
||||
border-radius: 4px;
|
||||
font-size: .8em;
|
||||
color: #e0e0e0;
|
||||
background-color: #303030;
|
||||
}
|
||||
|
||||
pre code#motd {
|
||||
display: block;
|
||||
width: fit-content;
|
||||
min-width: 440px;
|
||||
}
|
||||
|
||||
footer {
|
||||
font-family: monospace;
|
||||
}
|
42
src/views/index.html
Normal file
42
src/views/index.html
Normal file
|
@ -0,0 +1,42 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Minecraft Server Query</title>
|
||||
<link href="style/index.css" rel="stylesheet">
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<h1><a href="/">Crafty McStatusFace</a></h1>
|
||||
</header>
|
||||
<hr/>
|
||||
<main>
|
||||
<p>
|
||||
You can use this website to retrieve query information from a Minecraft server!
|
||||
</p>
|
||||
<p>
|
||||
For more information, see <a href="https://minecraft.wiki/w/Query">https://minecraft.wiki/w/Query</a>.
|
||||
</p>
|
||||
|
||||
<form action="/" method="GET">
|
||||
<label for="s">Server Address</label>
|
||||
<input type="text" name="s" value="" placeholder="e.g. mc.bliss.town or 104.17.17.42">
|
||||
<br/>
|
||||
<button type="submit">Check Status</button>
|
||||
</form>
|
||||
|
||||
<p>
|
||||
Alternatively, you can cURL this website to get a raw JSON response:
|
||||
</p>
|
||||
|
||||
<pre><code>curl 'https://{{host}}?s=<server address>'</code></pre>
|
||||
|
||||
{{response}}
|
||||
</main>
|
||||
<hr/>
|
||||
<footer>
|
||||
<em>made with <span aria-label="love">♥</span> by ari, 2025. <a href="https://git.arimelody.me/ari/mcstatusface" target="_blank">source</a></em>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
Loading…
Add table
Add a link
Reference in a new issue