summaryrefslogtreecommitdiffstats
path: root/server/notification-providers/ntfy.js
blob: ad1d39f8f399781ab9c08f7d71007bfd098ce71a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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 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, { headers: headers });
                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";
                    // if priority is not 5, increase priority for down alerts
                    priority = priority === 5 ? priority : priority + 1;
                } else if (heartbeatJSON["status"] === UP) {
                    tags = [ "green_circle" ];
                    status = "Up";
                }
            }
            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, { headers: headers });

            return okMsg;

        } catch (error) {
            this.throwGeneralAxiosError(error);
        }
    }
}

module.exports = Ntfy;