mirror of
https://github.com/Skylar-Tech/node-red-contrib-matrix-chat.git
synced 2026-05-20 14:13:34 -06:00
Initial commit of an alpha version.
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
module.exports = function(RED) {
|
||||
function MatrixReceiveMessage(n) {
|
||||
RED.nodes.createNode(this, n);
|
||||
|
||||
let node = this;
|
||||
|
||||
this.name = n.name;
|
||||
this.server = RED.nodes.getNode(n.server);
|
||||
this.ignoreText = n.ignoreText;
|
||||
this.ignoreReactions = n.ignoreReactions;
|
||||
this.ignoreFiles = n.ignoreFiles;
|
||||
this.ignoreImages = n.ignoreImages;
|
||||
|
||||
node.status({ fill: "red", shape: "ring", text: "disconnected" });
|
||||
|
||||
if (!node.server) {
|
||||
node.error("No configuration node");
|
||||
return;
|
||||
}
|
||||
|
||||
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.server.matrixClient.on("Room.timeline", function(event, room, toStartOfTimeline, data) {
|
||||
console.log("Room.timeline", [event, room]);
|
||||
if (toStartOfTimeline) {
|
||||
console.log("MESSAGED SKIPPED: toStartOfTimeline");
|
||||
return; // ignore paginated results
|
||||
}
|
||||
if (
|
||||
event.getType() !== "m.room.message"
|
||||
&& event.getType() !== "m.reaction"
|
||||
) {
|
||||
console.log("MESSAGED SKIPPED: TYPE");
|
||||
return; // only keep messages
|
||||
}
|
||||
if (!event.getSender() || event.getSender() === node.server.userId) {
|
||||
console.log("MESSAGED SKIPPED: SENDER");
|
||||
return; // ignore our own messages
|
||||
}
|
||||
if (!event.getUnsigned() || event.getUnsigned().age > 1000) {
|
||||
console.log("MESSAGED SKIPPED: UNSIGNED");
|
||||
return; // ignore old messages
|
||||
}
|
||||
|
||||
// if node has a room ID set we only listen on that room
|
||||
if(node.roomId) {
|
||||
let roomIds = node.roomId.split(',');
|
||||
|
||||
if(roomIds.indexOf(msg.roomId) === -1) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
let content = event.getContent(),
|
||||
msg = {};
|
||||
|
||||
msg.type = (content.msgtype || event.getType()) || null;
|
||||
msg.payload = event.getContent().body;
|
||||
msg.sender = event.getSender();
|
||||
msg.roomId = room.roomId;
|
||||
msg.eventId = event.getId();
|
||||
msg.event = event;
|
||||
|
||||
node.log("Received chat message [" + msg.type + "]: (" + room.name + ") " + event.getSender() + " :: " + event.getContent().body);
|
||||
|
||||
switch(msg.type) {
|
||||
case 'm.text':
|
||||
if(node.ignoreText) return;
|
||||
break;
|
||||
|
||||
case 'm.reaction':
|
||||
if(node.ignoreReactions) return;
|
||||
msg.info = event.getContent()["m.relates_to"].info;
|
||||
msg.eventId = event.getContent()["m.relates_to"].event_id;
|
||||
msg.payload = event.getContent()["m.relates_to"].key;
|
||||
break;
|
||||
|
||||
case 'm.file':
|
||||
if(node.ignoreFiles) return;
|
||||
msg.file = {
|
||||
info: event.getContent().info,
|
||||
url: node.server.matrixClient.mxcUrlToHttp(event.getContent().url)
|
||||
};
|
||||
break;
|
||||
|
||||
case 'm.image':
|
||||
if(node.ignoreImages) return;
|
||||
msg.image = {
|
||||
info: event.getContent().info,
|
||||
url: node.server.matrixClient.mxcUrlToHttp(event.getContent().url),
|
||||
thumbnail_url: node.server.matrixClient.mxcUrlToHttp(event.getContent().info.thumbnail_url)
|
||||
};
|
||||
break;
|
||||
}
|
||||
|
||||
node.send(msg);
|
||||
});
|
||||
});
|
||||
}
|
||||
RED.nodes.registerType("matrix-receive", MatrixReceiveMessage);
|
||||
}
|
||||
Reference in New Issue
Block a user