summaryrefslogtreecommitdiffstats
path: root/server/notification-providers/mattermost.js
blob: 9946d02b2ae74a50f077d13f80fa8b41a5e68840 (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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
const NotificationProvider = require("./notification-provider");
const axios = require("axios");
const { DOWN, UP } = require("../../src/util");

class Mattermost extends NotificationProvider {
    name = "mattermost";

    /**
     * @inheritdoc
     */
    async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
        const okMsg = "Sent Successfully.";

        try {
            const mattermostUserName = notification.mattermostusername || "Uptime Kuma";
            // If heartbeatJSON is null, assume non monitoring notification (Certificate warning) or testing.
            if (heartbeatJSON == null) {
                let mattermostTestData = {
                    username: mattermostUserName,
                    text: msg,
                };
                await axios.post(notification.mattermostWebhookUrl, mattermostTestData);
                return okMsg;
            }

            let mattermostChannel;

            if (typeof notification.mattermostchannel === "string") {
                mattermostChannel = notification.mattermostchannel.toLowerCase();
            }

            const mattermostIconEmoji = notification.mattermosticonemo;
            let mattermostIconEmojiOnline = "";
            let mattermostIconEmojiOffline = "";

            if (mattermostIconEmoji && typeof mattermostIconEmoji === "string") {
                const emojiArray = mattermostIconEmoji.split(" ");
                if (emojiArray.length >= 2) {
                    mattermostIconEmojiOnline = emojiArray[0];
                    mattermostIconEmojiOffline = emojiArray[1];
                }
            }
            const mattermostIconUrl = notification.mattermosticonurl;
            let iconEmoji = mattermostIconEmoji;
            let statusField = {
                short: false,
                title: "Error",
                value: heartbeatJSON.msg,
            };
            let statusText = "unknown";
            let color = "#000000";
            if (heartbeatJSON.status === DOWN) {
                iconEmoji = mattermostIconEmojiOffline || mattermostIconEmoji;
                statusField = {
                    short: false,
                    title: "Error",
                    value: heartbeatJSON.msg,
                };
                statusText = "down.";
                color = "#FF0000";
            } else if (heartbeatJSON.status === UP) {
                iconEmoji = mattermostIconEmojiOnline || mattermostIconEmoji;
                statusField = {
                    short: false,
                    title: "Ping",
                    value: heartbeatJSON.ping + "ms",
                };
                statusText = "up!";
                color = "#32CD32";
            }

            let mattermostdata = {
                username: monitorJSON.name + " " + mattermostUserName,
                channel: mattermostChannel,
                icon_emoji: iconEmoji,
                icon_url: mattermostIconUrl,
                attachments: [
                    {
                        fallback:
                            "Your " +
                            monitorJSON.pathName +
                            " service went " +
                            statusText,
                        color: color,
                        title:
                            monitorJSON.pathName +
                            " service went " +
                            statusText,
                        title_link: monitorJSON.url,
                        fields: [
                            statusField,
                            {
                                short: true,
                                title: `Time (${heartbeatJSON["timezone"]})`,
                                value: heartbeatJSON.localDateTime,
                            },
                        ],
                    },
                ],
            };
            await axios.post(notification.mattermostWebhookUrl, mattermostdata);
            return okMsg;
        } catch (error) {
            this.throwGeneralAxiosError(error);
        }

    }
}

module.exports = Mattermost;