diff options
Diffstat (limited to 'server/notification-providers/discord.js')
-rw-r--r-- | server/notification-providers/discord.js | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/server/notification-providers/discord.js b/server/notification-providers/discord.js new file mode 100644 index 0000000..6a52f8f --- /dev/null +++ b/server/notification-providers/discord.js @@ -0,0 +1,120 @@ +const NotificationProvider = require("./notification-provider"); +const axios = require("axios"); +const { DOWN, UP } = require("../../src/util"); + +class Discord extends NotificationProvider { + name = "discord"; + + /** + * @inheritdoc + */ + async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { + const okMsg = "Sent Successfully."; + + try { + const discordDisplayName = notification.discordUsername || "Uptime Kuma"; + const webhookUrl = new URL(notification.discordWebhookUrl); + if (notification.discordChannelType === "postToThread") { + webhookUrl.searchParams.append("thread_id", notification.threadId); + } + + // If heartbeatJSON is null, assume we're testing. + if (heartbeatJSON == null) { + let discordtestdata = { + username: discordDisplayName, + content: msg, + }; + + if (notification.discordChannelType === "createNewForumPost") { + discordtestdata.thread_name = notification.postName; + } + + await axios.post(webhookUrl.toString(), discordtestdata); + return okMsg; + } + + // If heartbeatJSON is not null, we go into the normal alerting loop. + if (heartbeatJSON["status"] === DOWN) { + let discorddowndata = { + username: discordDisplayName, + embeds: [{ + title: "❌ Your service " + monitorJSON["name"] + " went down. ❌", + color: 16711680, + timestamp: heartbeatJSON["time"], + fields: [ + { + name: "Service Name", + value: monitorJSON["name"], + }, + { + name: monitorJSON["type"] === "push" ? "Service Type" : "Service URL", + value: this.extractAddress(monitorJSON), + }, + { + name: `Time (${heartbeatJSON["timezone"]})`, + value: heartbeatJSON["localDateTime"], + }, + { + name: "Error", + value: heartbeatJSON["msg"] == null ? "N/A" : heartbeatJSON["msg"], + }, + ], + }], + }; + if (notification.discordChannelType === "createNewForumPost") { + discorddowndata.thread_name = notification.postName; + } + if (notification.discordPrefixMessage) { + discorddowndata.content = notification.discordPrefixMessage; + } + + await axios.post(webhookUrl.toString(), discorddowndata); + return okMsg; + + } else if (heartbeatJSON["status"] === UP) { + let discordupdata = { + username: discordDisplayName, + embeds: [{ + title: "✅ Your service " + monitorJSON["name"] + " is up! ✅", + color: 65280, + timestamp: heartbeatJSON["time"], + fields: [ + { + name: "Service Name", + value: monitorJSON["name"], + }, + { + name: monitorJSON["type"] === "push" ? "Service Type" : "Service URL", + value: this.extractAddress(monitorJSON), + }, + { + name: `Time (${heartbeatJSON["timezone"]})`, + value: heartbeatJSON["localDateTime"], + }, + { + name: "Ping", + value: heartbeatJSON["ping"] == null ? "N/A" : heartbeatJSON["ping"] + " ms", + }, + ], + }], + }; + + if (notification.discordChannelType === "createNewForumPost") { + discordupdata.thread_name = notification.postName; + } + + if (notification.discordPrefixMessage) { + discordupdata.content = notification.discordPrefixMessage; + } + + await axios.post(webhookUrl.toString(), discordupdata); + return okMsg; + } + } catch (error) { + this.throwGeneralAxiosError(error); + } + } + +} + +module.exports = Discord; |