diff --git a/NodeRed-API.json b/NodeRed-API.json new file mode 100644 index 0000000..69ac892 --- /dev/null +++ b/NodeRed-API.json @@ -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" + } +]