From c833a40a84721c816aaf8c213b18e642f39a141f Mon Sep 17 00:00:00 2001 From: Skylar Sadlier Date: Sun, 15 Oct 2023 04:17:12 -0600 Subject: [PATCH] Issue #97 Room Settings - Can set room name, topic, and avatar - Can get name, topic, avatar, encrypted, power_levels, aliases, guest_access, join_rule, and join_allow_rules --- package.json | 5 +- src/matrix-room-settings.html | 115 +++++++++++++++++++++++++++++++++ src/matrix-room-settings.js | 116 ++++++++++++++++++++++++++++++++++ 3 files changed, 234 insertions(+), 2 deletions(-) create mode 100644 src/matrix-room-settings.html create mode 100644 src/matrix-room-settings.js diff --git a/package.json b/package.json index 6aeb583..d997df7 100644 --- a/package.json +++ b/package.json @@ -32,13 +32,14 @@ "matrix-crypt-file": "src/matrix-crypt-file.js", "matrix-room-kick": "src/matrix-room-kick.js", "matrix-room-ban": "src/matrix-room-ban.js", + "matrix-room-users": "src/matrix-room-users.js", + "matrix-room-settings": "src/matrix-room-settings.js", "matrix-synapse-users": "src/matrix-synapse-users.js", "matrix-synapse-register": "src/matrix-synapse-register.js", "matrix-synapse-create-edit-user": "src/matrix-synapse-create-edit-user.js", "matrix-synapse-deactivate-user": "src/matrix-synapse-deactivate-user.js", "matrix-synapse-join-room": "src/matrix-synapse-join-room.js", - "matrix-whois-user": "src/matrix-whois-user.js", - "matrix-room-users": "src/matrix-room-users.js" + "matrix-whois-user": "src/matrix-whois-user.js" } }, "engines": { diff --git a/src/matrix-room-settings.html b/src/matrix-room-settings.html new file mode 100644 index 0000000..02e0d89 --- /dev/null +++ b/src/matrix-room-settings.html @@ -0,0 +1,115 @@ + + + + + + \ No newline at end of file diff --git a/src/matrix-room-settings.js b/src/matrix-room-settings.js new file mode 100644 index 0000000..153dc97 --- /dev/null +++ b/src/matrix-room-settings.js @@ -0,0 +1,116 @@ +module.exports = function(RED) { + function MatrixRoomSettings(n) { + RED.nodes.createNode(this, n); + + var node = this; + + this.name = n.name; + this.server = RED.nodes.getNode(n.server); + this.roomId = n.roomId; + this.returnValues = n.returnValues; + + if (!node.server) { + node.warn("No configuration node"); + return; + } + node.server.register(node); + + node.status({ fill: "red", shape: "ring", text: "disconnected" }); + + node.server.on("disconnected", function(){ + node.status({ fill: "red", shape: "ring", text: "disconnected" }); + }); + + node.server.on("connected", function() { + node.status({ fill: "green", shape: "ring", text: "connected" }); + }); + + node.on("input", async function (msg) { + if (! node.server || ! node.server.matrixClient) { + msg.error = "No matrix server selected"; + node.error(msg.error, msg); + node.send([null, msg]); + return; + } + + if(!node.server.isConnected()) { + msg.error = "Matrix server connection is currently closed"; + node.error(msg.error, msg); + node.send([null, msg]); + return; + } + + msg.topic = node.roomId || msg.topic; + if(!msg.topic) { + msg.error = "Room must be specified in msg.topic or in configuration"; + node.error(msg.error, msg); + node.send([null, msg]); + return; + } + + let errors = {}, + payload = {}; + + if(msg.payload?.name) { + try { + await node.server.matrixClient.setRoomName(msg.topic, msg.payload.name); + } catch(e) { + node.error("Set room name failed: " + e.message, msg); + errors.name = e.message; + } + } + + if(msg.payload?.topic) { + try { + await node.server.matrixClient.setRoomTopic(msg.topic, msg.payload.topic); + } catch(e) { + node.error("Set room topic failed: " + e.message, msg); + errors.topic = e.message; + } + } + + if(msg.payload?.avatar) { + try { + await node.server.matrixClient.sendStateEvent( + msg.topic, + "m.room.avatar", + { + "info": msg.payload?.avatar_info || undefined, + "url": msg.payload.avatar + }, + ""); + } catch(e) { + node.error("Set room avatar failed: " + e.message, msg); + errors.topic = e.message; + } + } + + if(Object.keys(errors).length) { + msg.errors = errors; + } + + if(node.returnValues) { + // return current settings + let join_rules = await node.server.matrixClient.getStateEvent(msg.topic, "m.room.join_rules", ""); + msg.payload = { + "name": (await node.server.matrixClient.getStateEvent(msg.topic, "m.room.name", ""))?.name, + "topic": (await node.server.matrixClient.getStateEvent(msg.topic, "m.room.topic", ""))?.topic, + "avatar": (await node.server.matrixClient.getStateEvent(msg.topic, "m.room.avatar", ""))?.url, + "encrypted": node.server.matrixClient.isRoomEncrypted(msg.topic), + "power_levels": await node.server.matrixClient.getStateEvent(msg.topic, "m.room.power_levels", ""), + "aliases": (await node.server.matrixClient.getLocalAliases(msg.topic))?.aliases, + "guest_access": (await node.server.matrixClient.getStateEvent(msg.topic, "m.room.guest_access", ""))?.guest_access, + "join_rule": join_rules?.join_rule, + "join_allow_rules": join_rules?.allow_rules + }; + } + + node.send([msg, null]); + }); + + node.on("close", function() { + node.server.deregister(node); + }); + } + RED.nodes.registerType("matrix-room-settings", MatrixRoomSettings); +} \ No newline at end of file