- Move client storage to the Node-RED user directory.
- Remove mention of Device ID being required for encryption (since it can now auto generate if not provided this could make people think they have to set it when that isn't the case) - matrix-js-sdk updated from ^v15.3.0 to ^v15.5.0 - got updated from ^11.8.2 to ^12.0.1 (this also required us to change how we import this library in code) - Node-RED version requirement added for >=v1.3.0 - NodeJS version requirement added for >=v14.0.0 - removed `process` dependency - send-image node fixed so error doesn't get thrown (`matrix-js-sdk` updated causing some errors) - updated send-image node docs to explain that msg.contentType is necessary for some clients to render the image (otherwise it could display as a blank message in the room). - If a matrix server configuration node was missing it's User ID it would throw a TypeError instead of telling the user the actual issue. - Updated user list example: it now paginates all users on the server (if you had a lot of users the message would fail to send because it was too large) - Added example for creating a room and inviting a user - Added example for joining a mentioned room - Added example for listing out a user's or server's rooms - Added example for getting session data from a user via whois info - Added example for getting a room's user list - Added example for downloading & storing received files/images - Added example for kicking/banning user from a room. - Added example for deactivating a user - Removed message in the room-users config stating it only works if you are an admin - Receive node now outputs `msg.filename` for files and images
@ -16,6 +16,14 @@ Build something cool with these nodes? Feel free to submit a pull request to sha
|
|||||||
- [Respond to "file" with an uploaded file](#respond-to-file-with-an-uploaded-file)
|
- [Respond to "file" with an uploaded file](#respond-to-file-with-an-uploaded-file)
|
||||||
- [Respond to "react" with a reaction](#respond-to-react-with-a-reaction)
|
- [Respond to "react" with a reaction](#respond-to-react-with-a-reaction)
|
||||||
- [Respond to "users" with full list of server users](#respond-to-users-with-full-list-of-server-users)
|
- [Respond to "users" with full list of server users](#respond-to-users-with-full-list-of-server-users)
|
||||||
|
- [Respond to "newroom" by creating new room and inviting user](#respond-to-newroom-by-creating-new-room-and-inviting-user)
|
||||||
|
- [Respond to "joinroom <room_id_or_alias>" by joining mentioned room](#respond-to-joinroom-room_id_or_alias-by-joining-mentioned-room)
|
||||||
|
- [Respond to "rooms <user_id>" with user's rooms (list server's rooms if <user_id> is left blank)](#respond-to-rooms-user_id-with-users-rooms-list-servers-rooms-if-user_id-is-left-blank)
|
||||||
|
- [Respond to "whois <user_id>" with information about the user's session](#respond-to-whois-user_id-with-information-about-the-users-session)
|
||||||
|
- [Respond to "room_users" with current room's users](#respond-to-room_users-with-current-rooms-users)
|
||||||
|
- [Download & store all received files/images](#download--store-all-received-filesimages)
|
||||||
|
- [Kick/Ban user from room](#kickban-user-from-room)
|
||||||
|
- [Deactivate user](#deactivate-user)
|
||||||
|
|
||||||
|
|
||||||
### Create user with Shared Secret Registration
|
### Create user with Shared Secret Registration
|
||||||
@ -28,7 +36,7 @@ Edit the object on the inject node to the user/pass combo you want to create and
|
|||||||
|
|
||||||
**Note:** This only works on Synapse servers.
|
**Note:** This only works on Synapse servers.
|
||||||
|
|
||||||
![img.png](shared-secret-registration.png)
|
![shared-secret-registration.png](shared-secret-registration.png)
|
||||||
|
|
||||||
|
|
||||||
### Create/Edit Synapse User
|
### Create/Edit Synapse User
|
||||||
@ -37,7 +45,7 @@ Edit the object on the inject node to the user/pass combo you want to create and
|
|||||||
|
|
||||||
Allows an administrator to create or modify a user account with a specified `msg.userId`.
|
Allows an administrator to create or modify a user account with a specified `msg.userId`.
|
||||||
|
|
||||||
![img.png](add-user-with-admin-user.png)
|
![add-user-with-admin-user.png](add-user-with-admin-user.png)
|
||||||
|
|
||||||
|
|
||||||
### Use function node to run any command
|
### Use function node to run any command
|
||||||
@ -50,7 +58,7 @@ If we do not have a node for something you want to do (such as redacting events/
|
|||||||
|
|
||||||
To view what sort of functions you have access to check out the `client.ts` file from `matrix-js-sdk` [here](https://github.com/matrix-org/matrix-js-sdk/blob/master/src/client.ts).
|
To view what sort of functions you have access to check out the `client.ts` file from `matrix-js-sdk` [here](https://github.com/matrix-org/matrix-js-sdk/blob/master/src/client.ts).
|
||||||
|
|
||||||
![img.png](custom-redact-function-node.png)
|
![custom-redact-function-node.png](custom-redact-function-node.png)
|
||||||
|
|
||||||
### Respond to "ping" with "pong"
|
### Respond to "ping" with "pong"
|
||||||
|
|
||||||
@ -58,7 +66,7 @@ To view what sort of functions you have access to check out the `client.ts` file
|
|||||||
|
|
||||||
Use this flow to respond to anyone that says "ping" with "pong" into the same room.
|
Use this flow to respond to anyone that says "ping" with "pong" into the same room.
|
||||||
|
|
||||||
![img.png](respond-ping-pong.png)
|
![respond-ping-pong.png](respond-ping-pong.png)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -68,7 +76,7 @@ Use this flow to respond to anyone that says "ping" with "pong" into the same ro
|
|||||||
|
|
||||||
Use this flow to respond to anyone that says "html" with an example HTML message. This shows how easy it is to send HTML.
|
Use this flow to respond to anyone that says "html" with an example HTML message. This shows how easy it is to send HTML.
|
||||||
|
|
||||||
![img.png](respond-to-html-with-html.png)
|
![respond-to-html-with-html.png](respond-to-html-with-html.png)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -78,7 +86,7 @@ Use this flow to respond to anyone that says "html" with an example HTML message
|
|||||||
|
|
||||||
You will need an image on the machine running Node-RED. In this case example.png exists inside the Node-RED directory.
|
You will need an image on the machine running Node-RED. In this case example.png exists inside the Node-RED directory.
|
||||||
|
|
||||||
![img_1.png](respond-image-with-image.png)
|
![respond-image-with-image.png](respond-image-with-image.png)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -88,7 +96,7 @@ You will need an image on the machine running Node-RED. In this case example.png
|
|||||||
|
|
||||||
You will need a file on the machine running Node-RED. In this case sample.pdf exists inside the Node-RED directory.
|
You will need a file on the machine running Node-RED. In this case sample.pdf exists inside the Node-RED directory.
|
||||||
|
|
||||||
![img.png](respond-file-with-file.png)
|
![respond-file-with-file.png](respond-file-with-file.png)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -98,7 +106,7 @@ You will need a file on the machine running Node-RED. In this case sample.pdf ex
|
|||||||
|
|
||||||
Give a 👍 reaction when someone says "react"
|
Give a 👍 reaction when someone says "react"
|
||||||
|
|
||||||
![img.png](respond-react-with-reaction.png)
|
![respond-react-with-reaction.png](respond-react-with-reaction.png)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -106,8 +114,99 @@ Give a 👍 reaction when someone says "react"
|
|||||||
|
|
||||||
[View JSON](respond-users-list.json)
|
[View JSON](respond-users-list.json)
|
||||||
|
|
||||||
When someone sends the text "users" they get a HTML message back containing all the current users on the server.
|
When someone sends the text "users" they get a HTML message back containing all the current users on the server. If your server has a lot of users this paginates and sends a message with 25 users per message.
|
||||||
|
|
||||||
This requires admin privileges.
|
This requires admin privileges.
|
||||||
|
|
||||||
![img.png](respond-users-list.png)
|
![respond-users-list.png](respond-users-list.png)
|
||||||
|
|
||||||
|
|
||||||
|
### Respond to "newroom" by creating new room and inviting user
|
||||||
|
|
||||||
|
[View JSON](respond-users-list.json)
|
||||||
|
|
||||||
|
When someone sends "newroom" a new room will be created and the user that said the message will be invited. The client will also send a welcome message into the new room.
|
||||||
|
|
||||||
|
![respond-newroom-invite.png](respond-newroom-invite.png)
|
||||||
|
|
||||||
|
|
||||||
|
### Respond to "joinroom <room_id_or_alias>" by joining mentioned room
|
||||||
|
|
||||||
|
[View JSON](respond-joinroom.json)
|
||||||
|
|
||||||
|
When someone sends "newroom" a new room will be created and the user that said the message will be invited. The client will also send a welcome message into the new room.
|
||||||
|
|
||||||
|
![respond-joinroom.png](respond-joinroom.png)
|
||||||
|
|
||||||
|
### Respond to "rooms <user_id>" with user's rooms (list server's rooms if <user_id> is left blank)
|
||||||
|
|
||||||
|
[View JSON](respond-rooms.json)
|
||||||
|
|
||||||
|
Responds to "rooms <user_id>" with that user's rooms. If the message is just "rooms" it responds with a list of all rooms the server is participating in.
|
||||||
|
|
||||||
|
Note: If there are a lot of rooms this may fail to send the message as it is too large. This also only works for user's that are on the current server.
|
||||||
|
|
||||||
|
This requires admin privileges.
|
||||||
|
|
||||||
|
![respond-rooms.png](respond-rooms.png)
|
||||||
|
|
||||||
|
|
||||||
|
### Respond to "whois <user_id>" with information about the user's session
|
||||||
|
|
||||||
|
[View JSON](respond-whois.json)
|
||||||
|
|
||||||
|
This lists out the user's session info. Each session contains the IP address, when it was last seen, and the user agent. Useful to find out more about a specific user on your server.
|
||||||
|
|
||||||
|
Note: If there are a lot of sessions this may fail to send the message as it is too large. This also only works for user's that are on the current server.
|
||||||
|
|
||||||
|
This requires admin privileges.
|
||||||
|
|
||||||
|
![respond-whois.png](respond-whois.png)
|
||||||
|
|
||||||
|
|
||||||
|
### Respond to "room_users" with current room's users
|
||||||
|
|
||||||
|
[View JSON](respond-room-users.json)
|
||||||
|
|
||||||
|
List out the users participating in a room.
|
||||||
|
|
||||||
|
Note: If there are a lot of users in the room this will fail to send due to a large message error.
|
||||||
|
|
||||||
|
![respond-room-users.png](respond-room-users.png)
|
||||||
|
|
||||||
|
|
||||||
|
### Download & store all received files/images
|
||||||
|
|
||||||
|
[View JSON](store-received-files.json)
|
||||||
|
|
||||||
|
Download received files/images. If the file is encrypted it will decrypt it for you. The decrypt node downloads the file for you otherwise you need to use a HTTP Request node to download the file.
|
||||||
|
|
||||||
|
Note: You may need to edit the storage directory for this to work. Default action is to create a `downloads` folder in the Node-RED directory and places files in that but there is a good chance your Node-RED instance doesn't have access to write to this directory.
|
||||||
|
|
||||||
|
![store-received-files.png](store-received-files.png)
|
||||||
|
|
||||||
|
|
||||||
|
### Kick/Ban user from room
|
||||||
|
|
||||||
|
[View JSON](room-kick-ban.json)
|
||||||
|
|
||||||
|
If you say "kick @test:example.com" the bot will kick @test:example.com from the current room.
|
||||||
|
|
||||||
|
If you say "ban @test:example.com" the bot will ban @test:example.com from the current room.
|
||||||
|
|
||||||
|
Note: This requires the bot to have permissions to kick/ban in the current room.
|
||||||
|
|
||||||
|
![room-kick-ban.png](room-kick-ban.png)
|
||||||
|
|
||||||
|
|
||||||
|
### Deactivate user
|
||||||
|
|
||||||
|
[View JSON](deactivate-user.json)
|
||||||
|
|
||||||
|
If you say "deactivate_user @test:example.com" the bot will deactivate the @test:example.com account on the server.
|
||||||
|
|
||||||
|
Note: This requires the bot to be a server admin.
|
||||||
|
|
||||||
|
WARNING: Accounts that are deleted cannot be restored. If you want to temp-disable edit the user instead.
|
||||||
|
|
||||||
|
![room-kick-ban.png](deactivate-user.png)
|
0
examples/deactivate-user.json
Normal file
BIN
examples/deactivate-user.png
Normal file
After Width: | Height: | Size: 24 KiB |
90
examples/respond-joinroom.json
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "9a737b0c57b35063",
|
||||||
|
"type": "switch",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "is from me",
|
||||||
|
"property": "userId",
|
||||||
|
"propertyType": "msg",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"t": "eq",
|
||||||
|
"v": "@skylord123:skylar.tech",
|
||||||
|
"vt": "str"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"checkall": "true",
|
||||||
|
"repair": false,
|
||||||
|
"outputs": 1,
|
||||||
|
"x": 430,
|
||||||
|
"y": 2020,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"2a44927d9317a4b4"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "f377ad37af7dc49e",
|
||||||
|
"type": "matrix-receive",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"server": null,
|
||||||
|
"roomId": "",
|
||||||
|
"acceptText": true,
|
||||||
|
"acceptEmotes": true,
|
||||||
|
"acceptStickers": true,
|
||||||
|
"acceptReactions": true,
|
||||||
|
"acceptFiles": true,
|
||||||
|
"acceptImages": true,
|
||||||
|
"x": 260,
|
||||||
|
"y": 2020,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"9a737b0c57b35063"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "f7112a1d2808cfbb",
|
||||||
|
"type": "comment",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "Respond to \"joinroom <room_id_or_alias>\" by joining the mentioned room",
|
||||||
|
"info": "",
|
||||||
|
"x": 440,
|
||||||
|
"y": 1980,
|
||||||
|
"wires": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2a44927d9317a4b4",
|
||||||
|
"type": "function",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "msg.payload == \"joinroom\"",
|
||||||
|
"func": "if(!msg.payload.startsWith(\"joinroom\")) {\n return null;\n}\n\nlet split = msg.payload.split(\" \");\nif(split.length < 2) {\n return; // no room provided\n}\n\nmsg.topic = split[1];\nreturn msg;",
|
||||||
|
"outputs": 1,
|
||||||
|
"noerr": 0,
|
||||||
|
"initialize": "",
|
||||||
|
"finalize": "",
|
||||||
|
"libs": [],
|
||||||
|
"x": 640,
|
||||||
|
"y": 2020,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"a34d05c3b6f6bd27"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "a34d05c3b6f6bd27",
|
||||||
|
"type": "matrix-join-room",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"server": null,
|
||||||
|
"x": 850,
|
||||||
|
"y": 2020,
|
||||||
|
"wires": [
|
||||||
|
[],
|
||||||
|
[]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
BIN
examples/respond-joinroom.png
Normal file
After Width: | Height: | Size: 17 KiB |
157
examples/respond-newroom-invite.json
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "ea0921f33b58e337",
|
||||||
|
"type": "switch",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "msg.payload is \"newroom\"",
|
||||||
|
"property": "payload",
|
||||||
|
"propertyType": "msg",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"t": "eq",
|
||||||
|
"v": "newroom",
|
||||||
|
"vt": "str"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"checkall": "true",
|
||||||
|
"repair": false,
|
||||||
|
"outputs": 1,
|
||||||
|
"x": 640,
|
||||||
|
"y": 1820,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"d7ce5027bc1e2eee"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "9f9a24376b94c977",
|
||||||
|
"type": "switch",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "is from me",
|
||||||
|
"property": "userId",
|
||||||
|
"propertyType": "msg",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"t": "eq",
|
||||||
|
"v": "@skylord123:skylar.tech",
|
||||||
|
"vt": "str"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"checkall": "true",
|
||||||
|
"repair": false,
|
||||||
|
"outputs": 1,
|
||||||
|
"x": 430,
|
||||||
|
"y": 1820,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"ea0921f33b58e337"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3bce23488138c013",
|
||||||
|
"type": "matrix-receive",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"server": null,
|
||||||
|
"roomId": "",
|
||||||
|
"acceptText": true,
|
||||||
|
"acceptEmotes": true,
|
||||||
|
"acceptStickers": true,
|
||||||
|
"acceptReactions": true,
|
||||||
|
"acceptFiles": true,
|
||||||
|
"acceptImages": true,
|
||||||
|
"x": 260,
|
||||||
|
"y": 1820,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"9f9a24376b94c977"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "d7ce5027bc1e2eee",
|
||||||
|
"type": "matrix-create-room",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"server": null,
|
||||||
|
"x": 250,
|
||||||
|
"y": 1880,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"735b9d9fd1401e96"
|
||||||
|
],
|
||||||
|
[]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "735b9d9fd1401e96",
|
||||||
|
"type": "matrix-invite-room",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"server": null,
|
||||||
|
"roomId": "",
|
||||||
|
"x": 410,
|
||||||
|
"y": 1880,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"089f2a7f0c079b6b"
|
||||||
|
],
|
||||||
|
[]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "222ee3c08028c1df",
|
||||||
|
"type": "matrix-send-message",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"server": null,
|
||||||
|
"roomId": "",
|
||||||
|
"messageType": "m.text",
|
||||||
|
"messageFormat": "",
|
||||||
|
"x": 760,
|
||||||
|
"y": 1880,
|
||||||
|
"wires": [
|
||||||
|
[],
|
||||||
|
[]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "089f2a7f0c079b6b",
|
||||||
|
"type": "change",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"t": "set",
|
||||||
|
"p": "payload",
|
||||||
|
"pt": "msg",
|
||||||
|
"to": "Welcome to my new room!",
|
||||||
|
"tot": "str"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"action": "",
|
||||||
|
"property": "",
|
||||||
|
"from": "",
|
||||||
|
"to": "",
|
||||||
|
"reg": false,
|
||||||
|
"x": 580,
|
||||||
|
"y": 1880,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"222ee3c08028c1df"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "48a1fd26227f277e",
|
||||||
|
"type": "comment",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "Respond to \"newroom\" by creating new room and inviting person that said it then send welcome message",
|
||||||
|
"info": "",
|
||||||
|
"x": 520,
|
||||||
|
"y": 1780,
|
||||||
|
"wires": []
|
||||||
|
}
|
||||||
|
]
|
BIN
examples/respond-newroom-invite.png
Normal file
After Width: | Height: | Size: 28 KiB |
134
examples/respond-room-users.json
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "a7581a6224cbd24d",
|
||||||
|
"type": "matrix-room-users",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"server": null,
|
||||||
|
"roomId": "",
|
||||||
|
"x": 440,
|
||||||
|
"y": 2800,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"3e37b5fded58782d"
|
||||||
|
],
|
||||||
|
[]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2764620d2d514996",
|
||||||
|
"type": "switch",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "is from me",
|
||||||
|
"property": "userId",
|
||||||
|
"propertyType": "msg",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"t": "eq",
|
||||||
|
"v": "@skylord123:skylar.tech",
|
||||||
|
"vt": "str"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"checkall": "true",
|
||||||
|
"repair": false,
|
||||||
|
"outputs": 1,
|
||||||
|
"x": 610,
|
||||||
|
"y": 2740,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"f487951ea1b22a95"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "7ed8fc36ba75298a",
|
||||||
|
"type": "matrix-receive",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"server": null,
|
||||||
|
"roomId": "",
|
||||||
|
"acceptText": true,
|
||||||
|
"acceptEmotes": true,
|
||||||
|
"acceptStickers": true,
|
||||||
|
"acceptReactions": true,
|
||||||
|
"acceptFiles": true,
|
||||||
|
"acceptImages": true,
|
||||||
|
"x": 440,
|
||||||
|
"y": 2740,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"2764620d2d514996"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "f487951ea1b22a95",
|
||||||
|
"type": "switch",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "msg.payload filter",
|
||||||
|
"property": "payload",
|
||||||
|
"propertyType": "msg",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"t": "eq",
|
||||||
|
"v": "room_users",
|
||||||
|
"vt": "str"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"checkall": "true",
|
||||||
|
"repair": false,
|
||||||
|
"outputs": 1,
|
||||||
|
"x": 790,
|
||||||
|
"y": 2740,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"a7581a6224cbd24d"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3e37b5fded58782d",
|
||||||
|
"type": "function",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "Room List (for user or all)",
|
||||||
|
"func": "let payload = null;\nif(!msg.payload || !msg.payload.joined) {\n payload = 'No users in room.';\n} else {\n payload = `Room ${msg.topic} users:`;\n payload += '<ul>';\n for(let user_id in msg.payload.joined) {\n payload += `<li>${msg.payload.joined[user_id].display_name} - ${user_id}</li>`;\n }\n payload += '</ul>'\n}\n\nif(payload){\n msg.payload = payload;\n}\nreturn msg;",
|
||||||
|
"outputs": 1,
|
||||||
|
"noerr": 0,
|
||||||
|
"initialize": "",
|
||||||
|
"finalize": "",
|
||||||
|
"libs": [],
|
||||||
|
"x": 650,
|
||||||
|
"y": 2800,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"86a4895c4fe46657"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "86a4895c4fe46657",
|
||||||
|
"type": "matrix-send-message",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "Send HTML Message",
|
||||||
|
"server": null,
|
||||||
|
"roomId": "",
|
||||||
|
"messageType": "m.text",
|
||||||
|
"messageFormat": "html",
|
||||||
|
"x": 880,
|
||||||
|
"y": 2800,
|
||||||
|
"wires": [
|
||||||
|
[],
|
||||||
|
[]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cae1a37fe034b8f8",
|
||||||
|
"type": "comment",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "Respond to \"room_users\" with that room's users",
|
||||||
|
"info": "",
|
||||||
|
"x": 600,
|
||||||
|
"y": 2700,
|
||||||
|
"wires": []
|
||||||
|
}
|
||||||
|
]
|
BIN
examples/respond-room-users.png
Normal file
After Width: | Height: | Size: 26 KiB |
151
examples/respond-rooms.json
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "2eb2dd1b5dbdd03b",
|
||||||
|
"type": "comment",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "Response to \"rooms\" with all rooms",
|
||||||
|
"info": "",
|
||||||
|
"x": 580,
|
||||||
|
"y": 2500,
|
||||||
|
"wires": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "f3415a10f124d586",
|
||||||
|
"type": "function",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"func": "let matches = msg.payload.match(/^rooms ?(\\@.*)?/);\nmsg.userId = matches[1] ? matches[1] : null;\nreturn msg;",
|
||||||
|
"outputs": 1,
|
||||||
|
"noerr": 0,
|
||||||
|
"initialize": "",
|
||||||
|
"finalize": "",
|
||||||
|
"libs": [],
|
||||||
|
"x": 420,
|
||||||
|
"y": 2620,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"2cae98732747989d"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2cae98732747989d",
|
||||||
|
"type": "function",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "Room List (for user or all)",
|
||||||
|
"func": "let matrixClient = global.get(\"matrixClient['@bot:example.com']\"),\n matrixOnline = global.get(\"matrixClientOnline['@bot:example.com']\");\n\nif(!matrixOnline) {\n msg.payload = 'Matrix client not connected.';\n return [null, msg];\n}\n\nif(msg.userId) {\n matrixClient.http\n .authedRequest(\n undefined,\n 'GET',\n `/_synapse/admin/v1/users/${msg.userId}/joined_rooms`,\n {}, // query params\n undefined,\n { prefix: '' }\n ).then(function(e){\n msg.payload = e;\n if(!e.joined_rooms) {\n msg.payload = 'User is not part of any rooms.';\n } else {\n msg.payload = `${msg.userId}'s rooms:`;\n msg.payload += '<ul>';\n e.joined_rooms.forEach(function(room_id){\n msg.payload += `<li>${room_id}</li>`;\n });\n msg.payload += '</ul>'\n }\n node.send([msg, null]);\n }).catch(function(e){\n node.warn(\"Error fetching server user list \" + e);\n msg.payload = e;\n node.send([null, msg]);\n });\n} else {\n matrixClient.http\n .authedRequest(\n undefined,\n 'GET',\n `/_synapse/admin/v1/rooms`,\n {}, // query params\n undefined,\n { prefix: '' }\n ).then(function(e){\n msg.payload = e;\n if(!e.rooms) {\n msg.payload = 'Server has no rooms.';\n } else {\n msg.payload = `Server rooms:`;\n msg.payload += '<ul>';\n e.rooms.forEach(function(room){\n msg.payload += `<li>${room.name} - ${room.room_id} (members: ${room.joined_members} | creator: ${room.creator})</li>`;\n });\n msg.payload += '</ul>'\n }\n node.send([msg, null]);\n }).catch(function(e){\n node.warn(\"Error fetching server user list \" + e);\n msg.payload = e;\n node.send([null, msg]);\n });\n}",
|
||||||
|
"outputs": 2,
|
||||||
|
"noerr": 0,
|
||||||
|
"initialize": "",
|
||||||
|
"finalize": "",
|
||||||
|
"libs": [],
|
||||||
|
"x": 610,
|
||||||
|
"y": 2620,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"d7508993ec1ce895"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"d7508993ec1ce895"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2f8c696ec0dc8f6d",
|
||||||
|
"type": "comment",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "Respond to \"rooms <user_id>\" with that user's rooms",
|
||||||
|
"info": "",
|
||||||
|
"x": 590,
|
||||||
|
"y": 2540,
|
||||||
|
"wires": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "d7508993ec1ce895",
|
||||||
|
"type": "matrix-send-message",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "Send HTML Message",
|
||||||
|
"server": null,
|
||||||
|
"roomId": "",
|
||||||
|
"messageType": "m.text",
|
||||||
|
"messageFormat": "html",
|
||||||
|
"x": 840,
|
||||||
|
"y": 2620,
|
||||||
|
"wires": [
|
||||||
|
[],
|
||||||
|
[]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "13a9a0331352338a",
|
||||||
|
"type": "switch",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "is from me",
|
||||||
|
"property": "userId",
|
||||||
|
"propertyType": "msg",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"t": "eq",
|
||||||
|
"v": "@skylord123:skylar.tech",
|
||||||
|
"vt": "str"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"checkall": "true",
|
||||||
|
"repair": false,
|
||||||
|
"outputs": 1,
|
||||||
|
"x": 590,
|
||||||
|
"y": 2580,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"afe88b8e115f661f"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "e261cc12da739901",
|
||||||
|
"type": "matrix-receive",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"server": null,
|
||||||
|
"roomId": "",
|
||||||
|
"acceptText": true,
|
||||||
|
"acceptEmotes": true,
|
||||||
|
"acceptStickers": true,
|
||||||
|
"acceptReactions": true,
|
||||||
|
"acceptFiles": true,
|
||||||
|
"acceptImages": true,
|
||||||
|
"x": 420,
|
||||||
|
"y": 2580,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"13a9a0331352338a"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "afe88b8e115f661f",
|
||||||
|
"type": "switch",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "msg.payload filter",
|
||||||
|
"property": "payload",
|
||||||
|
"propertyType": "msg",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"t": "regex",
|
||||||
|
"v": "^rooms",
|
||||||
|
"vt": "str",
|
||||||
|
"case": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"checkall": "true",
|
||||||
|
"repair": false,
|
||||||
|
"outputs": 1,
|
||||||
|
"x": 770,
|
||||||
|
"y": 2580,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"f3415a10f124d586"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
BIN
examples/respond-rooms.png
Normal file
After Width: | Height: | Size: 27 KiB |
@ -1,27 +1,257 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"id": "a9b412957063b06c",
|
"id": "49e4b3a1ee3e9e1e",
|
||||||
"type": "matrix-receive",
|
"type": "matrix-synapse-users",
|
||||||
"z": "f025a8b9fbd1b054",
|
"z": "f025a8b9fbd1b054",
|
||||||
"name": "",
|
"name": "",
|
||||||
"roomId": "",
|
"server": null,
|
||||||
"ignoreText": false,
|
"x": 610,
|
||||||
"ignoreReactions": false,
|
"y": 2240,
|
||||||
"ignoreFiles": false,
|
|
||||||
"ignoreImages": false,
|
|
||||||
"x": 460,
|
|
||||||
"y": 120,
|
|
||||||
"wires": [
|
"wires": [
|
||||||
[
|
[
|
||||||
"4aa45cd8653ba898"
|
"d4978f7c2dad7ecf"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"da9d25c324cb727e"
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "4aa45cd8653ba898",
|
"id": "e199d3db1ea6757c",
|
||||||
|
"type": "matrix-send-message",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "Send HTML Notice",
|
||||||
|
"server": null,
|
||||||
|
"roomId": "",
|
||||||
|
"messageType": "m.notice",
|
||||||
|
"messageFormat": "html",
|
||||||
|
"x": 970,
|
||||||
|
"y": 2240,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"e248881d6749ba70"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"da9d25c324cb727e"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "d4978f7c2dad7ecf",
|
||||||
|
"type": "function",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"func": "msg.next_token = msg.payload.next_token || false;\nlet new_payload = '<ul>';\nmsg.payload.users.forEach(function(user, index){\n if(msg.guests == 'false' && user.is_guest) {\n return;\n }\n new_payload += '<li>'+ JSON.stringify(user, null, 2).replace(/(?:\\r\\n|\\r|\\n)/g, \"\\n<br>\"); + '</li>'\n});\nmsg.payload = new_payload + '</ul>';\n\nreturn msg;",
|
||||||
|
"outputs": 1,
|
||||||
|
"noerr": 0,
|
||||||
|
"initialize": "",
|
||||||
|
"finalize": "",
|
||||||
|
"libs": [],
|
||||||
|
"x": 800,
|
||||||
|
"y": 2240,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"e199d3db1ea6757c"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "880cac7307d9a786",
|
||||||
|
"type": "comment",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "Response to \"users\" with full server user list (excluding guests)",
|
||||||
|
"info": "",
|
||||||
|
"x": 620,
|
||||||
|
"y": 2160,
|
||||||
|
"wires": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "469d2ebd9995747a",
|
||||||
|
"type": "matrix-send-message",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"server": null,
|
||||||
|
"roomId": "",
|
||||||
|
"messageType": "m.notice",
|
||||||
|
"messageFormat": "",
|
||||||
|
"x": 600,
|
||||||
|
"y": 2300,
|
||||||
|
"wires": [
|
||||||
|
[],
|
||||||
|
[]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "da9d25c324cb727e",
|
||||||
|
"type": "change",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"t": "set",
|
||||||
|
"p": "payload",
|
||||||
|
"pt": "msg",
|
||||||
|
"to": "error",
|
||||||
|
"tot": "msg"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"action": "",
|
||||||
|
"property": "",
|
||||||
|
"from": "",
|
||||||
|
"to": "",
|
||||||
|
"reg": false,
|
||||||
|
"x": 420,
|
||||||
|
"y": 2300,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"469d2ebd9995747a"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "86577e484ca26aca",
|
||||||
|
"type": "change",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"t": "set",
|
||||||
|
"p": "guests",
|
||||||
|
"pt": "msg",
|
||||||
|
"to": "false",
|
||||||
|
"tot": "str"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"t": "set",
|
||||||
|
"p": "limit",
|
||||||
|
"pt": "msg",
|
||||||
|
"to": "25",
|
||||||
|
"tot": "num"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"t": "set",
|
||||||
|
"p": "order_by",
|
||||||
|
"pt": "msg",
|
||||||
|
"to": "creation_ts",
|
||||||
|
"tot": "str"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"action": "",
|
||||||
|
"property": "",
|
||||||
|
"from": "",
|
||||||
|
"to": "",
|
||||||
|
"reg": false,
|
||||||
|
"x": 420,
|
||||||
|
"y": 2240,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"49e4b3a1ee3e9e1e"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "e248881d6749ba70",
|
||||||
"type": "switch",
|
"type": "switch",
|
||||||
"z": "f025a8b9fbd1b054",
|
"z": "f025a8b9fbd1b054",
|
||||||
"name": "msg.payload == \"users\"",
|
"name": "More to paginate?",
|
||||||
|
"property": "next_token",
|
||||||
|
"propertyType": "msg",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"t": "istype",
|
||||||
|
"v": "string",
|
||||||
|
"vt": "string"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"checkall": "true",
|
||||||
|
"repair": false,
|
||||||
|
"outputs": 1,
|
||||||
|
"x": 1190,
|
||||||
|
"y": 2240,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"11d7fcf6335bc75b"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "11d7fcf6335bc75b",
|
||||||
|
"type": "change",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"t": "set",
|
||||||
|
"p": "from",
|
||||||
|
"pt": "msg",
|
||||||
|
"to": "next_token",
|
||||||
|
"tot": "msg"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"action": "",
|
||||||
|
"property": "",
|
||||||
|
"from": "",
|
||||||
|
"to": "",
|
||||||
|
"reg": false,
|
||||||
|
"x": 1370,
|
||||||
|
"y": 2240,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"49e4b3a1ee3e9e1e"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "8b48e27a118999ec",
|
||||||
|
"type": "switch",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "is from me",
|
||||||
|
"property": "userId",
|
||||||
|
"propertyType": "msg",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"t": "eq",
|
||||||
|
"v": "@skylord123:skylar.tech",
|
||||||
|
"vt": "str"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"checkall": "true",
|
||||||
|
"repair": false,
|
||||||
|
"outputs": 1,
|
||||||
|
"x": 590,
|
||||||
|
"y": 2200,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"7a64319e26e8b689"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "553da6dd77e5e03b",
|
||||||
|
"type": "matrix-receive",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"server": null,
|
||||||
|
"roomId": "",
|
||||||
|
"acceptText": true,
|
||||||
|
"acceptEmotes": true,
|
||||||
|
"acceptStickers": true,
|
||||||
|
"acceptReactions": true,
|
||||||
|
"acceptFiles": true,
|
||||||
|
"acceptImages": true,
|
||||||
|
"x": 420,
|
||||||
|
"y": 2200,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"8b48e27a118999ec"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "7a64319e26e8b689",
|
||||||
|
"type": "switch",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "msg.payload filter",
|
||||||
"property": "payload",
|
"property": "payload",
|
||||||
"propertyType": "msg",
|
"propertyType": "msg",
|
||||||
"rules": [
|
"rules": [
|
||||||
@ -34,70 +264,12 @@
|
|||||||
"checkall": "true",
|
"checkall": "true",
|
||||||
"repair": false,
|
"repair": false,
|
||||||
"outputs": 1,
|
"outputs": 1,
|
||||||
"x": 670,
|
"x": 770,
|
||||||
"y": 120,
|
"y": 2200,
|
||||||
"wires": [
|
"wires": [
|
||||||
[
|
[
|
||||||
"b95a674179d93416"
|
"86577e484ca26aca"
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "b95a674179d93416",
|
|
||||||
"type": "matrix-synapse-users",
|
|
||||||
"z": "f025a8b9fbd1b054",
|
|
||||||
"name": "",
|
|
||||||
"x": 890,
|
|
||||||
"y": 120,
|
|
||||||
"wires": [
|
|
||||||
[
|
|
||||||
"19b654e5f28d93c4"
|
|
||||||
],
|
|
||||||
[]
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "8720c66e867f89f6",
|
|
||||||
"type": "matrix-send-message",
|
|
||||||
"z": "f025a8b9fbd1b054",
|
|
||||||
"name": "Send HTML Notice",
|
|
||||||
"roomId": "",
|
|
||||||
"messageType": "m.notice",
|
|
||||||
"messageFormat": "html",
|
|
||||||
"x": 1230,
|
|
||||||
"y": 120,
|
|
||||||
"wires": [
|
|
||||||
[],
|
|
||||||
[]
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "19b654e5f28d93c4",
|
|
||||||
"type": "function",
|
|
||||||
"z": "f025a8b9fbd1b054",
|
|
||||||
"name": "",
|
|
||||||
"func": "let new_payload = '<ul>';\nmsg.payload.users.forEach(function(user, index){\n new_payload += '<li>'+ JSON.stringify(user, null, 2).replace(/(?:\\r\\n|\\r|\\n)/g, \"\\n<br>\"); + '</li>'\n});\nmsg.payload = new_payload + '</ul>';\n\nreturn msg;",
|
|
||||||
"outputs": 1,
|
|
||||||
"noerr": 0,
|
|
||||||
"initialize": "",
|
|
||||||
"finalize": "",
|
|
||||||
"libs": [],
|
|
||||||
"x": 1060,
|
|
||||||
"y": 120,
|
|
||||||
"wires": [
|
|
||||||
[
|
|
||||||
"8720c66e867f89f6"
|
|
||||||
]
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "563da45ab1747c2b",
|
|
||||||
"type": "comment",
|
|
||||||
"z": "f025a8b9fbd1b054",
|
|
||||||
"name": "Response to \"users\" with full server user list",
|
|
||||||
"info": "",
|
|
||||||
"x": 550,
|
|
||||||
"y": 80,
|
|
||||||
"wires": []
|
|
||||||
}
|
}
|
||||||
]
|
]
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 44 KiB |
153
examples/respond-whois.json
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "93df869346a728d3",
|
||||||
|
"type": "comment",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "Response to \"whois <user_id>\" with user information",
|
||||||
|
"info": "",
|
||||||
|
"x": 610,
|
||||||
|
"y": 2360,
|
||||||
|
"wires": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "656ed1e444fd2e0a",
|
||||||
|
"type": "function",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"func": "let matches = msg.payload.match(/^whois ?(\\@.*)?/);\nmsg.userId = matches[1].trim() ? matches[1].trim() : msg.userId;\nreturn msg;",
|
||||||
|
"outputs": 1,
|
||||||
|
"noerr": 0,
|
||||||
|
"initialize": "",
|
||||||
|
"finalize": "",
|
||||||
|
"libs": [],
|
||||||
|
"x": 440,
|
||||||
|
"y": 2440,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"4869676dab929d20"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "4869676dab929d20",
|
||||||
|
"type": "matrix-whois-user",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"server": null,
|
||||||
|
"x": 590,
|
||||||
|
"y": 2440,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"a894fcabf9e41dca"
|
||||||
|
],
|
||||||
|
[]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "a894fcabf9e41dca",
|
||||||
|
"type": "function",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"func": "try { \n var sessions = msg.payload.devices[\"\"].sessions || null;\n} catch (error) { \n var sessions = null;\n}\nlet html = \"whois (session) information for <strong>\" + msg.userId + \"</strong>\\n<ol>\";\nfor(let session of sessions) {\n try { \n var connections = session.connections;\n } catch (error) { \n var connections = null;\n }\n for(let connection of connections) {\n html += \"\\n<li><pre><code>\"+JSON.stringify(connection, null, 2)+\"</code></pre></li>\"\n }\n}\nhtml += \"</ol>\"\nmsg.payload = html;\nreturn msg;",
|
||||||
|
"outputs": 1,
|
||||||
|
"noerr": 0,
|
||||||
|
"initialize": "",
|
||||||
|
"finalize": "",
|
||||||
|
"libs": [],
|
||||||
|
"x": 740,
|
||||||
|
"y": 2440,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"898b8974f2b24861"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "898b8974f2b24861",
|
||||||
|
"type": "matrix-send-message",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "Send HTML Notice",
|
||||||
|
"server": null,
|
||||||
|
"roomId": "",
|
||||||
|
"messageType": "m.notice",
|
||||||
|
"messageFormat": "html",
|
||||||
|
"x": 910,
|
||||||
|
"y": 2440,
|
||||||
|
"wires": [
|
||||||
|
[],
|
||||||
|
[]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "c8855c79f194796e",
|
||||||
|
"type": "switch",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "is from me",
|
||||||
|
"property": "userId",
|
||||||
|
"propertyType": "msg",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"t": "eq",
|
||||||
|
"v": "@skylord123:skylar.tech",
|
||||||
|
"vt": "str"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"checkall": "true",
|
||||||
|
"repair": false,
|
||||||
|
"outputs": 1,
|
||||||
|
"x": 590,
|
||||||
|
"y": 2400,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"ae1537a16b9e3b4c"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "39109d4f02d241ca",
|
||||||
|
"type": "matrix-receive",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"server": null,
|
||||||
|
"roomId": "",
|
||||||
|
"acceptText": true,
|
||||||
|
"acceptEmotes": true,
|
||||||
|
"acceptStickers": true,
|
||||||
|
"acceptReactions": true,
|
||||||
|
"acceptFiles": true,
|
||||||
|
"acceptImages": true,
|
||||||
|
"x": 420,
|
||||||
|
"y": 2400,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"c8855c79f194796e"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "ae1537a16b9e3b4c",
|
||||||
|
"type": "switch",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "msg.payload filter",
|
||||||
|
"property": "payload",
|
||||||
|
"propertyType": "msg",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"t": "regex",
|
||||||
|
"v": "^whois",
|
||||||
|
"vt": "str",
|
||||||
|
"case": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"checkall": "true",
|
||||||
|
"repair": false,
|
||||||
|
"outputs": 1,
|
||||||
|
"x": 770,
|
||||||
|
"y": 2400,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"656ed1e444fd2e0a"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
BIN
examples/respond-whois.png
Normal file
After Width: | Height: | Size: 22 KiB |
211
examples/room-kick-ban.json
Normal file
@ -0,0 +1,211 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "d78dd157085ed843",
|
||||||
|
"type": "matrix-room-kick",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"server": null,
|
||||||
|
"roomId": "",
|
||||||
|
"x": 570,
|
||||||
|
"y": 2980,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"44d49fcaad67790c"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"44d49fcaad67790c"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "32a99c44b50fe3f3",
|
||||||
|
"type": "matrix-room-ban",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"server": null,
|
||||||
|
"roomId": "",
|
||||||
|
"x": 570,
|
||||||
|
"y": 3080,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"04628a976e7acf1b"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"04628a976e7acf1b"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "5e786bbae3b1a368",
|
||||||
|
"type": "switch",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "is from me",
|
||||||
|
"property": "userId",
|
||||||
|
"propertyType": "msg",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"t": "eq",
|
||||||
|
"v": "@skylord123:skylar.tech",
|
||||||
|
"vt": "str"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"checkall": "true",
|
||||||
|
"repair": false,
|
||||||
|
"outputs": 1,
|
||||||
|
"x": 230,
|
||||||
|
"y": 3020,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"5b3ddae8335383e7"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "ca278a6ffc3b9d6b",
|
||||||
|
"type": "matrix-receive",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"server": null,
|
||||||
|
"roomId": "",
|
||||||
|
"acceptText": true,
|
||||||
|
"acceptEmotes": false,
|
||||||
|
"acceptStickers": false,
|
||||||
|
"acceptReactions": false,
|
||||||
|
"acceptFiles": false,
|
||||||
|
"acceptImages": false,
|
||||||
|
"x": 220,
|
||||||
|
"y": 2960,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"5e786bbae3b1a368"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "b6830f430157be4e",
|
||||||
|
"type": "comment",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "Respond to \"room_ban <user_id>\" by banning user from room",
|
||||||
|
"info": "",
|
||||||
|
"x": 580,
|
||||||
|
"y": 3040,
|
||||||
|
"wires": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "8bffe425d3c1bf24",
|
||||||
|
"type": "comment",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "Respond to \"room_kick <user_id>\" by kicking user from room",
|
||||||
|
"info": "",
|
||||||
|
"x": 580,
|
||||||
|
"y": 2940,
|
||||||
|
"wires": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "5b3ddae8335383e7",
|
||||||
|
"type": "switch",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "Kick or Ban",
|
||||||
|
"property": "payload",
|
||||||
|
"propertyType": "msg",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"t": "regex",
|
||||||
|
"v": "^room_kick",
|
||||||
|
"vt": "str",
|
||||||
|
"case": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"t": "regex",
|
||||||
|
"v": "^room_ban",
|
||||||
|
"vt": "str",
|
||||||
|
"case": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"checkall": "true",
|
||||||
|
"repair": false,
|
||||||
|
"outputs": 2,
|
||||||
|
"x": 230,
|
||||||
|
"y": 3060,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"a19b38afd7b52834"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"925c59f485bf7247"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "925c59f485bf7247",
|
||||||
|
"type": "function",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"func": "let matches = msg.payload.match(/^room_ban ?(\\@.*)?/);\nmsg.userId = matches[1].trim() ? matches[1].trim() : null;\nif(!msg.userId) {\n return null;\n}\nreturn msg;",
|
||||||
|
"outputs": 1,
|
||||||
|
"noerr": 0,
|
||||||
|
"initialize": "",
|
||||||
|
"finalize": "",
|
||||||
|
"libs": [],
|
||||||
|
"x": 420,
|
||||||
|
"y": 3080,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"32a99c44b50fe3f3"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "a19b38afd7b52834",
|
||||||
|
"type": "function",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"func": "let matches = msg.payload.match(/^room_kick ?(\\@.*)?/);\nmsg.userId = matches[1].trim() ? matches[1].trim() : null;\nif(!msg.userId) {\n return null;\n}\nreturn msg;",
|
||||||
|
"outputs": 1,
|
||||||
|
"noerr": 0,
|
||||||
|
"initialize": "",
|
||||||
|
"finalize": "",
|
||||||
|
"libs": [],
|
||||||
|
"x": 420,
|
||||||
|
"y": 2980,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"d78dd157085ed843"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "04628a976e7acf1b",
|
||||||
|
"type": "debug",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"active": true,
|
||||||
|
"tosidebar": true,
|
||||||
|
"console": false,
|
||||||
|
"tostatus": false,
|
||||||
|
"complete": "true",
|
||||||
|
"targetType": "full",
|
||||||
|
"statusVal": "",
|
||||||
|
"statusType": "auto",
|
||||||
|
"x": 710,
|
||||||
|
"y": 3080,
|
||||||
|
"wires": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "44d49fcaad67790c",
|
||||||
|
"type": "debug",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"active": true,
|
||||||
|
"tosidebar": true,
|
||||||
|
"console": false,
|
||||||
|
"tostatus": false,
|
||||||
|
"complete": "true",
|
||||||
|
"targetType": "full",
|
||||||
|
"statusVal": "",
|
||||||
|
"statusType": "auto",
|
||||||
|
"x": 710,
|
||||||
|
"y": 2980,
|
||||||
|
"wires": []
|
||||||
|
}
|
||||||
|
]
|
BIN
examples/room-kick-ban.png
Normal file
After Width: | Height: | Size: 36 KiB |
166
examples/store-received-files.json
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "d7573ed76980dc64",
|
||||||
|
"type": "matrix-receive",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"server": null,
|
||||||
|
"roomId": "",
|
||||||
|
"acceptText": false,
|
||||||
|
"acceptEmotes": false,
|
||||||
|
"acceptStickers": false,
|
||||||
|
"acceptReactions": false,
|
||||||
|
"acceptFiles": true,
|
||||||
|
"acceptImages": true,
|
||||||
|
"x": 1740,
|
||||||
|
"y": 600,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"4d4e992ed895413f"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "addcccdfea9935b1",
|
||||||
|
"type": "comment",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "Download & store received files/images and decrypt if necessary",
|
||||||
|
"info": "",
|
||||||
|
"x": 1970,
|
||||||
|
"y": 560,
|
||||||
|
"wires": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "4d4e992ed895413f",
|
||||||
|
"type": "switch",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"property": "encrypted",
|
||||||
|
"propertyType": "msg",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"t": "true"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"t": "else"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"checkall": "true",
|
||||||
|
"repair": false,
|
||||||
|
"outputs": 2,
|
||||||
|
"x": 1890,
|
||||||
|
"y": 600,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"660782188696fc62"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"857bce169036e3cb"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "660782188696fc62",
|
||||||
|
"type": "matrix-decrypt-file",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": null,
|
||||||
|
"x": 2050,
|
||||||
|
"y": 600,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"cdbaf88f6631322e"
|
||||||
|
],
|
||||||
|
[]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "b62db6caf4697242",
|
||||||
|
"type": "file",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"filename": "",
|
||||||
|
"appendNewline": true,
|
||||||
|
"createDir": false,
|
||||||
|
"overwriteFile": "true",
|
||||||
|
"encoding": "none",
|
||||||
|
"x": 2240,
|
||||||
|
"y": 660,
|
||||||
|
"wires": [
|
||||||
|
[]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "857bce169036e3cb",
|
||||||
|
"type": "http request",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"method": "GET",
|
||||||
|
"ret": "bin",
|
||||||
|
"paytoqs": "ignore",
|
||||||
|
"url": "",
|
||||||
|
"tls": "",
|
||||||
|
"persist": false,
|
||||||
|
"proxy": "",
|
||||||
|
"authType": "",
|
||||||
|
"senderr": false,
|
||||||
|
"x": 1910,
|
||||||
|
"y": 660,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"7d0be52f8c3f1b54"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "7d0be52f8c3f1b54",
|
||||||
|
"type": "switch",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"property": "statusCode",
|
||||||
|
"propertyType": "msg",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"t": "eq",
|
||||||
|
"v": "200",
|
||||||
|
"vt": "num"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"checkall": "true",
|
||||||
|
"repair": false,
|
||||||
|
"outputs": 1,
|
||||||
|
"x": 2050,
|
||||||
|
"y": 660,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"cdbaf88f6631322e"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cdbaf88f6631322e",
|
||||||
|
"type": "change",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "set directory",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"t": "set",
|
||||||
|
"p": "filename",
|
||||||
|
"pt": "msg",
|
||||||
|
"to": "\"downloads/\" & msg.filename",
|
||||||
|
"tot": "jsonata"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"action": "",
|
||||||
|
"property": "",
|
||||||
|
"from": "",
|
||||||
|
"to": "",
|
||||||
|
"reg": false,
|
||||||
|
"x": 2230,
|
||||||
|
"y": 600,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"b62db6caf4697242"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
BIN
examples/store-received-files.png
Normal file
After Width: | Height: | Size: 24 KiB |
997
package-lock.json
generated
13
package.json
@ -1,18 +1,18 @@
|
|||||||
{
|
{
|
||||||
"name": "node-red-contrib-matrix-chat",
|
"name": "node-red-contrib-matrix-chat",
|
||||||
"version": "0.4.1",
|
"version": "0.4.5",
|
||||||
"description": "Matrix chat server client for Node-RED",
|
"description": "Matrix chat server client for Node-RED",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"fs-extra": "^9.1.0",
|
"fs-extra": "^10.0.0",
|
||||||
"got": "^11.8.2",
|
"got": "^12.0.1",
|
||||||
"isomorphic-webcrypto": "^2.3.8",
|
"isomorphic-webcrypto": "^2.3.8",
|
||||||
"matrix-js-sdk": "^15.3.0",
|
"matrix-js-sdk": "^15.5.0",
|
||||||
"node-localstorage": "^2.2.1",
|
"node-localstorage": "^2.2.1",
|
||||||
"olm": "https://packages.matrix.org/npm/olm/olm-3.2.1.tgz",
|
"olm": "https://packages.matrix.org/npm/olm/olm-3.2.1.tgz",
|
||||||
"process": "^0.11.10",
|
|
||||||
"utf8": "^3.0.0"
|
"utf8": "^3.0.0"
|
||||||
},
|
},
|
||||||
"node-red": {
|
"node-red": {
|
||||||
|
"version": ">=1.3.0",
|
||||||
"nodes": {
|
"nodes": {
|
||||||
"matrix-server-config": "src/matrix-server-config.js",
|
"matrix-server-config": "src/matrix-server-config.js",
|
||||||
"matrix-receive": "src/matrix-receive.js",
|
"matrix-receive": "src/matrix-receive.js",
|
||||||
@ -35,6 +35,9 @@
|
|||||||
"matrix-room-users": "src/matrix-room-users.js"
|
"matrix-room-users": "src/matrix-room-users.js"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=14.0.0"
|
||||||
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"node-red",
|
"node-red",
|
||||||
"matrix",
|
"matrix",
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
module.exports = function(RED) {
|
module.exports = function(RED) {
|
||||||
const got = require('got');
|
|
||||||
const crypto = require('isomorphic-webcrypto');
|
const crypto = require('isomorphic-webcrypto');
|
||||||
|
|
||||||
function MatrixDecryptFile(n) {
|
function MatrixDecryptFile(n) {
|
||||||
@ -10,6 +9,8 @@ module.exports = function(RED) {
|
|||||||
this.name = n.name;
|
this.name = n.name;
|
||||||
|
|
||||||
node.on("input", async function (msg) {
|
node.on("input", async function (msg) {
|
||||||
|
const { got } = await import('got');
|
||||||
|
|
||||||
if(!msg.type) {
|
if(!msg.type) {
|
||||||
node.error('msg.type is required.');
|
node.error('msg.type is required.');
|
||||||
return;
|
return;
|
||||||
|
@ -204,6 +204,11 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li><code>msg.type</code> == '<strong>m.file</strong>'
|
<li><code>msg.type</code> == '<strong>m.file</strong>'
|
||||||
|
<dl class="message-properties">
|
||||||
|
<dt>msg.filename <span class="property-type">string</span></dt>
|
||||||
|
<dd>the file's parsed filename</dd>
|
||||||
|
</dl>
|
||||||
|
|
||||||
<dl class="message-properties">
|
<dl class="message-properties">
|
||||||
<dt>msg.url <span class="property-type">string</span></dt>
|
<dt>msg.url <span class="property-type">string</span></dt>
|
||||||
<dd>the file's URL</dd>
|
<dd>the file's URL</dd>
|
||||||
@ -216,6 +221,11 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li><code>msg.type</code> == '<strong>m.image</strong>'
|
<li><code>msg.type</code> == '<strong>m.image</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">
|
<dl class="message-properties">
|
||||||
<dt>msg.url <span class="property-type">string</span></dt>
|
<dt>msg.url <span class="property-type">string</span></dt>
|
||||||
<dd>the image's URL</dd>
|
<dd>the image's URL</dd>
|
||||||
|
@ -62,6 +62,7 @@ module.exports = function(RED) {
|
|||||||
|
|
||||||
case 'm.file':
|
case 'm.file':
|
||||||
if(!node.acceptFiles) return;
|
if(!node.acceptFiles) return;
|
||||||
|
msg.filename = msg.content.filename || msg.content.body;
|
||||||
if(msg.encrypted) {
|
if(msg.encrypted) {
|
||||||
msg.url = node.server.matrixClient.mxcUrlToHttp(msg.content.file.url);
|
msg.url = node.server.matrixClient.mxcUrlToHttp(msg.content.file.url);
|
||||||
msg.mxc_url = msg.content.file.url;
|
msg.mxc_url = msg.content.file.url;
|
||||||
@ -73,7 +74,7 @@ module.exports = function(RED) {
|
|||||||
|
|
||||||
case 'm.image':
|
case 'm.image':
|
||||||
if(!node.acceptImages) return;
|
if(!node.acceptImages) return;
|
||||||
|
msg.filename = msg.content.filename || msg.content.body;
|
||||||
if(msg.encrypted) {
|
if(msg.encrypted) {
|
||||||
msg.url = node.server.matrixClient.mxcUrlToHttp(msg.content.file.url);
|
msg.url = node.server.matrixClient.mxcUrlToHttp(msg.content.file.url);
|
||||||
msg.mxc_url = msg.content.file.url;
|
msg.mxc_url = msg.content.file.url;
|
||||||
|
@ -31,9 +31,6 @@
|
|||||||
<label for="node-input-server"><i class="fa fa-user"></i> Room Id</label>
|
<label for="node-input-server"><i class="fa fa-user"></i> Room Id</label>
|
||||||
<input type="text" id="node-input-roomId" placeholder="msg.topic">
|
<input type="text" id="node-input-roomId" placeholder="msg.topic">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-tips">
|
|
||||||
This only works on Synapse servers. The user also must be an administrator.
|
|
||||||
</div>
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/html" data-help-name="matrix-room-users">
|
<script type="text/html" data-help-name="matrix-room-users">
|
||||||
|
@ -43,7 +43,7 @@
|
|||||||
|
|
||||||
<script type="text/html" data-help-name="matrix-send-image">
|
<script type="text/html" data-help-name="matrix-send-image">
|
||||||
<h3>Details</h3>
|
<h3>Details</h3>
|
||||||
<p>This node will send an image to a Matrix chat room. Supports direct linking to a File In node.</p>
|
<p>This node will send an image to a Matrix chat room. Supports direct linking to a File In node. It's recommended you set <code>msg.contentType</code> so the client knows how to render the image (otherwise the image could show blank).</p>
|
||||||
|
|
||||||
<h3>Inputs</h3>
|
<h3>Inputs</h3>
|
||||||
<dl class="message-properties">
|
<dl class="message-properties">
|
||||||
|
@ -72,20 +72,28 @@ module.exports = function(RED) {
|
|||||||
})
|
})
|
||||||
.then(function(file){
|
.then(function(file){
|
||||||
node.server.matrixClient
|
node.server.matrixClient
|
||||||
.sendImageMessage(msg.topic, file.content_uri, {}, (msg.body || msg.filename) || "")
|
.sendImageMessage(
|
||||||
|
msg.topic,
|
||||||
|
file.content_uri,
|
||||||
|
{},
|
||||||
|
(msg.body || msg.filename) || null,
|
||||||
|
null
|
||||||
|
)
|
||||||
.then(function(e) {
|
.then(function(e) {
|
||||||
node.log("Image message sent: " + e);
|
node.log("Image message sent: " + e);
|
||||||
msg.eventId = e.event_id;
|
msg.eventId = e.event_id;
|
||||||
|
msg.content_uri_mxc = file.content_uri;
|
||||||
|
msg.content_uri = node.server.matrixClient.mxcUrlToHttp(file.content_uri);
|
||||||
node.send([msg, null]);
|
node.send([msg, null]);
|
||||||
})
|
})
|
||||||
.catch(function(e){
|
.catch(function(e){
|
||||||
node.warn("Error sending image message " + e);
|
node.warn("Error sending image message: " + e);
|
||||||
msg.error = e;
|
msg.error = e;
|
||||||
node.send([null, msg]);
|
node.send([null, msg]);
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
.catch(function(e){
|
.catch(function(e){
|
||||||
node.warn("Error uploading image message " + e);
|
node.warn("Error uploading image message: " + e);
|
||||||
msg.error = e;
|
msg.error = e;
|
||||||
node.send([null, msg]);
|
node.send([null, msg]);
|
||||||
});
|
});
|
||||||
|
@ -112,7 +112,7 @@
|
|||||||
style="width: auto; margin-left: 125px; vertical-align: top"
|
style="width: auto; margin-left: 125px; vertical-align: top"
|
||||||
/>
|
/>
|
||||||
<label for="node-config-input-enableE2ee" style="width: auto;max-width:50%;">
|
<label for="node-config-input-enableE2ee" style="width: auto;max-width:50%;">
|
||||||
Enable end-to-end encryption (requires a Device ID to be set.)
|
Enable end-to-end encryption
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
global.Olm = require('olm');
|
global.Olm = require('olm');
|
||||||
const fs = require("fs-extra");
|
const fs = require("fs-extra");
|
||||||
const sdk = require("matrix-js-sdk");
|
const sdk = require("matrix-js-sdk");
|
||||||
|
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');
|
||||||
|
|
||||||
@ -10,19 +11,17 @@ module.exports = function(RED) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function MatrixServerNode(n) {
|
function MatrixServerNode(n) {
|
||||||
let storageDir = './matrix-client-storage';
|
let node = this,
|
||||||
|
storageDir = RED.settings.userDir + '/matrix-client-storage';
|
||||||
RED.nodes.createNode(this, n);
|
RED.nodes.createNode(this, n);
|
||||||
|
node.setMaxListeners(1000);
|
||||||
|
|
||||||
let node = this;
|
|
||||||
node.log("Initializing Matrix Server Config node");
|
node.log("Initializing Matrix Server Config node");
|
||||||
|
|
||||||
if(!this.credentials) {
|
if(!this.credentials) {
|
||||||
this.credentials = {};
|
this.credentials = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
node.setMaxListeners(1000);
|
|
||||||
|
|
||||||
this.connected = null;
|
this.connected = null;
|
||||||
this.name = n.name;
|
this.name = n.name;
|
||||||
this.userId = this.credentials.userId;
|
this.userId = this.credentials.userId;
|
||||||
@ -34,6 +33,12 @@ module.exports = function(RED) {
|
|||||||
this.e2ee = (this.enableE2ee && this.deviceId);
|
this.e2ee = (this.enableE2ee && this.deviceId);
|
||||||
this.globalAccess = n.global;
|
this.globalAccess = n.global;
|
||||||
this.initializedAt = new Date();
|
this.initializedAt = new Date();
|
||||||
|
|
||||||
|
if(!this.userId) {
|
||||||
|
node.log("Matrix connection failed: missing user ID in configuration.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let localStorageDir = storageDir + '/' + MatrixFolderNameFromUserId(this.userId),
|
let localStorageDir = storageDir + '/' + MatrixFolderNameFromUserId(this.userId),
|
||||||
localStorage = new LocalStorage(localStorageDir),
|
localStorage = new LocalStorage(localStorageDir),
|
||||||
initialSetup = false;
|
initialSetup = false;
|
||||||
@ -41,11 +46,9 @@ module.exports = function(RED) {
|
|||||||
let retryStartTimeout = null;
|
let retryStartTimeout = null;
|
||||||
|
|
||||||
if(!this.credentials.accessToken) {
|
if(!this.credentials.accessToken) {
|
||||||
node.log("Matrix connection failed: missing access token.");
|
node.error("Matrix connection failed: missing access token in configuration.");
|
||||||
} else if(!this.url) {
|
} else if(!this.url) {
|
||||||
node.log("Matrix connection failed: missing server URL.");
|
node.error("Matrix connection failed: missing server URL in configuration.");
|
||||||
} else if(!this.userId) {
|
|
||||||
node.log("Matrix connection failed: missing user ID.");
|
|
||||||
} else {
|
} else {
|
||||||
node.setConnected = function(connected, cb) {
|
node.setConnected = function(connected, cb) {
|
||||||
if (node.connected !== connected) {
|
if (node.connected !== connected) {
|
||||||
@ -296,7 +299,6 @@ module.exports = function(RED) {
|
|||||||
// httpStatus: 401
|
// httpStatus: 401
|
||||||
// }
|
// }
|
||||||
|
|
||||||
console.log("Authentication failure: ", errorObj);
|
|
||||||
node.error("Authentication failure: " + errorObj);
|
node.error("Authentication failure: " + errorObj);
|
||||||
stopClient();
|
stopClient();
|
||||||
});
|
});
|
||||||
@ -392,7 +394,8 @@ module.exports = function(RED) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
function upgradeDirectoryIfNecessary(node, storageDir) {
|
function upgradeDirectoryIfNecessary(node, storageDir) {
|
||||||
let oldStorageDir = './matrix-local-storage';
|
let oldStorageDir = './matrix-local-storage',
|
||||||
|
oldStorageDir2 = './matrix-client-storage';
|
||||||
|
|
||||||
// if the old storage location exists lets move it to it's new location
|
// if the old storage location exists lets move it to it's new location
|
||||||
if(fs.pathExistsSync(oldStorageDir)){
|
if(fs.pathExistsSync(oldStorageDir)){
|
||||||
@ -415,6 +418,18 @@ module.exports = function(RED) {
|
|||||||
node.log("archiving old config folder '" + oldStorageDir + "' to '" + oldStorageDir + "-backup");
|
node.log("archiving old config folder '" + oldStorageDir + "' to '" + oldStorageDir + "-backup");
|
||||||
fs.renameSync(oldStorageDir, oldStorageDir + "-backup");
|
fs.renameSync(oldStorageDir, oldStorageDir + "-backup");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(RED.settings.userDir !== resolve('./')) {
|
||||||
|
// user directory does not match running directory
|
||||||
|
// check if we stored stuff in wrong directory and move it
|
||||||
|
if(fs.pathExistsSync(oldStorageDir2)){
|
||||||
|
fs.ensureDirSync(storageDir);
|
||||||
|
node.log("found old '" + oldStorageDir2 + "' path, copying to new location '" + storageDir);
|
||||||
|
fs.copySync(oldStorageDir2, storageDir);
|
||||||
|
// rename folder to keep as a backup (and so we don't run again)
|
||||||
|
fs.renameSync(oldStorageDir2, oldStorageDir2 + "-backup");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
module.exports = function(RED) {
|
module.exports = function(RED) {
|
||||||
const got = require("got");
|
|
||||||
const utf8 = require('utf8');
|
const utf8 = require('utf8');
|
||||||
const crypto = require('crypto');
|
const crypto = require('crypto');
|
||||||
|
|
||||||
@ -22,7 +21,8 @@ module.exports = function(RED) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
node.on("input", function (msg) {
|
node.on("input", async function (msg) {
|
||||||
|
const { got } = await import('got');
|
||||||
|
|
||||||
if(!msg.payload.username) {
|
if(!msg.payload.username) {
|
||||||
node.error("msg.payload.username is required");
|
node.error("msg.payload.username is required");
|
||||||
@ -34,7 +34,7 @@ module.exports = function(RED) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
(async () => {
|
await (async () => {
|
||||||
try {
|
try {
|
||||||
var response = await got.get(this.server + '/_synapse/admin/v1/register', {
|
var response = await got.get(this.server + '/_synapse/admin/v1/register', {
|
||||||
responseType: 'json'
|
responseType: 'json'
|
||||||
|