• discord.js
  • 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);
                }
    
                // Check if the webhook has an avatar
                let webhookHasAvatar = true;
                try {
                    const webhookInfo = await axios.get(webhookUrl.toString());
                    webhookHasAvatar = !!webhookInfo.data.avatar;
                } catch (e) {
                    // If we can't verify, we assume he has an avatar to avoid forcing the default avatar
                    webhookHasAvatar = true;
                }
    
                // If heartbeatJSON is null, assume we're testing.
                if (heartbeatJSON == null) {
                    let discordtestdata = {
                        username: discordDisplayName,
                        content: msg,
                    };
                    if (!webhookHasAvatar) {
                        discordtestdata.avatar_url = "https://github.com/louislam/uptime-kuma/raw/master/public/icon.png";
                    }
                    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"],
                                },
                                ...(!notification.disableUrl ? [{
                                    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 (!webhookHasAvatar) {
                        discorddowndata.avatar_url = "https://github.com/louislam/uptime-kuma/raw/master/public/icon.png";
                    }
                    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"],
                                },
                                ...(!notification.disableUrl ? [{
                                    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 (!webhookHasAvatar) {
                        discordupdata.avatar_url = "https://github.com/louislam/uptime-kuma/raw/master/public/icon.png";
                    }
    
                    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;