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);