const { UP, DOWN } = require("../../src/util"); const Crypto = require("crypto"); const NotificationProvider = require("./notification-provider"); const axios = require("axios"); class NextcloudTalk extends NotificationProvider { name = "nextcloudtalk"; /** * @inheritdoc */ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { // See documentation at https://nextcloud-talk.readthedocs.io/en/latest/bots/#sending-a-chat-message const okMsg = "Sent Successfully."; // Create a random string const talkRandom = encodeURIComponent(Crypto.randomBytes(64).toString("hex").slice(0, 64)); // Create the signature over random and message const talkSignature = Crypto.createHmac("sha256", Buffer.from(notification.botSecret, "utf8")) .update(Buffer.from(`${talkRandom}${msg}`, "utf8")) .digest("hex"); let silentUp = heartbeatJSON?.status === UP && notification.sendSilentUp; let silentDown = heartbeatJSON?.status === DOWN && notification.sendSilentDown; let silent = silentUp || silentDown; let url = `${notification.host}/ocs/v2.php/apps/spreed/api/v1/bot/${notification.conversationToken}/message`; let config = this.getAxiosConfigWithProxy({}); const data = { message: msg, silent, }; const options = { ...config, headers: { "X-Nextcloud-Talk-Bot-Random": talkRandom, "X-Nextcloud-Talk-Bot-Signature": talkSignature, "OCS-APIRequest": true, }, }; try { let result = await axios.post(url, data, options); if (result?.status === 201) { return okMsg; } throw new Error("Nextcloud Talk Error " + (result?.status ?? "Unknown")); } catch (error) { this.throwGeneralAxiosError(error); } } } module.exports = NextcloudTalk;