diff --git a/.github/workflows/auto-test.yml b/.github/workflows/auto-test.yml index b3a7daca..d0629f7b 100644 --- a/.github/workflows/auto-test.yml +++ b/.github/workflows/auto-test.yml @@ -22,7 +22,7 @@ jobs: strategy: matrix: os: [macos-latest, ubuntu-latest, windows-latest, ARM64] - node: [ 14, 20.5 ] + node: [ 16, 20.5 ] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: @@ -33,10 +33,13 @@ jobs: uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} - - run: npm install npm@9 -g - - run: npm install - - run: npm run build - - run: npm run test-backend + + - name: Install + run: npm install + - name: Build + run: npm run build + - name: Test Backend + run: npm run test-backend env: HEADLESS_TEST: 1 JUST_FOR_TEST: ${{ secrets.JUST_FOR_TEST }} @@ -61,7 +64,6 @@ jobs: uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} - - run: npm install npm@9 -g - run: npm ci --production check-linters: diff --git a/server/notification-providers/google-chat.js b/server/notification-providers/google-chat.js index 9f1b53b7..0b72fea9 100644 --- a/server/notification-providers/google-chat.js +++ b/server/notification-providers/google-chat.js @@ -1,8 +1,7 @@ const NotificationProvider = require("./notification-provider"); const axios = require("axios"); const { setting } = require("../util-server"); -const { getMonitorRelativeURL } = require("../../src/util"); -const { DOWN, UP } = require("../../src/util"); +const { getMonitorRelativeURL, UP } = require("../../src/util"); class GoogleChat extends NotificationProvider { name = "GoogleChat"; @@ -16,26 +15,71 @@ class GoogleChat extends NotificationProvider { try { // Google Chat message formatting: https://developers.google.com/chat/api/guides/message-formats/basic - let textMsg = ""; - if (heartbeatJSON && heartbeatJSON.status === UP) { - textMsg = "✅ Application is back online\n"; - } else if (heartbeatJSON && heartbeatJSON.status === DOWN) { - textMsg = "🔴 Application went down\n"; - } + let chatHeader = { + title: "Uptime Kuma Alert", + }; - if (monitorJSON && monitorJSON.name) { - textMsg += `*${monitorJSON.name}*\n`; + if (monitorJSON && heartbeatJSON) { + chatHeader["title"] = + heartbeatJSON["status"] === UP + ? `✅ ${monitorJSON["name"]} is back online` + : `🔴 ${monitorJSON["name"]} went down`; } - textMsg += `${msg}`; + // always show msg + let sectionWidgets = [ + { + textParagraph: { + text: `Message:\n${msg}`, + }, + }, + ]; + // add time if available + if (heartbeatJSON) { + sectionWidgets.push({ + textParagraph: { + text: `Time (${heartbeatJSON["timezone"]}):\n${heartbeatJSON["localDateTime"]}`, + }, + }); + } + + // add button for monitor link if available const baseURL = await setting("primaryBaseURL"); - if (baseURL && monitorJSON) { - textMsg += `\n${baseURL + getMonitorRelativeURL(monitorJSON.id)}`; + if (baseURL) { + const urlPath = monitorJSON ? getMonitorRelativeURL(monitorJSON.id) : "/"; + sectionWidgets.push({ + buttonList: { + buttons: [ + { + text: "Visit Uptime Kuma", + onClick: { + openLink: { + url: baseURL + urlPath, + }, + }, + }, + ], + }, + }); } - const data = { - "text": textMsg, + let chatSections = [ + { + widgets: sectionWidgets, + }, + ]; + + // construct json data + let data = { + cardsV2: [ + { + card: { + header: chatHeader, + sections: chatSections, + }, + }, + ], }; await axios.post(notification.googleChatWebhookURL, data); diff --git a/server/notification-providers/home-assistant.js b/server/notification-providers/home-assistant.js index ee95ba0b..4536b2a4 100644 --- a/server/notification-providers/home-assistant.js +++ b/server/notification-providers/home-assistant.js @@ -23,6 +23,8 @@ class HomeAssistant extends NotificationProvider { ...(notificationService !== "persistent_notification" && { data: { name: monitorJSON?.name, status: heartbeatJSON?.status, + channel: "Uptime Kuma", + icon_url: "https://github.com/louislam/uptime-kuma/blob/master/public/icon.png?raw=true", } }), }, { diff --git a/server/server.js b/server/server.js index 45732471..753f88b8 100644 --- a/server/server.js +++ b/server/server.js @@ -1619,15 +1619,15 @@ async function afterLogin(socket, user) { socket.join(user.id); let monitorList = await server.sendMonitorList(socket); - await sendInfo(socket); - await server.sendMaintenanceList(socket); - await sendNotificationList(socket); - await sendProxyList(socket); - await sendDockerHostList(socket); - await sendAPIKeyList(socket); - await sendRemoteBrowserList(socket); - - await sleep(500); + await Promise.allSettled([ + sendInfo(socket), + server.sendMaintenanceList(socket), + sendNotificationList(socket), + sendProxyList(socket), + sendDockerHostList(socket), + sendAPIKeyList(socket), + sendRemoteBrowserList(socket), + ]); await StatusPage.sendStatusPageList(io, socket);