Compare commits
3 Commits
ae386b90a6
...
d0ba671452
Author | SHA1 | Date | |
---|---|---|---|
d0ba671452 | |||
282c8ffc80 | |||
6dd2ec75f0 |
@ -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.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
### 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`.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
### 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).
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### 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.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -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.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -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.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -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.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -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"
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -106,8 +114,109 @@ 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.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
### 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 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 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 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 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.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
### 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.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
### 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.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
### 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.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Force user to join room
|
||||||
|
|
||||||
|
[View JSON](force-join-room.json)
|
||||||
|
|
||||||
|
If you say "force_join @test:example.com !320j90mf0394f:example.com" the bot will force the user `@test:example.com` into room `!320j90mf0394f:example.com`
|
||||||
|
|
||||||
|
Note: This requires the bot to be a server admin. This also only works for rooms on the same server.
|
||||||
|
|
||||||
|

|
116
examples/deactivate-user.json
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "843c48978ab1b0a0",
|
||||||
|
"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": 3260,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"b77d071077487ddc"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "93ea76ce5e65a250",
|
||||||
|
"type": "matrix-receive",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"server": null,
|
||||||
|
"roomId": "",
|
||||||
|
"acceptText": true,
|
||||||
|
"acceptEmotes": false,
|
||||||
|
"acceptStickers": false,
|
||||||
|
"acceptReactions": false,
|
||||||
|
"acceptFiles": false,
|
||||||
|
"acceptImages": false,
|
||||||
|
"x": 420,
|
||||||
|
"y": 3260,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"843c48978ab1b0a0"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "d6795b522954bccd",
|
||||||
|
"type": "comment",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "Respond to \"deactivate_user <user_id>\" by deactivating the user on the server",
|
||||||
|
"info": "",
|
||||||
|
"x": 590,
|
||||||
|
"y": 3220,
|
||||||
|
"wires": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "b77d071077487ddc",
|
||||||
|
"type": "switch",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "msg.payload filter",
|
||||||
|
"property": "payload",
|
||||||
|
"propertyType": "msg",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"t": "regex",
|
||||||
|
"v": "^deactivate_user",
|
||||||
|
"vt": "str",
|
||||||
|
"case": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"checkall": "true",
|
||||||
|
"repair": false,
|
||||||
|
"outputs": 1,
|
||||||
|
"x": 770,
|
||||||
|
"y": 3260,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"3c0e1e130e91206e"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3c0e1e130e91206e",
|
||||||
|
"type": "function",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"func": "let matches = msg.payload.match(/^deactivate_user ?(\\@.*)?/);\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": 3320,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"1f4870b7171cc70f"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "1f4870b7171cc70f",
|
||||||
|
"type": "matrix-synapse-deactivate-user",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"server": null,
|
||||||
|
"x": 610,
|
||||||
|
"y": 3320,
|
||||||
|
"wires": [
|
||||||
|
[],
|
||||||
|
[]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
BIN
examples/deactivate-user.png
Normal file
After Width: | Height: | Size: 24 KiB |
117
examples/force-join-room.json
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "897b8de477d7d0df",
|
||||||
|
"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": 470,
|
||||||
|
"y": 3460,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"1f73f36092a9536b"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "973b2caeb68f3a60",
|
||||||
|
"type": "matrix-receive",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"server": null,
|
||||||
|
"roomId": "",
|
||||||
|
"acceptText": true,
|
||||||
|
"acceptEmotes": false,
|
||||||
|
"acceptStickers": false,
|
||||||
|
"acceptReactions": false,
|
||||||
|
"acceptFiles": false,
|
||||||
|
"acceptImages": false,
|
||||||
|
"x": 300,
|
||||||
|
"y": 3460,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"897b8de477d7d0df"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "be5c7290e6223b7b",
|
||||||
|
"type": "comment",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "Say \"force_join <user_id> <room_id_or_alias>\" to force a user into a room",
|
||||||
|
"info": "",
|
||||||
|
"x": 460,
|
||||||
|
"y": 3420,
|
||||||
|
"wires": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "1f73f36092a9536b",
|
||||||
|
"type": "switch",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "msg.payload filter",
|
||||||
|
"property": "payload",
|
||||||
|
"propertyType": "msg",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"t": "regex",
|
||||||
|
"v": "^deactivate_user",
|
||||||
|
"vt": "str",
|
||||||
|
"case": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"checkall": "true",
|
||||||
|
"repair": false,
|
||||||
|
"outputs": 1,
|
||||||
|
"x": 650,
|
||||||
|
"y": 3460,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"6a2a73bc9dfdaece"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "6a2a73bc9dfdaece",
|
||||||
|
"type": "function",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"func": "let matches = msg.payload.match(/^force_join (\\@.*) (.*)/);\nmsg.userId = matches[1].trim() ? matches[1].trim() : null;\nif(!msg.userId) {\n return null;\n}\nmsg.topic = matches[2].trim() ? matches[2].trim() : null;\nif(!msg.topic) {\n return null;\n}\nreturn msg;",
|
||||||
|
"outputs": 1,
|
||||||
|
"noerr": 0,
|
||||||
|
"initialize": "",
|
||||||
|
"finalize": "",
|
||||||
|
"libs": [],
|
||||||
|
"x": 300,
|
||||||
|
"y": 3520,
|
||||||
|
"wires": [
|
||||||
|
[
|
||||||
|
"212e060e320918d3"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "212e060e320918d3",
|
||||||
|
"type": "matrix-synapse-join-room",
|
||||||
|
"z": "f025a8b9fbd1b054",
|
||||||
|
"name": "",
|
||||||
|
"server": null,
|
||||||
|
"roomId": "",
|
||||||
|
"x": 490,
|
||||||
|
"y": 3520,
|
||||||
|
"wires": [
|
||||||
|
[],
|
||||||
|
[]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
BIN
examples/force-join-room.png
Normal file
After Width: | Height: | Size: 23 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.6",
|
||||||
"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'
|
||||||
|