Archival commit, newer version exists, will push

This commit is contained in:
nke4 committed 2026-10-27 11:22:24 +01:00
commit b6094834bb
22 files changed
+7369

No files matched your search

+68
View File
@@ -0,0 +1,68 @@
use crate::{App, db};
use serde_json::json;
use std::sync::Arc;
use std::time::Duration;
/// Fire-and-forget notification to the configured webhook (if any).
pub fn notify(app: Arc<App>, title: String, body: String, good: bool) {
tokio::spawn(async move {
let configured = {
let c = app.db.lock().unwrap();
!db::setting_get(&c, "webhook_url").is_empty()
};
if configured {
if let Err(e) = send(&app, &title, &body, good).await {
eprintln!("webhook failed: {e}");
}
}
});
}
pub async fn send(app: &App, title: &str, body: &str, good: bool) -> Result<(), String> {
let (url, kind) = {
let c = app.db.lock().unwrap();
(db::setting_get(&c, "webhook_url"), db::setting_get(&c, "webhook_kind"))
};
if url.is_empty() {
return Err("no webhook URL configured".into());
}
let client = &app.http_strict;
let req = match kind.as_str() {
"discord" => client
.post(&url)
.json(&json!({ "content": format!("{} **{}**\n{}", if good { "🟢" } else { "🔴" }, title, body) })),
"slack" => client
.post(&url)
.json(&json!({ "text": format!("{} *{}*\n{}", if good { ":large_green_circle:" } else { ":red_circle:" }, title, body) })),
"ntfy" => {
let mut r = client
.post(&url)
.header("Tags", if good { "white_check_mark" } else { "rotating_light" })
.header("Priority", if good { "default" } else { "high" })
.body(body.to_string());
if title.is_ascii() && !title.chars().any(|c| c.is_control()) {
r = r.header("Title", title);
} else {
r = r.body(format!("{title}\n{body}"));
}
r
}
_ => client.post(&url).json(&json!({
"title": title,
"message": body,
"status": if good { "up" } else { "down" },
"time": db::now(),
"source": "labdeck",
})),
};
let resp = req
.timeout(Duration::from_secs(10))
.send()
.await
.map_err(|e| e.to_string())?;
if resp.status().is_success() {
Ok(())
} else {
Err(format!("webhook answered HTTP {}", resp.status().as_u16()))
}
}