uptime-kuma/server/notification-providers/ntfy.js
Epifeny 52737a1299
feat(ntfy): Add monitor metadata to notification messages for automation (#6762)
Co-authored-by: epifeny <epifeny@users.noreply.github.com>
2026-01-19 08:22:03 +01:00

99 lines
3.5 KiB
JavaScript

const NotificationProvider = require("./notification-provider");
const axios = require("axios");
const { DOWN, UP } = require("../../src/util");
class Ntfy extends NotificationProvider {
name = "ntfy";
/**
* @inheritdoc
*/
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
const okMsg = "Sent Successfully.";
try {
let headers = {};
if (notification.ntfyAuthenticationMethod === "usernamePassword") {
headers = {
Authorization:
"Basic " +
Buffer.from(notification.ntfyusername + ":" + notification.ntfypassword).toString("base64"),
};
} else if (notification.ntfyAuthenticationMethod === "accessToken") {
headers = {
Authorization: "Bearer " + notification.ntfyaccesstoken,
};
}
if (notification.ntfyCall) {
headers["X-Call"] = notification.ntfyCall;
}
let config = {
headers,
};
config = this.getAxiosConfigWithProxy(config);
// If heartbeatJSON is null, assume non monitoring notification (Certificate warning) or testing.
if (heartbeatJSON == null) {
let ntfyTestData = {
topic: notification.ntfytopic,
title: (monitorJSON?.name || notification.ntfytopic) + " [Uptime-Kuma]",
message: msg,
priority: notification.ntfyPriority,
tags: ["test_tube"],
};
await axios.post(notification.ntfyserverurl, ntfyTestData, config);
return okMsg;
}
let tags = [];
let status = "unknown";
let priority = notification.ntfyPriority || 4;
if ("status" in heartbeatJSON) {
if (heartbeatJSON.status === DOWN) {
tags = ["red_circle"];
status = "Down";
// defaults to max(priority + 1, 5)
priority = notification.ntfyPriorityDown || (priority === 5 ? priority : priority + 1);
} else if (heartbeatJSON["status"] === UP) {
tags = ["green_circle"];
status = "Up";
}
}
// Include monitor's assigned tags
if (monitorJSON && monitorJSON.tags && Array.isArray(monitorJSON.tags)) {
const monitorTagNames = monitorJSON.tags.map((tag) => tag.name);
tags = tags.concat(monitorTagNames);
}
let data = {
topic: notification.ntfytopic,
message: heartbeatJSON.msg,
priority: priority,
title: monitorJSON.name + " " + status + " [Uptime-Kuma]",
tags: tags,
};
if (monitorJSON.url && monitorJSON.url !== "https://") {
data.actions = [
{
action: "view",
label: "Open " + monitorJSON.name,
url: monitorJSON.url,
},
];
}
if (notification.ntfyIcon) {
data.icon = notification.ntfyIcon;
}
await axios.post(notification.ntfyserverurl, data, config);
return okMsg;
} catch (error) {
this.throwGeneralAxiosError(error);
}
}
}
module.exports = Ntfy;