UNPKG

node-red-contrib-slack-socketmode

Version:

Real-time integration between Slack and Node-RED using Bolt with Socket Mode.

72 lines (58 loc) 2.12 kB
module.exports = function (RED) { const { App } = require("@slack/bolt"); const WebSocket = require("ws"); function SlackSocketNode(config) { RED.nodes.createNode(this, config); const node = this; const botToken = config.token; const appToken = config.appToken; if (!botToken || !appToken) { node.error("Slack tokens are missing."); return; } // Slack Bolt (Socket Mode) const app = new App({ token: botToken, appToken: appToken, socketMode: true }); // WebSocket interno Node-RED ⇆ Slack const wss = new WebSocket.Server({ noServer: true }); // Para emitir eventos hacia Node-RED function sendToNodeRED(payload) { const msg = { payload }; node.send(msg); } // Eventos desde Slack hacia Node-RED app.event("message", async ({ event }) => { sendToNodeRED({ type: "message", user: event.user, text: event.text, channel: event.channel }); }); // Iniciar Bolt app.start().then(() => { node.status({ fill: "green", shape: "dot", text: "Conectado a Slack" }); }).catch(err => { node.error("Error starting Slack: " + err); }); // Mensajes desde Node-RED hacia Slack node.on("input", async (msg) => { try { await app.client.chat.postMessage({ channel: msg.payload.channel, text: msg.payload.text }); node.status({ fill: "blue", shape: "dot", text: "Message sent" }); } catch (e) { node.error("Error sending message to Slack: " + e); } }); node.on("close", () => { try { app.stop(); } catch (e) {} }); } RED.nodes.registerType("slack-socket", SlackSocketNode); };