init commit

This commit is contained in:
endernon 2024-05-30 21:51:24 +01:00
parent 4de155f33f
commit af7c7d93d0
4 changed files with 1907 additions and 0 deletions

1846
Cargo.lock generated Normal file

File diff suppressed because it is too large Load diff

12
Cargo.toml Normal file
View file

@ -0,0 +1,12 @@
[package]
name = "ipimg"
version = "0.1.0"
edition = "2021"
[dependencies]
ab_glyph = "0.2.26"
axum = "0.7.5"
axum-client-ip = "0.6.0"
image = { version = "0.25.1", features = ["png"], default-features = false }
imageproc = "0.25.0"
tokio = { version = "1.37.0", features = ["rt-multi-thread"] }

BIN
Roboto-Regular.ttf Normal file

Binary file not shown.

49
src/main.rs Normal file
View file

@ -0,0 +1,49 @@
use std::{io::Cursor, net::SocketAddr};
use ab_glyph::FontRef;
use axum::{extract::State, http::header, response::IntoResponse, routing::get, Router};
use axum_client_ip::InsecureClientIp;
use image::Rgba;
use imageproc::drawing::{self, text_size};
#[tokio::main]
async fn main() {
let fontfile = include_bytes!("../Roboto-Regular.ttf");
let font = FontRef::try_from_slice(fontfile).unwrap();
let app = Router::new().route("/ip.png", get(ip_png)).with_state(font);
let list = tokio::net::TcpListener::bind("0.0.0.0:8080").await.unwrap();
axum::serve(
list,
app.into_make_service_with_connect_info::<SocketAddr>(),
)
.await
.unwrap();
}
async fn ip_png(ip: InsecureClientIp, State(font): State<FontRef<'static>>) -> impl IntoResponse {
let out_buf = tokio::task::spawn_blocking(move || {
let text = ip.0.to_string();
let (x, _) = text_size(100.0, &font, &text);
let mut img = image::DynamicImage::new(x, 100, image::ColorType::Rgba8);
let textcol = Rgba([127, 127, 127, 255]);
drawing::draw_text_mut(&mut img, textcol, 0, 0, 100.0, &font, &text);
let mut buf = Vec::new();
img.write_to(&mut Cursor::new(&mut buf), image::ImageFormat::Png)
.unwrap();
buf
})
.await
.unwrap();
let headers = [
(header::CONTENT_TYPE, "image/png"),
(header::CACHE_CONTROL, "private, max-age=60"),
];
(headers, out_buf)
}