- matrix-receive node updated so that msg.sender is msg.userId instead (for better node chaining).

- change all references from msg.roomId to msg.topic to conform to Node-RED standards.
- Added node for listing Synapse users server-wide (as long as the caller is an admin)
- Events for Room.timeline are now handled by the server-config node and node's that listen for it bind a listener to that instead of the matrix client.
- Added kick and ban nodes for kicking/banning from a room
- Added node for fetching synapse user list using synapse admin API
- Added node for fetching whois data from a user using Matrix admin API
- Added node for deactivating users using the Synapse admin API
- Can register users using the Synapse admin endpoint v1 (yay legacy)
- Can add users using the Synapse admin endpoint v2
- Add more info to the readme.
This commit is contained in:
2021-08-18 11:18:29 -06:00
parent cd99955115
commit b33595d5eb
31 changed files with 1874 additions and 109 deletions
+62 -63
View File
@@ -26,79 +26,78 @@ module.exports = function(RED) {
node.server.on("connected", function() {
node.status({ fill: "green", shape: "ring", text: "connected" });
});
node.server.matrixClient.on("Room.timeline", function(event, room, toStartOfTimeline, data) {
if (toStartOfTimeline) {
return; // ignore paginated results
}
if (
event.getType() !== "m.room.message"
&& event.getType() !== "m.reaction"
) {
return; // only keep messages
}
if (!event.getSender() || event.getSender() === node.server.userId) {
return; // ignore our own messages
}
if (!event.getUnsigned() || event.getUnsigned().age > 1000) {
return; // ignore old messages
}
node.server.on("Room.timeline", function(event, room, toStartOfTimeline, data) {
if (toStartOfTimeline) {
return; // ignore paginated results
}
if (
event.getType() !== "m.room.message"
&& event.getType() !== "m.reaction"
) {
return; // only keep messages
}
if (!event.getSender() || event.getSender() === node.server.userId) {
return; // ignore our own messages
}
if (!event.getUnsigned() || event.getUnsigned().age > 1000) {
return; // ignore old messages
}
// if node has a room ID set we only listen on that room
if(node.roomIds.length && node.roomIds.indexOf(room.roomId) === -1) {
console.log("SKIASDJIOJSADIJASD", node.roomIds);
return;
}
// if node has a room ID set we only listen on that room
if(node.roomIds.length && node.roomIds.indexOf(room.roomId) === -1) {
return;
}
let msg = {
content: event.getContent(),
type : (event.getContent().msgtype || event.getType()) || null,
payload : event.getContent().body || null,
sender : event.getSender(),
roomId : room.roomId,
eventId : event.getId(),
event : event,
};
node.log("Received timeline event [" + ((event.getContent().msgtype || event.getType()) || null) + "]: (" + room.name + ") " + event.getSender() + " :: " + event.getContent().body);
node.log("Received chat message [" + msg.type + "]: (" + room.name + ") " + event.getSender() + " :: " + msg.content.body);
let msg = {
content: event.getContent(),
type : (event.getContent().msgtype || event.getType()) || null,
payload : event.getContent().body || null,
userId : event.getSender(),
topic : room.roomId,
eventId : event.getId(),
event : event,
};
let knownMessageType = true;
switch(msg.type) {
case 'm.text':
if(node.ignoreText) return;
break;
let knownMessageType = true;
switch(msg.type) {
case 'm.text':
if(node.ignoreText) return;
break;
case 'm.reaction':
if(node.ignoreReactions) return;
msg.info = msg.content["m.relates_to"].info;
msg.referenceEventId = msg.content["m.relates_to"].event_id;
msg.payload = msg.content["m.relates_to"].key;
break;
case 'm.reaction':
if(node.ignoreReactions) return;
msg.info = msg.content["m.relates_to"].info;
msg.referenceEventId = msg.content["m.relates_to"].event_id;
msg.payload = msg.content["m.relates_to"].key;
break;
case 'm.file':
if(node.ignoreFiles) return;
msg.url = node.server.matrixClient.mxcUrlToHttp(msg.content.url);
msg.mxc_url = msg.content.url;
break;
case 'm.file':
if(node.ignoreFiles) return;
msg.url = node.server.matrixClient.mxcUrlToHttp(msg.content.url);
msg.mxc_url = msg.content.url;
break;
case 'm.image':
if(node.ignoreImages) return;
msg.url = node.server.matrixClient.mxcUrlToHttp(msg.content.url);
msg.mxc_url = msg.content.url;
msg.thumbnail_url = node.server.matrixClient.mxcUrlToHttp(msg.content.info.thumbnail_url);
msg.thumbnail_mxc_url = msg.content.info.thumbnail_url;
break;
case 'm.image':
if(node.ignoreImages) return;
msg.url = node.server.matrixClient.mxcUrlToHttp(msg.content.url);
msg.mxc_url = msg.content.url;
msg.thumbnail_url = node.server.matrixClient.mxcUrlToHttp(msg.content.info.thumbnail_url);
msg.thumbnail_mxc_url = msg.content.info.thumbnail_url;
break;
default:
knownMessageType = false;
}
default:
knownMessageType = false;
}
if(knownMessageType) {
node.send(msg);
} else {
node.warn("Uknown message type: " + msg.type);
}
});
if(knownMessageType) {
node.send(msg);
} else {
node.warn("Uknown message type: " + msg.type);
}
});
}
RED.nodes.registerType("matrix-receive", MatrixReceiveMessage);