service-monitor/src/notify.zig
reugenio 5a17d74680 Fase 3: Notificaciones desktop (notify-send)
- 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>
2025-12-07 21:15:17 +01:00

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");
}