- Nuevo módulo notify.zig con funciones send(), sendError(), sendRecovery() - Opción --notify/-n para activar notificaciones - Solo notifica cuando hay errores (evita spam) - Notificación crítica con lista de servicios caídos - Usa notify-send (libnotify) disponible en Linux 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
79 lines
2.4 KiB
Zig
79 lines
2.4 KiB
Zig
//! Módulo de notificaciones desktop
|
|
//!
|
|
//! Envía notificaciones usando notify-send (libnotify) en Linux.
|
|
//! Las notificaciones solo se envían cuando hay errores para evitar spam.
|
|
|
|
const std = @import("std");
|
|
|
|
/// Errores posibles durante el envío de notificaciones.
|
|
pub const NotifyError = error{
|
|
/// No se pudo ejecutar notify-send.
|
|
CommandFailed,
|
|
/// notify-send no está instalado.
|
|
NotifyNotAvailable,
|
|
};
|
|
|
|
/// Envía una notificación desktop usando notify-send.
|
|
///
|
|
/// Parámetros:
|
|
/// - allocator: Allocator para el proceso hijo.
|
|
/// - title: Título de la notificación.
|
|
/// - body: Cuerpo del mensaje.
|
|
/// - urgency: Nivel de urgencia ("low", "normal", "critical").
|
|
///
|
|
/// Ejemplo:
|
|
/// ```zig
|
|
/// try notify.send(allocator, "Service Monitor", "Forgejo está caído!", "critical");
|
|
/// ```
|
|
pub fn send(
|
|
allocator: std.mem.Allocator,
|
|
title: []const u8,
|
|
body: []const u8,
|
|
urgency: []const u8,
|
|
) NotifyError!void {
|
|
const result = std.process.Child.run(.{
|
|
.allocator = allocator,
|
|
.argv = &[_][]const u8{
|
|
"notify-send",
|
|
"--urgency",
|
|
urgency,
|
|
"--app-name",
|
|
"Service Monitor",
|
|
title,
|
|
body,
|
|
},
|
|
}) catch {
|
|
return NotifyError.CommandFailed;
|
|
};
|
|
|
|
allocator.free(result.stdout);
|
|
allocator.free(result.stderr);
|
|
|
|
if (result.term.Exited != 0) {
|
|
return NotifyError.CommandFailed;
|
|
}
|
|
}
|
|
|
|
/// Envía una notificación de error crítico.
|
|
///
|
|
/// Wrapper conveniente para notificaciones de servicios caídos.
|
|
pub fn sendError(allocator: std.mem.Allocator, service_name: []const u8) NotifyError!void {
|
|
var body_buf: [256]u8 = undefined;
|
|
const body = std.fmt.bufPrint(&body_buf, "❌ {s} no responde", .{service_name}) catch {
|
|
return NotifyError.CommandFailed;
|
|
};
|
|
|
|
return send(allocator, "⚠️ Servicio caído", body, "critical");
|
|
}
|
|
|
|
/// Envía una notificación de recuperación.
|
|
///
|
|
/// Para notificar cuando un servicio que estaba caído vuelve a funcionar.
|
|
pub fn sendRecovery(allocator: std.mem.Allocator, service_name: []const u8) NotifyError!void {
|
|
var body_buf: [256]u8 = undefined;
|
|
const body = std.fmt.bufPrint(&body_buf, "✅ {s} está funcionando de nuevo", .{service_name}) catch {
|
|
return NotifyError.CommandFailed;
|
|
};
|
|
|
|
return send(allocator, "Servicio recuperado", body, "normal");
|
|
}
|