diff --git a/package.json b/package.json index c27d142..7fb7a37 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,8 @@ "matrix-synapse-join-room": "src/matrix-synapse-join-room.js", "matrix-whois-user": "src/matrix-whois-user.js", "matrix-typing": "src/matrix-typing.js", - "matrix-user-settings": "src/matrix-user-settings.js" + "matrix-user-settings": "src/matrix-user-settings.js", + "matrix-get-user": "src/matrix-get-user.js" } }, "engines": { diff --git a/src/matrix-get-user.html b/src/matrix-get-user.html new file mode 100644 index 0000000..705a50a --- /dev/null +++ b/src/matrix-get-user.html @@ -0,0 +1,352 @@ + + + + + \ No newline at end of file diff --git a/src/matrix-get-user.js b/src/matrix-get-user.js new file mode 100644 index 0000000..9afa8fc --- /dev/null +++ b/src/matrix-get-user.js @@ -0,0 +1,145 @@ +module.exports = function(RED) { + function MatrixGetUser(n) { + RED.nodes.createNode(this, n); + + var node = this; + + this.name = n.name; + this.server = RED.nodes.getNode(n.server); + this.userType = n.userType || "msg"; + this.userValue = n.userValue || "userId"; + this.propertyType = n.propertyType || "msg"; + this.propertyValue = n.propertyValue || "user"; + + 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) { + + function getToValue(msg, type, property) { + let value = property; + if (type === "msg") { + value = RED.util.getMessageProperty(msg, property); + } else if ((type === 'flow') || (type === 'global')) { + try { + value = RED.util.evaluateNodeProperty(property, type, node, msg); + } catch(e2) { + throw new Error("Invalid value evaluation"); + } + } else if(type === "bool") { + value = (property === 'true'); + } else if(type === "num") { + value = Number(property); + } + return value; + } + + function setToValue(value, type, property) { + if(type === 'global' || type === 'flow') { + var contextKey = RED.util.parseContextStore(property); + if (/\[msg/.test(contextKey.key)) { + // The key has a nest msg. reference to evaluate first + contextKey.key = RED.util.normalisePropertyExpression(contextKey.key, msg, true) + } + var target = node.context()[type]; + var callback = err => { + if (err) { + node.error(err, msg); + getterErrors[rule.p] = err.message; + } + } + target.set(contextKey.key, value, contextKey.store, callback); + } else if(type === 'msg') { + if (!RED.util.setMessageProperty(msg, property, value)) { + node.warn(RED._("change.errors.no-override",{property:property})); + } + } + } + + 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; + } + + let userId = getToValue(msg, node.userType, node.userValue); + if(!userId) { + msg.error = "Missing userId"; + node.error(msg.error, msg); + node.send([null, msg]); + return; + } + + let user = null; + try { + user = node.server.matrixClient.getUser(userId); + } catch(e) { + msg.error = "Failed getting user: " + e.message; + node.error(msg.error, msg); + node.send([null, msg]); + return; + } + + if(!user) { + // failed to fetch from local storage, try to fetch data from server + let user2 = {}; + + try { + let profileInfo = node.server.matrixClient.getProfileInfo(userId); + if(Object.keys(profileInfo).length > 0) { + user2.displayName = profileInfo.displayname; + user2.avatarUrl = profileInfo.avatar_url; + } + + let presence = node.server.matrixClient.getPresence(userId); + if(Object.keys(presence).length > 0) { + user2.currentlyActive = presence.currently_active; + user2.lastActiveAgo = presence.last_active_ago; + user2.presenceStatusMsg = presence.presence_status_msg; + user2.presence = presence.presence; + } + + if(Object.keys(user2).length > 0) { + setToValue(user2, node.propertyType, node.propertyValue); + node.send([msg, null]); + return; + } + } catch(e) { + msg.error = "Failed getting user: " + e.message; + node.error(msg.error, msg); + node.send([null, msg]); + return; + } + } + + setToValue(user, node.propertyType, node.propertyValue); + node.send([msg, null]); + }); + + node.on("close", function() { + node.server.deregister(node); + }); + } + RED.nodes.registerType("matrix-get-user", MatrixGetUser); +} \ No newline at end of file diff --git a/src/matrix-room-state-events.html b/src/matrix-room-state-events.html index 1789769..35e558f 100644 --- a/src/matrix-room-state-events.html +++ b/src/matrix-room-state-events.html @@ -130,7 +130,6 @@ name: { value: null }, server: { type: "matrix-server-config" }, roomId: { value: null }, - reason: { value: null }, rules: { value: defaultRules, validate: function(rules, opt) { diff --git a/src/matrix-typing.html b/src/matrix-typing.html index cd6cf74..3087752 100644 --- a/src/matrix-typing.html +++ b/src/matrix-typing.html @@ -23,7 +23,9 @@ $("#node-input-room").typedInput({ type: this.roomType, types:['msg','flow','global','str'], - }).typedInput('value', this.roomValue); + }) + .typedInput('value', this.roomValue) + .typedInput('type', this.roomType); $("#node-input-typing").typedInput({ types:['msg','flow','global','bool'], @@ -66,12 +68,12 @@