You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
4.0 KiB
111 lines
4.0 KiB
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;
|