• mattermost.js
  • 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;