mirror of
				https://github.com/louislam/uptime-kuma.git
				synced 2025-11-04 13:46:13 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			95 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const NotificationProvider = require("./notification-provider");
 | 
						|
const axios = require("axios");
 | 
						|
const { setting } = require("../util-server");
 | 
						|
const { getMonitorRelativeURL, UP } = require("../../src/util");
 | 
						|
 | 
						|
class GoogleChat extends NotificationProvider {
 | 
						|
    name = "GoogleChat";
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritdoc
 | 
						|
     */
 | 
						|
    async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
 | 
						|
        const okMsg = "Sent Successfully.";
 | 
						|
 | 
						|
        try {
 | 
						|
            // Google Chat message formatting: https://developers.google.com/chat/api/guides/message-formats/basic
 | 
						|
 | 
						|
            let chatHeader = {
 | 
						|
                title: "Uptime Kuma Alert",
 | 
						|
            };
 | 
						|
 | 
						|
            if (monitorJSON && heartbeatJSON) {
 | 
						|
                chatHeader["title"] =
 | 
						|
                    heartbeatJSON["status"] === UP
 | 
						|
                        ? `✅ ${monitorJSON["name"]} is back online`
 | 
						|
                        : `🔴 ${monitorJSON["name"]} went down`;
 | 
						|
            }
 | 
						|
 | 
						|
            // always show msg
 | 
						|
            let sectionWidgets = [
 | 
						|
                {
 | 
						|
                    textParagraph: {
 | 
						|
                        text: `<b>Message:</b>\n${msg}`,
 | 
						|
                    },
 | 
						|
                },
 | 
						|
            ];
 | 
						|
 | 
						|
            // add time if available
 | 
						|
            if (heartbeatJSON) {
 | 
						|
                sectionWidgets.push({
 | 
						|
                    textParagraph: {
 | 
						|
                        text: `<b>Time (${heartbeatJSON["timezone"]}):</b>\n${heartbeatJSON["localDateTime"]}`,
 | 
						|
                    },
 | 
						|
                });
 | 
						|
            }
 | 
						|
 | 
						|
            // add button for monitor link if available
 | 
						|
            const baseURL = await setting("primaryBaseURL");
 | 
						|
            if (baseURL) {
 | 
						|
                const urlPath = monitorJSON ? getMonitorRelativeURL(monitorJSON.id) : "/";
 | 
						|
                sectionWidgets.push({
 | 
						|
                    buttonList: {
 | 
						|
                        buttons: [
 | 
						|
                            {
 | 
						|
                                text: "Visit Uptime Kuma",
 | 
						|
                                onClick: {
 | 
						|
                                    openLink: {
 | 
						|
                                        url: baseURL + urlPath,
 | 
						|
                                    },
 | 
						|
                                },
 | 
						|
                            },
 | 
						|
                        ],
 | 
						|
                    },
 | 
						|
                });
 | 
						|
            }
 | 
						|
 | 
						|
            let chatSections = [
 | 
						|
                {
 | 
						|
                    widgets: sectionWidgets,
 | 
						|
                },
 | 
						|
            ];
 | 
						|
 | 
						|
            // construct json data
 | 
						|
            let data = {
 | 
						|
                cardsV2: [
 | 
						|
                    {
 | 
						|
                        card: {
 | 
						|
                            header: chatHeader,
 | 
						|
                            sections: chatSections,
 | 
						|
                        },
 | 
						|
                    },
 | 
						|
                ],
 | 
						|
            };
 | 
						|
 | 
						|
            await axios.post(notification.googleChatWebhookURL, data);
 | 
						|
            return okMsg;
 | 
						|
        } catch (error) {
 | 
						|
            this.throwGeneralAxiosError(error);
 | 
						|
        }
 | 
						|
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
module.exports = GoogleChat;
 |