mirror of
				https://github.com/louislam/uptime-kuma.git
				synced 2025-11-04 13:46:13 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			111 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const NotificationProvider = require("./notification-provider");
 | 
						|
const axios = require("axios");
 | 
						|
const { DOWN, UP } = require("../../src/util");
 | 
						|
 | 
						|
class Mattermost extends NotificationProvider {
 | 
						|
 | 
						|
    name = "mattermost";
 | 
						|
 | 
						|
    async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
 | 
						|
        let 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.name +
 | 
						|
                            " service went " +
 | 
						|
                            statusText,
 | 
						|
                        color: color,
 | 
						|
                        title:
 | 
						|
                            monitorJSON.name +
 | 
						|
                            " service went " +
 | 
						|
                            statusText,
 | 
						|
                        title_link: monitorJSON.url,
 | 
						|
                        fields: [
 | 
						|
                            statusField,
 | 
						|
                            {
 | 
						|
                                short: true,
 | 
						|
                                title: "Time (UTC)",
 | 
						|
                                value: heartbeatJSON.time,
 | 
						|
                            },
 | 
						|
                        ],
 | 
						|
                    },
 | 
						|
                ],
 | 
						|
            };
 | 
						|
            await axios.post(
 | 
						|
                notification.mattermostWebhookUrl,
 | 
						|
                mattermostdata
 | 
						|
            );
 | 
						|
            return okMsg;
 | 
						|
        } catch (error) {
 | 
						|
            this.throwGeneralAxiosError(error);
 | 
						|
        }
 | 
						|
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
module.exports = Mattermost;
 |