uptime-kuma/server/notification.js

192 lines
6.3 KiB
JavaScript
Raw Normal View History

2021-07-27 17:47:13 +00:00
const { R } = require("redbean-node");
2021-09-07 14:42:46 +00:00
const Apprise = require("./notification-providers/apprise");
const Discord = require("./notification-providers/discord");
const Gotify = require("./notification-providers/gotify");
const Line = require("./notification-providers/line");
const LunaSea = require("./notification-providers/lunasea");
const Mattermost = require("./notification-providers/mattermost");
2021-10-05 18:03:56 +00:00
const Matrix = require("./notification-providers/matrix");
2021-09-07 14:42:46 +00:00
const Octopush = require("./notification-providers/octopush");
const PromoSMS = require("./notification-providers/promosms");
const ClickSendSMS = require("./notification-providers/clicksendsms");
2021-09-07 14:42:46 +00:00
const Pushbullet = require("./notification-providers/pushbullet");
const Pushover = require("./notification-providers/pushover");
const Pushy = require("./notification-providers/pushy");
2022-01-21 07:42:03 +00:00
const TechulusPush = require("./notification-providers/techulus-push");
2021-09-07 14:42:46 +00:00
const RocketChat = require("./notification-providers/rocket-chat");
const Signal = require("./notification-providers/signal");
const Slack = require("./notification-providers/slack");
const SMTP = require("./notification-providers/smtp");
const Teams = require("./notification-providers/teams");
2021-09-07 14:42:46 +00:00
const Telegram = require("./notification-providers/telegram");
const Webhook = require("./notification-providers/webhook");
2021-10-11 09:20:09 +00:00
const Feishu = require("./notification-providers/feishu");
2021-10-13 03:55:01 +00:00
const AliyunSms = require("./notification-providers/aliyun-sms");
2021-10-13 08:13:46 +00:00
const DingDing = require("./notification-providers/dingding");
const Bark = require("./notification-providers/bark");
const { log } = require("../src/util");
const SerwerSMS = require("./notification-providers/serwersms");
const Stackfield = require("./notification-providers/stackfield");
2021-12-25 17:33:47 +00:00
const WeCom = require("./notification-providers/wecom");
const GoogleChat = require("./notification-providers/google-chat");
2022-01-09 17:05:11 +00:00
const Gorush = require("./notification-providers/gorush");
2022-01-26 14:54:17 +00:00
const Alerta = require("./notification-providers/alerta");
2022-04-14 02:43:59 +00:00
const OneBot = require("./notification-providers/onebot");
2022-04-14 06:29:54 +00:00
const PushDeer = require("./notification-providers/pushdeer");
2021-07-09 06:14:03 +00:00
class Notification {
2021-07-18 10:51:58 +00:00
2021-09-07 14:42:46 +00:00
providerList = {};
static init() {
log.info("notification", "Prepare Notification Providers");
2021-09-07 14:42:46 +00:00
this.providerList = {};
const list = [
new Apprise(),
2021-10-13 03:55:01 +00:00
new AliyunSms(),
2021-10-13 08:13:46 +00:00
new DingDing(),
2021-09-07 14:42:46 +00:00
new Discord(),
new Teams(),
2021-09-07 14:42:46 +00:00
new Gotify(),
new Line(),
new LunaSea(),
2021-10-11 09:20:09 +00:00
new Feishu(),
2021-09-07 14:42:46 +00:00
new Mattermost(),
2021-10-05 18:03:56 +00:00
new Matrix(),
2021-09-07 14:42:46 +00:00
new Octopush(),
new PromoSMS(),
new ClickSendSMS(),
2021-09-07 14:42:46 +00:00
new Pushbullet(),
new Pushover(),
new Pushy(),
2022-01-21 07:42:03 +00:00
new TechulusPush(),
2021-09-07 14:42:46 +00:00
new RocketChat(),
new Signal(),
new Slack(),
new SMTP(),
new Telegram(),
new Webhook(),
new Bark(),
new SerwerSMS(),
new Stackfield(),
2021-12-25 17:33:47 +00:00
new WeCom(),
2022-01-26 14:54:17 +00:00
new GoogleChat(),
new Gorush(),
2022-01-26 14:54:17 +00:00
new Alerta(),
2022-04-14 02:43:59 +00:00
new OneBot(),
2022-04-14 06:29:54 +00:00
new PushDeer(),
2021-09-07 14:42:46 +00:00
];
for (let item of list) {
if (! item.name) {
throw new Error("Notification provider without name");
}
if (this.providerList[item.name]) {
throw new Error("Duplicate notification provider name");
}
this.providerList[item.name] = item;
}
}
2021-07-18 12:49:46 +00:00
/**
*
2021-09-07 14:42:46 +00:00
* @param notification : BeanModel
* @param msg : string General Message
* @param monitorJSON : object Monitor details (For Up/Down only)
* @param heartbeatJSON : object Heartbeat details (For Up/Down only)
2021-07-18 12:49:46 +00:00
* @returns {Promise<string>} Successful msg
* Throw Error with fail msg
*/
2021-07-09 11:33:22 +00:00
static async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
2021-09-07 14:42:46 +00:00
if (this.providerList[notification.type]) {
return this.providerList[notification.type].send(notification, msg, monitorJSON, heartbeatJSON);
2021-07-09 06:14:03 +00:00
} else {
2021-09-07 14:42:46 +00:00
throw new Error("Notification type is not supported");
2021-07-09 06:14:03 +00:00
}
}
static async save(notification, notificationID, userID) {
2022-04-13 16:30:32 +00:00
let bean;
2021-07-09 06:14:03 +00:00
if (notificationID) {
bean = await R.findOne("notification", " id = ? AND user_id = ? ", [
notificationID,
userID,
2022-04-13 16:30:32 +00:00
]);
2021-07-09 06:14:03 +00:00
if (! bean) {
2022-04-13 16:30:32 +00:00
throw new Error("notification not found");
2021-07-09 06:14:03 +00:00
}
} else {
2022-04-13 16:30:32 +00:00
bean = R.dispense("notification");
2021-07-09 06:14:03 +00:00
}
bean.name = notification.name;
bean.user_id = userID;
bean.config = JSON.stringify(notification);
2021-09-09 12:22:32 +00:00
bean.is_default = notification.isDefault || false;
2022-04-13 16:30:32 +00:00
await R.store(bean);
if (notification.applyExisting) {
await applyNotificationEveryMonitor(bean.id, userID);
}
return bean;
2021-07-09 06:14:03 +00:00
}
static async delete(notificationID, userID) {
let bean = await R.findOne("notification", " id = ? AND user_id = ? ", [
notificationID,
userID,
2022-04-13 16:30:32 +00:00
]);
2021-07-09 06:14:03 +00:00
if (! bean) {
2022-04-13 16:30:32 +00:00
throw new Error("notification not found");
2021-07-09 06:14:03 +00:00
}
2022-04-13 16:30:32 +00:00
await R.trash(bean);
2021-07-09 06:14:03 +00:00
}
2021-07-09 17:08:08 +00:00
2021-07-18 10:51:58 +00:00
static checkApprise() {
2021-07-27 17:47:13 +00:00
let commandExistsSync = require("command-exists").sync;
let exists = commandExistsSync("apprise");
2021-07-18 10:51:58 +00:00
return exists;
2021-07-10 03:38:00 +00:00
}
2021-07-18 12:49:46 +00:00
}
2021-07-10 03:38:00 +00:00
2021-11-10 05:24:31 +00:00
/**
* Adds a new monitor to the database.
* @param {number} userID The ID of the user that owns this monitor.
* @param {string} name The name of this monitor.
*
* Generated by Trelent
*/
async function applyNotificationEveryMonitor(notificationID, userID) {
let monitors = await R.getAll("SELECT id FROM monitor WHERE user_id = ?", [
userID
]);
for (let i = 0; i < monitors.length; i++) {
let checkNotification = await R.findOne("monitor_notification", " monitor_id = ? AND notification_id = ? ", [
monitors[i].id,
notificationID,
2022-04-13 16:30:32 +00:00
]);
if (! checkNotification) {
let relation = R.dispense("monitor_notification");
relation.monitor_id = monitors[i].id;
relation.notification_id = notificationID;
2022-04-13 16:30:32 +00:00
await R.store(relation);
}
}
}
2021-07-09 06:14:03 +00:00
module.exports = {
Notification,
2022-04-13 16:30:32 +00:00
};