NodeRed Intermediary API

This commit is contained in:
Elizabeth Cray 2023-07-10 02:53:21 -04:00
parent 551b0aaf5a
commit d1a49816e1
1 changed files with 682 additions and 0 deletions

682
NodeRed-API.json Normal file
View File

@ -0,0 +1,682 @@
[
{
"id": "5f82d0265a7780fe",
"type": "tab",
"label": "Plurality Reality",
"disabled": false,
"info": ""
},
{
"id": "a4f9a1d4dc0bed16",
"type": "junction",
"z": "5f82d0265a7780fe",
"x": 600,
"y": 360,
"wires": [
[
"485fbb51070dc89d",
"097b153e6e371842",
"36cdf90159b3cdb3",
"5e41df8e716cb6e7",
"26c5134882c95d99",
"be99c4b93f8b31ca",
"db81d439bf71bd2e"
]
]
},
{
"id": "f8677e4020d3227c",
"type": "junction",
"z": "5f82d0265a7780fe",
"x": 220,
"y": 160,
"wires": [
[
"4e1d9fc4f01dcd0a",
"bd1a9ca4c8a3be31"
]
]
},
{
"id": "b65c5c782a7c405d",
"type": "http in",
"z": "5f82d0265a7780fe",
"name": "Switch endpoint",
"url": "/switch",
"method": "post",
"upload": false,
"swaggerDoc": "",
"x": 120,
"y": 100,
"wires": [
[
"f8677e4020d3227c",
"2b39c6f59be83971"
]
]
},
{
"id": "4e1d9fc4f01dcd0a",
"type": "http response",
"z": "5f82d0265a7780fe",
"name": "",
"statusCode": "",
"headers": {},
"x": 310,
"y": 180,
"wires": []
},
{
"id": "bd1a9ca4c8a3be31",
"type": "function",
"z": "5f82d0265a7780fe",
"name": "Pluralkit",
"func": "\nconst AllowedTokens = [\n \"CUSTOM_API_KEY\",\n \"CUSTOM_API_KEY\"\n];\n\nif (typeof msg.payload.token !== \"string\"){\n return [null, null];\n}\nif (!AllowedTokens.includes(msg.payload.token)){\n return [null, null];\n}\n\nlet debugRun = false;\nif (typeof msg.payload.debug !== 'undefined'){\n debugRun = (msg.payload.debug);\n}\n\nmsg.payload.token = undefined;\n\nlet PK = global.get('pk').default;\nlet p = new PK({\n base_url: \"https://api.pluralkit.me\",\n version: 2,\n token: \"PLURALKIT_API_KEY\"\n});\nlet cray = await p.getSystem({\n system: \"zyucn\"\n})\nlet fronters = [];\nlet newFronter = false;\nif (typeof msg.payload.members != 'undefined'){\n fronters = msg.payload.members;\n let currentFronters = await cray.getFronters();\n if (currentFronters.members.size != fronters.length){\n newFronter = true; // Additional/Removed Fronter\n }else{\n currentFronters.members.forEach(mem => {\n if (!fronters.includes(mem.id)){\n newFronter = true; //New Fronter\n }\n });\n if (Array.from(currentFronters.members)[0].id != fronters[0]){\n newFronter = true; //New fronter order\n }\n }\n if (newFronter){\n await cray.createSwitch({\n members: fronters\n });\n }\n}\n\nmsg.payload = fronters;\nmsg.debugRun = debugRun;\nreturn [msg, (newFronter?msg:null)];",
"outputs": 2,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 320,
"y": 140,
"wires": [
[
"4bfc82c4b478ca10"
],
[
"66b4b7d2b57038f0"
]
]
},
{
"id": "4bfc82c4b478ca10",
"type": "debug",
"z": "5f82d0265a7780fe",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 490,
"y": 140,
"wires": []
},
{
"id": "290374deba671a83",
"type": "http request",
"z": "5f82d0265a7780fe",
"name": "Pusher",
"method": "POST",
"ret": "txt",
"paytoqs": "ignore",
"url": "https://PUSHER_API_KEY.pushnotifications.pusher.com/publish_api/v1/instances/PUSHER_API_KEY/publishes",
"tls": "",
"persist": false,
"proxy": "",
"authType": "bearer",
"x": 940,
"y": 160,
"wires": [
[]
],
"icon": "node-red/inject.svg"
},
{
"id": "66b4b7d2b57038f0",
"type": "function",
"z": "5f82d0265a7780fe",
"name": "Switch Alert",
"func": "//TODO: Handle null\n\nlet PK = global.get('pk').default;\nlet p = new PK({\n base_url: \"https://api.pluralkit.me\",\n version: 2,\n token: \"PLUEALKIT_API_KEY\"\n});\nlet cray = await p.getSystem({\n system: \"zyucn\"\n})\nlet fronters = await cray.getFronters();\n\nflow.set(\"members\", JSON.stringify(Array.from(fronters.members, (member) => {\n return member[1];\n})))\n\nlet bodyMsg = \"\";\nif (fronters.members.size == 0){\n fronters.members = [\n {\n id: \"\",\n name: \"No one\"\n }\n ];\n}\nmsg.pkit = fronters.members;\nfronters.members.forEach(member => {\n bodyMsg += \" & \" + member.name;\n});\nbodyMsg = bodyMsg.slice(3);\nbodyMsg += \" \" + (bodyMsg.includes(\"&\")?\"are\":\"is\") + \" now fronting.\";\nmsg.payload = bodyMsg;\n\nlet fronterList = \"\";\nfronters.members.forEach(member => {\n fronterList += member.name + \", \";\n});\nfronterList = fronterList.slice(0, -2);\nmsg.fronter = fronterList;\n\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 510,
"y": 180,
"wires": [
[
"a4f9a1d4dc0bed16"
]
]
},
{
"id": "432e1801bd8996b7",
"type": "function",
"z": "5f82d0265a7780fe",
"name": "Pluralkit Template",
"func": "let PK = global.get('pk').default;\nlet p = new PK({\n base_url: \"https://api.pluralkit.me\",\n version: 2,\n token: \"PLURALKIT_API_KEY\"\n});\n\n\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 350,
"y": 100,
"wires": [
[]
]
},
{
"id": "ab8165c02bbaf688",
"type": "telegram sender",
"z": "5f82d0265a7780fe",
"name": "",
"bot": "e9716457749e0eb5",
"haserroroutput": false,
"outputs": 1,
"x": 1130,
"y": 260,
"wires": [
[]
]
},
{
"id": "ef69abf209f5bc4a",
"type": "telegram command",
"z": "5f82d0265a7780fe",
"name": "/sub",
"command": "/subscribe",
"description": "Subscribe to Cray's system notifications",
"registercommand": true,
"language": "en",
"scope": "all_private_chats",
"bot": "e9716457749e0eb5",
"strict": false,
"hasresponse": false,
"useregex": false,
"removeregexcommand": false,
"outputs": 1,
"x": 110,
"y": 220,
"wires": [
[
"cda5079172bbf006"
]
]
},
{
"id": "4ad3123e9c534458",
"type": "mongodb4",
"z": "5f82d0265a7780fe",
"clientNode": "e26a1e35ae350282",
"collection": "subscribers",
"operation": "find",
"output": "toArray",
"name": "Find Subs",
"x": 920,
"y": 260,
"wires": [
[
"ea94c5e41f4d82c6"
]
]
},
{
"id": "3fcb838dfeaed9fe",
"type": "function",
"z": "5f82d0265a7780fe",
"name": "Assemble Tele",
"func": "\nmsg.payload = {\n chatId: msg.payload.telegramId,\n type: \"message\",\n content: msg.content\n};\n//DEBUGGING\nif (msg.debugRun){\n msg.payload.chatId = DEVID; \n}\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 1140,
"y": 220,
"wires": [
[
"ab8165c02bbaf688"
]
]
},
{
"id": "ea94c5e41f4d82c6",
"type": "split",
"z": "5f82d0265a7780fe",
"name": "",
"splt": "\\n",
"spltType": "str",
"arraySplt": 1,
"arraySpltType": "len",
"stream": false,
"addname": "",
"x": 990,
"y": 220,
"wires": [
[
"3fcb838dfeaed9fe"
]
]
},
{
"id": "cda5079172bbf006",
"type": "function",
"z": "5f82d0265a7780fe",
"name": "Process Current DB",
"func": "let telegramId = msg.originalMessage.chat.id;\n\n// Add to subscriptions\nmsg.payload = [{\n telegramId: telegramId\n}];\n\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 260,
"y": 260,
"wires": [
[
"155db78cc9ff74ba"
]
]
},
{
"id": "155db78cc9ff74ba",
"type": "mongodb4",
"z": "5f82d0265a7780fe",
"clientNode": "e26a1e35ae350282",
"collection": "subscribers",
"operation": "insertOne",
"output": "toArray",
"name": "Subscribe",
"x": 240,
"y": 300,
"wires": [
[
"db62b4e61870f27f"
]
]
},
{
"id": "db62b4e61870f27f",
"type": "function",
"z": "5f82d0265a7780fe",
"name": "Generate Response Message",
"func": "\nlet telegramId = msg.originalMessage.chat.id;\n\n// Add to subscriptions\nmsg.payload = {\n chatId: telegramId,\n type: \"message\",\n content: \"Subscribed to the Cray system\"\n};\n\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 290,
"y": 340,
"wires": [
[
"f71b982f74da5540"
]
]
},
{
"id": "f71b982f74da5540",
"type": "telegram sender",
"z": "5f82d0265a7780fe",
"name": "",
"bot": "e9716457749e0eb5",
"haserroroutput": false,
"outputs": 1,
"x": 250,
"y": 380,
"wires": [
[]
]
},
{
"id": "a75ca0dc2d7aac4c",
"type": "websocket out",
"z": "5f82d0265a7780fe",
"name": "Fronter Socket",
"server": "edb292d97a0b097a",
"client": "",
"x": 1000,
"y": 420,
"wires": []
},
{
"id": "2636a3a89b7f5519",
"type": "websocket in",
"z": "5f82d0265a7780fe",
"name": "",
"server": "edb292d97a0b097a",
"client": "",
"x": 790,
"y": 420,
"wires": [
[
"a75ca0dc2d7aac4c"
]
]
},
{
"id": "36cdf90159b3cdb3",
"type": "function",
"z": "5f82d0265a7780fe",
"name": "Assemble Web",
"func": "// Assemble for web notifications\nmsg.payload = JSON.stringify({\n interests: [\n \"cray_system\"\n ],\n web: {\n notification: {\n title: \"Cray System\",\n body: msg.payload\n }\n }\n});\nmsg.headers = {\n 'Content-Type': 'application/json'\n};\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 780,
"y": 160,
"wires": [
[
"290374deba671a83"
]
]
},
{
"id": "485fbb51070dc89d",
"type": "function",
"z": "5f82d0265a7780fe",
"name": "Assemble Telegram",
"func": "// Assemble for Telegram Notifications\nmsg.content = msg.payload;\nmsg.payload = [{\n}];\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 790,
"y": 220,
"wires": [
[
"4ad3123e9c534458"
]
]
},
{
"id": "26c5134882c95d99",
"type": "function",
"z": "5f82d0265a7780fe",
"name": "Assemble Socket",
"func": "// Assemble Socket Data\nlet fronters = JSON.parse(flow.get(\"members\"))\nif (fronters.length > 0){\n msg.payload = fronters[0].id\n}else{\n msg.payload = \"null\"\n}\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 790,
"y": 380,
"wires": [
[
"a75ca0dc2d7aac4c"
]
]
},
{
"id": "5e41df8e716cb6e7",
"type": "function",
"z": "5f82d0265a7780fe",
"name": "Discord Profile",
"func": "\nmsg.text = msg.fronter;\nmsg.status = msg.fronter;\n// TODO: Set emoji based on fronter\nmsg.icon = \"🏳️‍🌈\";\n\nreturn msg;\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 780,
"y": 100,
"wires": [
[
"4a5bf45282ba0390"
]
]
},
{
"id": "097b153e6e371842",
"type": "function",
"z": "5f82d0265a7780fe",
"name": "TODO: Discord Bot",
"func": "\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 790,
"y": 320,
"wires": [
[
"05d1850f5b804e20"
]
]
},
{
"id": "4a5bf45282ba0390",
"type": "discordStatus",
"z": "5f82d0265a7780fe",
"token": "",
"statusType": "msg",
"customContent": "text",
"icon": "msg.icon",
"stt": "online",
"x": 960,
"y": 100,
"wires": [
[]
]
},
{
"id": "be99c4b93f8b31ca",
"type": "hb-status",
"z": "5f82d0265a7780fe",
"name": "Door",
"Homebridge": "homebridge",
"Manufacturer": "MagicHome",
"Service": "Lightbulb",
"device": "homebridgeEA:HOMERGB",
"conf": "588152ebedcf9ddf",
"x": 750,
"y": 480,
"wires": [
[
"997a912f8abfe9f4"
]
]
},
{
"id": "05d1850f5b804e20",
"type": "debug",
"z": "5f82d0265a7780fe",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 970,
"y": 320,
"wires": []
},
{
"id": "997a912f8abfe9f4",
"type": "function",
"z": "5f82d0265a7780fe",
"name": "Smart Home Lookup",
"func": "// Shift current light config into msg object\nmsg.light = msg.payload\n\nconst RGBToHSB = (r, g, b) => {\n r /= 255;\n g /= 255;\n b /= 255;\n const v = Math.max(r, g, b),\n n = v - Math.min(r, g, b);\n const h =\n n === 0 ? 0 : n && v === r ? (g - b) / n : v === g ? 2 + (b - r) / n : 4 + (r - g) / n;\n return [60 * (h < 0 ? h + 6 : h), v && (n / v) * 100, v * 100];\n};\n\nlet fronters = JSON.parse(flow.get(\"members\"))\n\n\nif (typeof fronters == 'object'){\n if (fronters[0].color != null){\n let memberColor = {\n r: Number(`0x${fronters[0].color.slice(0, -4)}`),\n g: Number(`0x${fronters[0].color.slice(2, -2)}`),\n b: Number(`0x${fronters[0].color.slice(4)}`)\n }\n memberColor = RGBToHSB(memberColor.r, memberColor.g, memberColor.b)\n memberColor = {\n Saturation: memberColor[1],\n On: 1,\n // Brightness: memberColor[2],\n Brightness: msg.light.Brightness,\n Hue: memberColor[0]\n }\n let doorColor = null\n if (msg.light.On == 1){\n doorColor = msg\n doorColor.payload = memberColor\n }\n let gemColor = msg\n gemColor.payload = memberColor\n msg = [doorColor, gemColor]\n }else{\n msg = null\n }\n}else{\n msg = null\n}\nreturn msg",
"outputs": 2,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 920,
"y": 480,
"wires": [
[
"3af0892eda3373b1"
],
[
"fad5f43e466bdb2c"
]
]
},
{
"id": "3af0892eda3373b1",
"type": "hb-control",
"z": "5f82d0265a7780fe",
"name": "Door",
"Homebridge": "homebridge",
"Manufacturer": "MagicHome",
"Service": "Lightbulb",
"device": "homebridgeEA:HOMERGB",
"conf": "588152ebedcf9ddf",
"outputs": 1,
"x": 1210,
"y": 460,
"wires": [
[]
]
},
{
"id": "fad5f43e466bdb2c",
"type": "hb-control",
"z": "5f82d0265a7780fe",
"name": "Gem",
"Homebridge": "homebridge",
"Manufacturer": "Corrupt Link",
"Service": "Lightbulb",
"device": "homebridgeEA:RGBLIGHT",
"conf": "588152ebedcf9ddf",
"outputs": 1,
"x": 1090,
"y": 480,
"wires": [
[]
]
},
{
"id": "4d2da22298fe3d41",
"type": "sms",
"z": "5f82d0265a7780fe",
"d": true,
"name": "Phone Trigger",
"message": "",
"numbers": "[\"+15550201234\"]",
"throttle": 1000,
"twilio": "021ccf289ebca7ec",
"x": 1020,
"y": 540,
"wires": [
[]
]
},
{
"id": "db81d439bf71bd2e",
"type": "function",
"z": "5f82d0265a7780fe",
"name": "Phone Shortcut Triger",
"func": "let fronters = JSON.parse(flow.get(\"members\"))\nif (typeof fronters == 'object'){\n if (fronters.length > 0){\n msg.payload = fronters[0].id\n msg.topic = \"SWITCH\"\n node.send(msg)\n }\n}",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 800,
"y": 540,
"wires": [
[
"4d2da22298fe3d41",
"dbe287bc2eb9f964"
]
]
},
{
"id": "dbe287bc2eb9f964",
"type": "e-mail",
"z": "5f82d0265a7780fe",
"d": true,
"server": "smtp.example.com",
"port": "465",
"authtype": "BASIC",
"saslformat": true,
"token": "oauth2Response.access_token",
"secure": true,
"tls": true,
"name": "test@mail.com",
"dname": "Email Trigger",
"x": 1010,
"y": 600,
"wires": []
},
{
"id": "2b39c6f59be83971",
"type": "debug",
"z": "5f82d0265a7780fe",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 310,
"y": 40,
"wires": []
},
{
"id": "e9716457749e0eb5",
"type": "telegram bot",
"botname": "plural_bot",
"usernames": "",
"chatids": "",
"baseapiurl": "",
"updatemode": "polling",
"pollinterval": "300",
"usesocks": false,
"sockshost": "",
"socksport": "6667",
"socksusername": "anonymous",
"sockspassword": "",
"bothost": "",
"botpath": "",
"localbotport": "8443",
"publicbotport": "8443",
"privatekey": "",
"certificate": "",
"useselfsignedcertificate": false,
"sslterminated": false,
"verboselogging": false
},
{
"id": "e26a1e35ae350282",
"type": "mongodb4-client",
"name": "Plurality",
"protocol": "mongodb",
"hostname": "192.0.0.10",
"port": "27017",
"dbName": "plurality",
"authSource": "",
"authMechanism": "DEFAULT",
"tls": false,
"tlsCAFile": "",
"tlsInsecure": false,
"uri": "",
"advanced": "",
"uriTabActive": "tab-uri-simple"
},
{
"id": "edb292d97a0b097a",
"type": "websocket-listener",
"path": "/switch/fronter",
"wholemsg": "false"
},
{
"id": "588152ebedcf9ddf",
"type": "hb-conf",
"username": "999-69-666",
"macAddress": ""
},
{
"id": "021ccf289ebca7ec",
"type": "twilioConfig",
"name": "twilioConfig"
}
]