commit
4c17a21008
@ -1,5 +1,5 @@
|
|||||||
# node-red-contrib-matrix-chat
|
# node-red-contrib-matrix-chat
|
||||||
Matrix chat server client for [Node-RED](https://nodered.org/)
|
[Matrix](https://matrix.org/) chat server client for [Node-RED](https://nodered.org/)
|
||||||
|
|
||||||
***Currently we are in beta. We ask that you open any issues you have on our repository to help us reach a stable well tested version. Things may change & break before our first release so check changelog before updating.***
|
***Currently we are in beta. We ask that you open any issues you have on our repository to help us reach a stable well tested version. Things may change & break before our first release so check changelog before updating.***
|
||||||
|
|
||||||
@ -11,8 +11,10 @@ The following is supported from this package:
|
|||||||
|
|
||||||
- End-to-end encryption
|
- End-to-end encryption
|
||||||
- [Currently a WIP](#end-to-end-encryption-notes)
|
- [Currently a WIP](#end-to-end-encryption-notes)
|
||||||
- Receive events from a room (messages, reactions, images, and files) whether encrypted or not
|
- Receive events from a room (messages, reactions, images, audio, locations, and files) whether encrypted or not
|
||||||
- Send Images/Files (sending files to e2ee room doesn't currently encrypt them yet)
|
- Send Images/Files (sending files to e2ee room doesn't currently encrypt them yet)
|
||||||
|
- Edit messages
|
||||||
|
- Delete events (messages, reactions, etc)
|
||||||
- Decrypt files in e2ee rooms
|
- Decrypt files in e2ee rooms
|
||||||
- Send HTML/Plain Text Message/Notice
|
- Send HTML/Plain Text Message/Notice
|
||||||
- React to messages
|
- React to messages
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "node-red-contrib-matrix-chat",
|
"name": "node-red-contrib-matrix-chat",
|
||||||
"version": "0.5.8",
|
"version": "0.6.1",
|
||||||
"description": "Matrix chat server client for Node-RED",
|
"description": "Matrix chat server client for Node-RED",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"fs-extra": "^10.0.1",
|
"fs-extra": "^10.0.1",
|
||||||
|
@ -15,7 +15,9 @@
|
|||||||
acceptStickers: {"value": true},
|
acceptStickers: {"value": true},
|
||||||
acceptReactions: {"value": true},
|
acceptReactions: {"value": true},
|
||||||
acceptFiles: {"value": true},
|
acceptFiles: {"value": true},
|
||||||
|
acceptAudio: {"value": true},
|
||||||
acceptImages: {"value": true},
|
acceptImages: {"value": true},
|
||||||
|
acceptLocations: {"value": true},
|
||||||
},
|
},
|
||||||
label: function() {
|
label: function() {
|
||||||
return this.name || "Matrix Receive";
|
return this.name || "Matrix Receive";
|
||||||
@ -49,7 +51,7 @@
|
|||||||
style="width: auto; margin-left: 125px; vertical-align: top"
|
style="width: auto; margin-left: 125px; vertical-align: top"
|
||||||
/>
|
/>
|
||||||
<label for="node-input-acceptText" style="width: auto">
|
<label for="node-input-acceptText" style="width: auto">
|
||||||
Accept text <code>m.text</code>
|
Accept text <code style="text-transform: none;">m.text</code>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
@ -59,7 +61,7 @@
|
|||||||
style="width: auto; margin-left: 125px; vertical-align: top"
|
style="width: auto; margin-left: 125px; vertical-align: top"
|
||||||
/>
|
/>
|
||||||
<label for="node-input-acceptEmotes" style="width: auto">
|
<label for="node-input-acceptEmotes" style="width: auto">
|
||||||
Accept emotes <code>m.emote</code>
|
Accept emotes <code style="text-transform: none;">m.emote</code>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
@ -69,7 +71,7 @@
|
|||||||
style="width: auto; margin-left: 125px; vertical-align: top"
|
style="width: auto; margin-left: 125px; vertical-align: top"
|
||||||
/>
|
/>
|
||||||
<label for="node-input-acceptStickers" style="width: auto">
|
<label for="node-input-acceptStickers" style="width: auto">
|
||||||
Accept stickers <code>m.sticker</code>
|
Accept stickers <code style="text-transform: none;">m.sticker</code>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
@ -79,7 +81,7 @@
|
|||||||
style="width: auto; margin-left: 125px; vertical-align: top"
|
style="width: auto; margin-left: 125px; vertical-align: top"
|
||||||
/>
|
/>
|
||||||
<label for="node-input-acceptReactions" style="width: auto">
|
<label for="node-input-acceptReactions" style="width: auto">
|
||||||
Accept reactions <code>m.reaction</code>
|
Accept reactions <code style="text-transform: none;">m.reaction</code>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
@ -89,7 +91,17 @@
|
|||||||
style="width: auto; margin-left: 125px; vertical-align: top"
|
style="width: auto; margin-left: 125px; vertical-align: top"
|
||||||
/>
|
/>
|
||||||
<label for="node-input-acceptFiles" style="width: auto">
|
<label for="node-input-acceptFiles" style="width: auto">
|
||||||
Accept files <code>m.file</code>
|
Accept files <code style="text-transform: none;">m.file</code>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-row">
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
id="node-input-acceptAudio"
|
||||||
|
style="width: auto; margin-left: 125px; vertical-align: top"
|
||||||
|
/>
|
||||||
|
<label for="node-input-acceptAudio" style="width: auto">
|
||||||
|
Accept files <code style="text-transform: none;">m.audio</code>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
@ -99,7 +111,17 @@
|
|||||||
style="width: auto; margin-left: 125px; vertical-align: top"
|
style="width: auto; margin-left: 125px; vertical-align: top"
|
||||||
/>
|
/>
|
||||||
<label for="node-input-acceptImages" style="width: auto">
|
<label for="node-input-acceptImages" style="width: auto">
|
||||||
Accept images <code>m.image</code>
|
Accept images <code style="text-transform: none;">m.image</code>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-row">
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
id="node-input-acceptLocations"
|
||||||
|
style="width: auto; margin-left: 125px; vertical-align: top"
|
||||||
|
/>
|
||||||
|
<label for="node-input-acceptLocations" style="width: auto">
|
||||||
|
Accept locations <code style="text-transform: none;">m.location</code>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
@ -237,6 +259,38 @@
|
|||||||
</dl>
|
</dl>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
<li><code>msg.type</code> == '<strong>m.audio</strong>'
|
||||||
|
<dl class="message-properties">
|
||||||
|
<dt>msg.filename <span class="property-type">string</span></dt>
|
||||||
|
<dd>the image's parsed filename</dd>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dl class="message-properties">
|
||||||
|
<dt>msg.mimetype <span class="property-type">string</span></dt>
|
||||||
|
<dd>audio file mimetype (ex: audio/ogg)</dd>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dl class="message-properties">
|
||||||
|
<dt>msg.url <span class="property-type">string</span></dt>
|
||||||
|
<dd>the file's URL</dd>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dl class="message-properties">
|
||||||
|
<dt>msg.mxc_url <span class="property-type">string</span></dt>
|
||||||
|
<dd>the file's Matrix URL</dd>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dl class="message-properties">
|
||||||
|
<dt>msg.duration <span class="property-type">integer</span></dt>
|
||||||
|
<dd>duration of audio file in milliseconds</dd>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dl class="message-properties">
|
||||||
|
<dt>msg.waveform <span class="property-type">array[int]</span></dt>
|
||||||
|
<dd>waveform of the audio clip</dd>
|
||||||
|
</dl>
|
||||||
|
</li>
|
||||||
|
|
||||||
<li><code>msg.type</code> == '<strong>m.image</strong>'
|
<li><code>msg.type</code> == '<strong>m.image</strong>'
|
||||||
<dl class="message-properties">
|
<dl class="message-properties">
|
||||||
<dt>msg.filename <span class="property-type">string</span></dt>
|
<dt>msg.filename <span class="property-type">string</span></dt>
|
||||||
@ -263,5 +317,12 @@
|
|||||||
<dd>the image's thumbnail Matrix URL</dd>
|
<dd>the image's thumbnail Matrix URL</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
<li><code>msg.type</code> == '<strong>m.location</strong>'
|
||||||
|
<dl class="message-properties">
|
||||||
|
<dt>msg.geo_uri <span class="property-type">string</span></dt>
|
||||||
|
<dd>URI format of the geolocation</dd>
|
||||||
|
</dl>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</script>
|
</script>
|
@ -11,7 +11,9 @@ module.exports = function(RED) {
|
|||||||
this.acceptStickers = n.acceptStickers;
|
this.acceptStickers = n.acceptStickers;
|
||||||
this.acceptReactions = n.acceptReactions;
|
this.acceptReactions = n.acceptReactions;
|
||||||
this.acceptFiles = n.acceptFiles;
|
this.acceptFiles = n.acceptFiles;
|
||||||
|
this.acceptAudio = n.acceptAudio;
|
||||||
this.acceptImages = n.acceptImages;
|
this.acceptImages = n.acceptImages;
|
||||||
|
this.acceptLocations = n.acceptLocations;
|
||||||
this.roomId = n.roomId;
|
this.roomId = n.roomId;
|
||||||
this.roomIds = this.roomId ? this.roomId.split(',') : [];
|
this.roomIds = this.roomId ? this.roomId.split(',') : [];
|
||||||
|
|
||||||
@ -72,6 +74,27 @@ module.exports = function(RED) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'm.audio':
|
||||||
|
if(!node.acceptAudio) return;
|
||||||
|
if(msg.encrypted) {
|
||||||
|
msg.url = node.server.matrixClient.mxcUrlToHttp(msg.content.file.url);
|
||||||
|
msg.mxc_url = msg.content.file.url;
|
||||||
|
} else {
|
||||||
|
msg.url = node.server.matrixClient.mxcUrlToHttp(msg.content.url);
|
||||||
|
msg.mxc_url = msg.content.url;
|
||||||
|
}
|
||||||
|
|
||||||
|
if('org.matrix.msc1767.file' in msg.content) {
|
||||||
|
msg.filename = msg.content['org.matrix.msc1767.file'].name;
|
||||||
|
msg.mimetype = msg.content['org.matrix.msc1767.file'].mimetype;
|
||||||
|
}
|
||||||
|
|
||||||
|
if('org.matrix.msc1767.audio' in msg.content) {
|
||||||
|
msg.duration = msg.content['org.matrix.msc1767.audio'].duration;
|
||||||
|
msg.waveform = msg.content['org.matrix.msc1767.audio'].waveform;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case 'm.image':
|
case 'm.image':
|
||||||
if(!node.acceptImages) return;
|
if(!node.acceptImages) return;
|
||||||
msg.filename = msg.content.filename || msg.content.body;
|
msg.filename = msg.content.filename || msg.content.body;
|
||||||
@ -88,6 +111,12 @@ module.exports = function(RED) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'm.location':
|
||||||
|
if(!node.acceptLocations) return;
|
||||||
|
msg.geo_uri = msg.content.geo_uri;
|
||||||
|
msg.payload = msg.content.body;
|
||||||
|
break;
|
||||||
|
|
||||||
case 'm.reaction':
|
case 'm.reaction':
|
||||||
if(!node.acceptReactions) return;
|
if(!node.acceptReactions) return;
|
||||||
msg.info = msg.content["m.relates_to"].info;
|
msg.info = msg.content["m.relates_to"].info;
|
||||||
|
@ -5,8 +5,6 @@ const { resolve } = require('path');
|
|||||||
const { LocalStorage } = require('node-localstorage');
|
const { LocalStorage } = require('node-localstorage');
|
||||||
const { LocalStorageCryptoStore } = require('matrix-js-sdk/lib/crypto/store/localStorage-crypto-store');
|
const { LocalStorageCryptoStore } = require('matrix-js-sdk/lib/crypto/store/localStorage-crypto-store');
|
||||||
const {RoomEvent, RoomMemberEvent, HttpApiEvent, ClientEvent} = require("matrix-js-sdk");
|
const {RoomEvent, RoomMemberEvent, HttpApiEvent, ClientEvent} = require("matrix-js-sdk");
|
||||||
const {deriveKey} = require("matrix-js-sdk/lib/crypto/key_passphrase");
|
|
||||||
const {encryptAES} = require("matrix-js-sdk/lib/crypto/aes");
|
|
||||||
|
|
||||||
module.exports = function(RED) {
|
module.exports = function(RED) {
|
||||||
function MatrixFolderNameFromUserId(name) {
|
function MatrixFolderNameFromUserId(name) {
|
||||||
@ -466,7 +464,7 @@ module.exports = function(RED) {
|
|||||||
fs.renameSync(oldStorageDir, oldStorageDir + "-backup");
|
fs.renameSync(oldStorageDir, oldStorageDir + "-backup");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(RED.settings.userDir !== resolve('./')) {
|
if(RED.settings.userDir !== resolve('./') && resolve(oldStorageDir2) !== resolve(storageDir)) {
|
||||||
// user directory does not match running directory
|
// user directory does not match running directory
|
||||||
// check if we stored stuff in wrong directory and move it
|
// check if we stored stuff in wrong directory and move it
|
||||||
if(fs.pathExistsSync(oldStorageDir2)){
|
if(fs.pathExistsSync(oldStorageDir2)){
|
||||||
|
Loading…
Reference in New Issue
Block a user