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