From 4f86f920c6a42fbfe44a8bb11e26c549feeea9a5 Mon Sep 17 00:00:00 2001 From: Cubester Date: Fri, 17 Jan 2025 01:35:02 -0500 Subject: [PATCH 01/14] Webhooks extension --- docs/CubesterYT/Webhooks.md | 33 +++++ extensions/CubesterYT/Webhooks.js | 225 ++++++++++++++++++++++++++++++ extensions/extensions.json | 2 +- images/CubesterYT/Webhooks.svg | 88 ++++++++++++ 4 files changed, 347 insertions(+), 1 deletion(-) create mode 100644 docs/CubesterYT/Webhooks.md create mode 100644 extensions/CubesterYT/Webhooks.js create mode 100644 images/CubesterYT/Webhooks.svg diff --git a/docs/CubesterYT/Webhooks.md b/docs/CubesterYT/Webhooks.md new file mode 100644 index 0000000000..61939ee67c --- /dev/null +++ b/docs/CubesterYT/Webhooks.md @@ -0,0 +1,33 @@ +# Webhooks + +This extension allows you to use [Webhooks](https://en.wikipedia.org/wiki/Webhook). It provides a simple way to save multiple Webhooks to your project for easy management and easy data handling. + +These blocks are made with simplicity in mind so that your project isn't messy when you implement Webhooks. + +## Adding a Webhook + +When loading the extension, you are provided with a button, `Add a Webhook`, to make a new Webhook. It will prompt you to type in a name, which the Webhook registers under, and then prompt you to provide the URL of the Webhook. Please make sure the Webhook URL is valid before making the Webhook, else the extension can't send anything. + +## Deleting a Webhook + +You can delete a specific Webhook by pressing the `Delete a Webhook` button, where you will be prompted to enter the name of the Webhook you wish to delete. + +## Blocks + +```scratch +(data of [Webhook v] :: #C73A63) +``` + +This block reports the data the Webhook chosen from the dropdown is currently assigned to. + +```scratch +set data of [Webhook v] to [{"key":"value"}] and type to [application/json v] :: #C73A63 +``` + +This block is used to set data to the chosen Webhook from the list. It only supports JSON inputs, but using the second dropdown, you can make the content type either `application/json` or `application/x-www-form-urlencoded`. The extension will automatically handle conversions for your ease. + +```scratch +send data to [Webhook v] :: #C73A63 +``` + +This block sends the data that is set for the selected Webhook. \ No newline at end of file diff --git a/extensions/CubesterYT/Webhooks.js b/extensions/CubesterYT/Webhooks.js new file mode 100644 index 0000000000..90730504ab --- /dev/null +++ b/extensions/CubesterYT/Webhooks.js @@ -0,0 +1,225 @@ +// Name: Webhooks +// ID: cubesterWebhooks +// Description: A modern, very capable, Webhook extension. +// By: CubesterYT +// License: MPL-2.0 + +// Version V.1.0.0 + +(function (Scratch) { + "use strict"; + + const icon = ""; + + let hideFromPalette = true; + let webhooks; + function setupStorage() { + if (!Scratch.vm.runtime.extensionStorage["cubesterWebhooks"]) { + Scratch.vm.runtime.extensionStorage["cubesterWebhooks"] = + Object.create(null); + Scratch.vm.runtime.extensionStorage["cubesterWebhooks"].webhooks = + Object.create(null); + } + webhooks = Scratch.vm.runtime.extensionStorage["cubesterWebhooks"].webhooks; + } + setupStorage(); + Scratch.vm.runtime.on("PROJECT_LOADED", setupStorage); + + function toForm(data) { + const parts = []; + const process = (name, value) => { + if (value === null || value === undefined) { + parts.push(`${encodeURIComponent(name)}=null`); + } else if ( + typeof value === "string" || + typeof value === "number" || + typeof value === "boolean" + ) { + parts.push(`${encodeURIComponent(name)}=${encodeURIComponent(value)}`); + } else if (Array.isArray(value)) { + value.forEach((elem, index) => process(`${name}[${index}]`, elem)); + } else if (typeof value === "object") { + Object.keys(value).forEach((key) => + process(`${name}[${key}]`, value[key]) + ); + } + }; + Object.keys(data).forEach((key) => process(key, data[key])); + return parts.join("&"); + } + + class Webhooks { + getInfo() { + return { + id: "cubesterWebhooks", + name: Scratch.translate("Webhooks"), + color1: "#C73A63", + menuIconURI: icon, + docsURI: "https://extensions.turbowarp.org/CubesterYT/Webhooks", + + blocks: [ + "---", + + { + func: "addWebhook", + text: Scratch.translate("Add a Webhook"), + blockType: Scratch.BlockType.BUTTON, + }, + { + func: "deleteWebhook", + text: Scratch.translate("Delete a Webhook"), + blockType: Scratch.BlockType.BUTTON, + hideFromPalette, + }, + { + opcode: "data", + text: Scratch.translate("data of [WEBHOOK]"), + blockType: Scratch.BlockType.REPORTER, + disableMonitor: true, + hideFromPalette, + arguments: { + WEBHOOK: { + type: Scratch.ArgumentType.STRING, + menu: "WEBHOOKS", + }, + }, + }, + { + opcode: "setData", + text: Scratch.translate( + "set data of [WEBHOOK] to [JSON] and type to [TYPE]" + ), + blockType: Scratch.BlockType.COMMAND, + hideFromPalette, + arguments: { + WEBHOOK: { + type: Scratch.ArgumentType.STRING, + menu: "WEBHOOKS", + }, + JSON: { + type: Scratch.ArgumentType.STRING, + defaultValue: '{"key":"value"}', + }, + TYPE: { + type: Scratch.ArgumentType.STRING, + menu: "TYPE", + }, + }, + }, + { + opcode: "postData", + text: Scratch.translate("send data to [WEBHOOK]"), + blockType: Scratch.BlockType.COMMAND, + hideFromPalette, + arguments: { + WEBHOOK: { + type: Scratch.ArgumentType.STRING, + menu: "WEBHOOKS", + }, + }, + }, + ], + menus: { + WEBHOOKS: { + acceptReporters: false, + items: "_webhookMenu", + }, + TYPE: { + acceptReporters: false, + items: ["application/json", "application/x-www-form-urlencoded"], + }, + }, + }; + } + + addWebhook() { + let name; + do { + name = prompt(Scratch.translate("Enter Webhook name:")); + if (name === null) { + return; + } + if (Object.keys(webhooks).includes(name)) { + alert( + Scratch.translate( + "This Webhook already exists! Please try a different name." + ) + ); + } + } while (Object.keys(webhooks).includes(name)); + let URL = prompt(Scratch.translate("Enter Webhook URL:")); + webhooks[name] = { URL, DATA: {}, TYPE: "application/json" }; + hideFromPalette = false; + Scratch.vm.extensionManager.refreshBlocks(); + } + deleteWebhook() { + let name; + do { + name = prompt(Scratch.translate("Enter Webhook name:")); + if (name === null) { + return; + } + if (!Object.keys(webhooks).includes(name)) { + alert( + Scratch.translate( + "This Webhook does not exist. Please enter a valid webhook name." + ) + ); + } + } while (!Object.keys(webhooks).includes(name)); + delete webhooks[name]; + if (Object.keys(webhooks).length === 0) { + hideFromPalette = true; + Scratch.vm.extensionManager.refreshBlocks(); + } + } + data(args) { + try { + switch (webhooks[args.WEBHOOK].TYPE) { + case "application/json": + return JSON.stringify(webhooks[args.WEBHOOK].DATA); + case "application/x-www-form-urlencoded": + return toForm(webhooks[args.WEBHOOK].DATA); + } + } catch (error) { + return ""; + } + } + setData(args) { + try { + webhooks[args.WEBHOOK].DATA = JSON.parse( + Scratch.Cast.toString(args.JSON) + ); + webhooks[args.WEBHOOK].TYPE = args.TYPE; + } catch (error) { + return; + } + } + postData(args) { + try { + Scratch.fetch(webhooks[args.WEBHOOK].URL, { + method: "POST", + headers: { + "Content-type": webhooks[args.WEBHOOK].TYPE, + }, + body: + webhooks[args.WEBHOOK].TYPE === "application/json" + ? JSON.stringify(webhooks[args.WEBHOOK].DATA) + : toForm(webhooks[args.WEBHOOK].DATA), + }); + } catch (error) { + return; + } + } + + _webhookMenu() { + if (Object.keys(webhooks).length > 0) { + return Object.keys(webhooks); + } else { + return [""]; + } + } + } + + Scratch.extensions.register(new Webhooks()); +})(Scratch); diff --git a/extensions/extensions.json b/extensions/extensions.json index 9027c00ac9..873ddb6e72 100644 --- a/extensions/extensions.json +++ b/extensions/extensions.json @@ -88,9 +88,9 @@ "vercte/dictionaries", "godslayerakp/http", "godslayerakp/ws", + "CubesterYT/Webhooks", "Lily/CommentBlocks", "veggiecan/LongmanDictionary", - "CubesterYT/TurboHook", "Alestore/nfcwarp", "steamworks", "itchio", diff --git a/images/CubesterYT/Webhooks.svg b/images/CubesterYT/Webhooks.svg new file mode 100644 index 0000000000..0d9f91f736 --- /dev/null +++ b/images/CubesterYT/Webhooks.svg @@ -0,0 +1,88 @@ + + + + From 7effd946b9aade0435b92db0221ad9dbc9a977ad Mon Sep 17 00:00:00 2001 From: Cubester Date: Fri, 17 Jan 2025 18:38:47 -0500 Subject: [PATCH 02/14] URL Validation (Protection against inserting an invalid URL) --- extensions/CubesterYT/Webhooks.js | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/extensions/CubesterYT/Webhooks.js b/extensions/CubesterYT/Webhooks.js index 90730504ab..c133a2bb53 100644 --- a/extensions/CubesterYT/Webhooks.js +++ b/extensions/CubesterYT/Webhooks.js @@ -25,6 +25,15 @@ setupStorage(); Scratch.vm.runtime.on("PROJECT_LOADED", setupStorage); + function isURLValid(string) { + try { + const url = new URL(string); + return url.protocol === "http:" || url.protocol === "https:"; + } catch (error) { + return false; + } + } + function toForm(data) { const parts = []; const process = (name, value) => { @@ -147,7 +156,20 @@ ); } } while (Object.keys(webhooks).includes(name)); - let URL = prompt(Scratch.translate("Enter Webhook URL:")); + let URL; + do { + URL = prompt(Scratch.translate("Enter Webhook URL:")); + if (URL === null) { + return; + } + if (!isURLValid(URL)) { + alert( + Scratch.translate( + "Invalid URL! Please make sure you provide a valid URL." + ) + ); + } + } while (!isURLValid(URL)); webhooks[name] = { URL, DATA: {}, TYPE: "application/json" }; hideFromPalette = false; Scratch.vm.extensionManager.refreshBlocks(); From 76487e3f7c5e4d08b1ff210fc4d371e479d39820 Mon Sep 17 00:00:00 2001 From: Cubester Date: Fri, 17 Jan 2025 18:57:07 -0500 Subject: [PATCH 03/14] Icon --- extensions/CubesterYT/Webhooks.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extensions/CubesterYT/Webhooks.js b/extensions/CubesterYT/Webhooks.js index c133a2bb53..f70da5e1da 100644 --- a/extensions/CubesterYT/Webhooks.js +++ b/extensions/CubesterYT/Webhooks.js @@ -9,7 +9,8 @@ (function (Scratch) { "use strict"; - const icon = ""; + const icon = + "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB3aWR0aD0iNjQiCiAgIGhlaWdodD0iNjQiCiAgIHZpZXdCb3g9IjAgMCAxNi45MzMzMzMgMTYuOTMzMzMzIgogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmcxIgogICB4bWw6c3BhY2U9InByZXNlcnZlIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIxLjQgKDg2YThhZDcsIDIwMjQtMTAtMTEpIgogICBzb2RpcG9kaTpkb2NuYW1lPSJXZWJob29rc0ljb24uc3ZnIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0ibmFtZWR2aWV3MSIKICAgICBwYWdlY29sb3I9IiM1MDUwNTAiCiAgICAgYm9yZGVyY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0iMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlY2hlY2tlcmJvYXJkPSIxIgogICAgIGlua3NjYXBlOmRlc2tjb2xvcj0iIzUwNTA1MCIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6em9vbT0iOC4xOCIKICAgICBpbmtzY2FwZTpjeD0iMzIuMjczODM5IgogICAgIGlua3NjYXBlOmN5PSIzMy4wNjg0NiIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE5MjAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTAxNyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIiAvPjxkZWZzCiAgICAgaWQ9ImRlZnMxIiAvPjxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIj48Y2lyY2xlCiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6I2M3M2E2MztzdHJva2Utd2lkdGg6MC4yNzA0NDc7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICBpZD0icGF0aDIiCiAgICAgICBjeD0iOC40NjY2NjYyIgogICAgICAgY3k9IjguNDY2NjY2MiIKICAgICAgIHI9IjguNDY2NjY2MiIgLz48cGF0aAogICAgICAgZmlsbD0iIzAwMDAwMCIKICAgICAgIGQ9Ik0gOC4yMTUyMjc2LDIuNzMyNjkgSCA4LjIwMDg5MzkgTCA4LjA1NzU0NDYsMi43NjEzNTc0IFEgNy41ODQ0OTIzLDIuODE4NzAzMyA3LjEzMjk0MjcsMy4wMjY1NTQzIDYuNjgxMzkyMSwzLjIzNDQwOTggNi4zMzczNTMxLDMuNTc4NDQ4NyA1Ljc0OTYyMTEsNC4xMDg4NDE0IDUuNTIwMjYyOSw0Ljg4MjkyNzIgNS4zOTEyNDg0LDUuMzEyOTc1IDUuNDA1NTgzMyw1Ljc4NjAyNzQgNS40MTk5MTcsNi4yNTkwNzk3IDUuNTc3NjAyMiw2LjY4OTEyNzYgNS44MjEyOTYzLDcuMzM0MTk5OSA2LjMyMzAxODMsNy44MDcyNTIzIEwgNi41MDkzNzMxLDcuOTc5MjcxMiA1LjMxOTU3MzIsOS45MTQ0ODYxIFEgNC45NDY4NjU3LDkuOTAwMTUyMSA0LjY3NDUwMiwxMC4wMTQ4MzMgcSAtMC40MzAwNDc5LDAuMTg2MzU1IC0wLjY0NTA3MTMsMC41NzMzOTggLTAuMTAwMzQ3LDAuMjE1MDI0IC0wLjEyOTAxNDUsMC40NDQzODIgLTAuMDI4NjY3LDAuMjI5MzU5IDAuMDI4NjY4LDAuNDU4NzE4IDAuMTE0Njc5NiwwLjQzMDA0NyAwLjQ3MzA1MjMsMC42ODgwNzYgMC4yMTUwMjQ1LDAuMTQzMzUgMC40NzMwNTIzLDAuMjA3ODU3IDAuMjU4MDI5LDAuMDY0NTEgMC41MTYwNTc5LDAuMDI4NjcgMC4yNTgwMjksLTAuMDM1ODQgMC40OTQ1NTUxLC0wLjE3OTE4NSAwLjIzNjUyNjIsLTAuMTQzMzUgMC4zOTQyMTAzLC0wLjM1ODM3NCAwLjE3MjAxOSwtMC4yNDM2OTMgMC4yMDc4NTY2LC0wLjU1OTA2MSAwLjAzNTg0LC0wLjMxNTM3IC0wLjA3ODg0MSwtMC41ODc3MzQgLTAuMDE0MzM0LC0wLjA3MTY4IC0wLjEwMDM0NywtMC4yMDA2ODggTCA2LjI2NTY3OSwxMC40NDQ4NzUgNy45NTcyMDA5LDcuNjkyNTcwNCBRIDguMDQzMjE0Miw3LjU2MzU1NTkgOC4wNzE4ODA1LDcuNDkxODgwOCBMIDcuOTI4NTMxMiw3LjQ0ODg3OTYgUSA3Ljc5OTUxNjgsNy40MjAyMTIyIDcuNzQyMTc2NCw3LjM5MTU0NDcgNy40MTI0NzMzLDcuMjQ4MTk1NCA3LjE0NzI3NzUsNi45OTczMzQ0IDYuODgyMDgwNiw2Ljc0NjQ3MzUgNi43Mzg3MzEzLDYuNDMxMTA1MiA2LjQ5NTAzODMsNS45MTUwNDczIDYuNjA5NzE2OSw1LjM1NTk4NSA2LjY2NzA1MTcsNS4wMjYyODIgNi44NTM0MTEsNC43Mzk1ODM0IDcuMDM5NzY0Nyw0LjQ1Mjg4NDggNy4yOTc3OTM3LDQuMjUyMTk2MiA3LjgyODE4NjQsMy44NjUxNTI4IDguNDczMjU3NywzLjg2NTE1MjggOC44NjAzMDExLDMuODUwODE5MSA5LjIyNTg0MTcsNC4wMDEzMzQxIDkuNTkxMzgyMyw0LjE1MTg1MTQgOS44NjM3NDYxLDQuNDM4NTUgcSAwLjI0MzY5MjksMC4yMjkzNTgyIDAuMzc5ODc0OSwwLjU1MTg5NDQgMC4xMzYxODEsMC4zMjI1MzYxIDAuMTUwNTE3LDAuNjUyMjM5MiAwLDAuMjQzNjk0MSAtMC4wODYwMSwwLjYwMjA2NjggbCAxLjAwMzQ0NSwwLjI3MjM2MzggMC4xMTQ2NzksMC4wMTQzMzQgUSAxMS42MjY5MzgsNS45MTUwNDYyIDExLjUyNjU5Niw1LjI5ODY0NDYgMTEuNDY5MjYxLDQuODI1NTkyMyAxMS4yNDcwNjYsNC4zODgzNzY1IDExLjAyNDg3NCwzLjk1MTE2MDYgMTAuNjgwODM3LDMuNjIxNDU3NiAxMC4wNzg3NjksMy4wMTkzOTA4IDkuMjA0MzQsMi44MTg3MDIyIDkuMTE4MzI2NywyLjc5MDAzNDggOC45NDYzMTExLDIuNzYxMzU2MyBMIDguNzQ1NjIxNCwyLjczMjY4ODkgWiBtIDAuMjU4MDI3OSwxLjc3NzUzMDggcSAtMC4yNDM2OTMxLDAgLTAuNDg3Mzg3MiwwLjEwMDM0NyBRIDcuNzQyMTc0Miw0LjcxMDkxNDggNy41NDg2NTI1LDQuOTA0NDM0MyA3LjM1NTEzMTksNS4wOTc5NTUgNy4yNjkxMjE4LDUuMzU1OTgzOSA3LjE1NDQ0MjIsNS42NDI2ODI1IDcuMjExNzg2OCw1Ljk4NjcyMTQgcSAwLjA0MzAwMSwwLjI1ODAyNzkgMC4yMDA2ODg1LDAuNDg3Mzg3MiAwLjE1NzY4NDEsMC4yMjkzNTkzIDAuNDAxMzc4MywwLjM1ODM3MzggMC4zNDQwMzc4LDAuMjE1MDIzNCAwLjgwMjc1NTMsMC4xODYzNTI2IDAuMDQzMDAxLDAuMDU3MzQ2IDAuMDcxNjgsMC4xMTQ2ODA4IEwgMTAuMjkzOCw5Ljg3MTQ4NiBxIDAuMDQzLDAuMDg2MDEzIDAuMDg2MDEsMC4xMjkwMTQgMC4zODcwNDQsLTAuMzcyNzA3IDAuODM4NTk0LC0wLjUwODg4OTQgMC40NTE1NTEsLTAuMTM2MTgxNCAwLjkzMTc3LC0wLjA1MDE3MyAwLjQ4MDIyLDAuMDg2MDEzIDAuODM4NTk0LDAuMzcyNzA3NiAwLjQ1ODcxNywwLjM1ODM3MjggMC42MjM1NywwLjg4MTU5ODggMC4xNjQ4NTEsMC41MjMyMjUgMC4wMDcxLDEuMDUzNjE3IC0wLjExNDY4LDAuNDAxMzc4IC0wLjQwODU0NSwwLjcxNjc0NyAtMC4yOTM4NjcsMC4zMTUzNjggLTAuNjk1MjQ1LDAuNDczMDUyIC0wLjQ0NDM4MywwLjE4NjM1NCAtMC45NTMyNzMsMC4xMjE4NDcgLTAuNTA4ODksLTAuMDY0NTEgLTAuOTEwMjY3LC0wLjM1MTIwNiAtMC4wNTczNCwtMC4wNDMgLTAuMTg2MzU0LC0wLjE0MzM0OSBsIC0wLjA3MTY4LC0wLjA4NjAxIHEgLTAuMDU3MzQsMC4wNDMgLTAuMTU3Njg1LDAuMTQzMzUgbCAtMC42NzM3Mzk5LDAuNjU5NDA2IHEgMC4zMjk3MDMsMC4zMjk3MDQgMC43NDU0MTQ5LDAuNTUxODk0IDAuNDE1NzEzLDAuMjIyMTkyIDAuODc0NDMsMC4zMDgyMDIgbCAwLjMxNTM2OSwwLjA1NzM1IGggMC41NTkwNjIgbCAwLjQwMTM3OCwtMC4wNzE2OCBxIDAuOTE3NDM1LC0wLjE4NjM1NCAxLjU3Njg0MiwtMC44NjAwOTYgMC4zMTUzNjksLTAuMzE1MzY4IDAuNTIzMjI1LC0wLjcyMzkxNCAwLjIwNzg1NywtMC40MDg1NDUgMC4yNzk1MzEsLTAuODUyOTI4IDAuMDcxNjgsLTAuNTE2MDU3IC0wLjAyODY3LC0xLjAyNDk0OCBRIDE0LjcwODkzOSwxMC4xNTgxODEgMTQuNDUwOTE0LDkuNzQyNDY4MyAxNC4xOTI4ODUsOS4zMjY3NTUyIDEzLjgyMDE3Niw5LjAxMTM4NyAxMy40NDc0NjksOC42OTYwMTc3IDEzLjAwMzA4Niw4LjUwOTY2MzkgMTIuNTE1Njk4LDguMzA4OTc1MyAxMS45OTI0NzMsOC4yODAzMDU3IDExLjQ2OTI0OCw4LjI1MTYzODMgMTAuOTY3NTI1LDguMzgwNjUyNyBMIDEwLjcyMzgzMiw4LjQ1MjMzMjMgOS41NjI3MDM5LDYuNDg4NDQ2NyBRIDkuNzQ5MDU3Nyw2LjIxNjA4MjkgOS43OTIwNjMyLDUuOTU4MDU0IDkuODYzNzMxOCw1LjQ5OTMzNjUgOS42MDU3MDg0LDUuMDk3OTU4MyA5LjM3NjM1MDIsNC43Mzk1ODU2IDguOTc0OTcxOSw0LjU5NjIzNjMgOC43MzEyNzc4LDQuNTEwMjIzIDguNDczMjQ4OSw0LjUxMDIyMyBaIE0gNC40MzA4MDU3LDguMjk0NjQxNiBRIDMuNTk5MzgwNiw4LjQ4MDk5NjUgMi45OTczMTI3LDkuMDU0MzkzNiAyLjMyMzU3MTgsOS42ODUxMzAxIDIuMTIyODc3OCwxMC41NTk1NjEgbCAtMC4wNTczMTMsMC4zNDQwMzggdiAwLjUzMDM5MiBsIDAuMDI4NzExLDAuMTU3Njg0IHEgMC4wMjg3MTIsMC4xODYzNTUgMC4wNTczMTMsMC4yODY2OTkgMC4xMDAzMzYsMC40NDQzODMgMC4zNTEyMDE0LDAuODQ1NzYyIDAuMjUwODYyMSwwLjQwMTM3NyAwLjYwOTIzNDgsMC43MDI0MTEgMC43MTY3NDY1LDAuNTg3NzMyIDEuNjQ4NTE3NCwwLjcwMjQxMSAwLjU0NDcyNjQsMC4wNTczNCAxLjA4OTQ1NCwtMC4wNjQ1MSAwLjU0NDcyNzUsLTAuMTIxODQ3IDEuMDAzNDQ1LC0wLjQwODU0NSAwLjc1OTc1MDksLTAuNDg3Mzg4IDEuMTE4MTI0NywtMS4zMDQ0OCAwLjEwMDM0NywtMC4yNDM2OTMgMC4yMDA2ODg2LC0wLjY0NTA3MSAwLjA4NjAxMywtMC4wMTQzMyAwLjI1ODAyODksMCBsIDEuNzkxODY2NCwwLjAyODY3IHEgMC4yMDA2ODgsMCAwLjI4NjY5NywwLjAxNDMzIDAuMTU3Njg0LDAuMjg2NyAwLjM1ODM3NCwwLjQ0NDM4NCAwLjIwMDY4OSwwLjE1NzY4MyAwLjQ1MTU1MSwwLjIyOTM1OCAwLjI1MDg2MSwwLjA3MTY4IDAuNTA4ODg5LDAuMDU3MzQgMC40MDEzNzksLTAuMDQzIDAuNzE2NzQ2LC0wLjI4NjY5NyAwLjM4NzA0MywtMC4zMDEwMzUgMC40NTg3MTksLTAuNzc0MDg3IDAuMDI4NjcsLTAuMjQzNjkzIC0wLjAyMTUxLC0wLjQ3MzA1MyAtMC4wNTAxNywtMC4yMjkzNTggLTAuMTkzNTIyLC0wLjQzMDA0OCAtMC4yMjkzNTgsLTAuMzE1MzY4IC0wLjU4NzczMiwtMC40NTg3MTcgLTAuMjQzNjk0LC0wLjEwMDM0NzEgLTAuNTA4ODksLTAuMDkzMTc1IC0wLjI2NTE5NiwwLjAwNzE1IC0wLjUwODg5LDAuMTA3NTA5IC0wLjQwMTM3NywwLjE3MjAxOSAtMC42MTY0MDIsMC41MzAzOTEgbCAtMC4wNDMsMC4wODYwMSBxIC0wLjIwMDY4OSwwIC0wLjYwMjA2NzIsLTAuMDE0MzMgTCA4LjMwMTI2NjEsMTAuNjU5OTA3IFEgOC4wODYyNDI3LDEwLjY0NTU3NyA3LjY4NDg2NDUsMTAuNjQ1NTc3IEwgNi45NjgxMTgsMTAuNjMxMjQ3IDcuMDExMTE5LDEwLjg3NDk0IFEgNy4xMjU4MDIzLDExLjQ5MTMzIDYuODI0NzY4OSwxMi4wMzYwNTggNi42MjQwODAzLDEyLjQyMzEgNi4yNTEzNzE3LDEyLjY4MTEyOSA1Ljg3ODY2MzEsMTIuOTM5MTU4IDUuNDM0MjgwNCwxMi45OTY0OTggNC45MzI1NTg0LDEzLjA4MjUxMSA0LjQzMDgzNTQsMTIuODg4OTg5IDMuOTI5MTEzNCwxMi42OTU0NjggMy42MTM3NDUyLDEyLjI3OTc1NCAzLjIxMjM2NjksMTEuNzc4MDMyIDMuMjI2NzAxOCwxMS4xNDcyOTYgMy4yNDEwMzU1LDEwLjYxNjkwMyAzLjU1NjQwNDgsMTAuMTU4MTg2IDMuNzQyNzU5Niw5Ljg4NTgyMDggNC4wMTUxMjIzLDkuNjk5NDY4MiA0LjI4NzQ4NjEsOS41MTMxMTM0IDQuNjAyODU0Myw5LjQyNzEwMzMgbCAwLjEyOTAxNDUsLTAuMDQzMDAxIHoiCiAgICAgICBpZD0icGF0aDEiCiAgICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO3N0cm9rZS13aWR0aDowLjAxNDMzNDkiIC8+PC9nPjwvc3ZnPgo="; let hideFromPalette = true; let webhooks; From c568479b278f036d32b8f8b601ba6341a3cd8e26 Mon Sep 17 00:00:00 2001 From: Cubester Date: Fri, 17 Jan 2025 19:00:48 -0500 Subject: [PATCH 04/14] Clean this up --- extensions/CubesterYT/Webhooks.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/extensions/CubesterYT/Webhooks.js b/extensions/CubesterYT/Webhooks.js index f70da5e1da..46d1292444 100644 --- a/extensions/CubesterYT/Webhooks.js +++ b/extensions/CubesterYT/Webhooks.js @@ -12,19 +12,20 @@ const icon = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB3aWR0aD0iNjQiCiAgIGhlaWdodD0iNjQiCiAgIHZpZXdCb3g9IjAgMCAxNi45MzMzMzMgMTYuOTMzMzMzIgogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmcxIgogICB4bWw6c3BhY2U9InByZXNlcnZlIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIxLjQgKDg2YThhZDcsIDIwMjQtMTAtMTEpIgogICBzb2RpcG9kaTpkb2NuYW1lPSJXZWJob29rc0ljb24uc3ZnIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0ibmFtZWR2aWV3MSIKICAgICBwYWdlY29sb3I9IiM1MDUwNTAiCiAgICAgYm9yZGVyY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0iMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlY2hlY2tlcmJvYXJkPSIxIgogICAgIGlua3NjYXBlOmRlc2tjb2xvcj0iIzUwNTA1MCIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6em9vbT0iOC4xOCIKICAgICBpbmtzY2FwZTpjeD0iMzIuMjczODM5IgogICAgIGlua3NjYXBlOmN5PSIzMy4wNjg0NiIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE5MjAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTAxNyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIiAvPjxkZWZzCiAgICAgaWQ9ImRlZnMxIiAvPjxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIj48Y2lyY2xlCiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6I2M3M2E2MztzdHJva2Utd2lkdGg6MC4yNzA0NDc7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICBpZD0icGF0aDIiCiAgICAgICBjeD0iOC40NjY2NjYyIgogICAgICAgY3k9IjguNDY2NjY2MiIKICAgICAgIHI9IjguNDY2NjY2MiIgLz48cGF0aAogICAgICAgZmlsbD0iIzAwMDAwMCIKICAgICAgIGQ9Ik0gOC4yMTUyMjc2LDIuNzMyNjkgSCA4LjIwMDg5MzkgTCA4LjA1NzU0NDYsMi43NjEzNTc0IFEgNy41ODQ0OTIzLDIuODE4NzAzMyA3LjEzMjk0MjcsMy4wMjY1NTQzIDYuNjgxMzkyMSwzLjIzNDQwOTggNi4zMzczNTMxLDMuNTc4NDQ4NyA1Ljc0OTYyMTEsNC4xMDg4NDE0IDUuNTIwMjYyOSw0Ljg4MjkyNzIgNS4zOTEyNDg0LDUuMzEyOTc1IDUuNDA1NTgzMyw1Ljc4NjAyNzQgNS40MTk5MTcsNi4yNTkwNzk3IDUuNTc3NjAyMiw2LjY4OTEyNzYgNS44MjEyOTYzLDcuMzM0MTk5OSA2LjMyMzAxODMsNy44MDcyNTIzIEwgNi41MDkzNzMxLDcuOTc5MjcxMiA1LjMxOTU3MzIsOS45MTQ0ODYxIFEgNC45NDY4NjU3LDkuOTAwMTUyMSA0LjY3NDUwMiwxMC4wMTQ4MzMgcSAtMC40MzAwNDc5LDAuMTg2MzU1IC0wLjY0NTA3MTMsMC41NzMzOTggLTAuMTAwMzQ3LDAuMjE1MDI0IC0wLjEyOTAxNDUsMC40NDQzODIgLTAuMDI4NjY3LDAuMjI5MzU5IDAuMDI4NjY4LDAuNDU4NzE4IDAuMTE0Njc5NiwwLjQzMDA0NyAwLjQ3MzA1MjMsMC42ODgwNzYgMC4yMTUwMjQ1LDAuMTQzMzUgMC40NzMwNTIzLDAuMjA3ODU3IDAuMjU4MDI5LDAuMDY0NTEgMC41MTYwNTc5LDAuMDI4NjcgMC4yNTgwMjksLTAuMDM1ODQgMC40OTQ1NTUxLC0wLjE3OTE4NSAwLjIzNjUyNjIsLTAuMTQzMzUgMC4zOTQyMTAzLC0wLjM1ODM3NCAwLjE3MjAxOSwtMC4yNDM2OTMgMC4yMDc4NTY2LC0wLjU1OTA2MSAwLjAzNTg0LC0wLjMxNTM3IC0wLjA3ODg0MSwtMC41ODc3MzQgLTAuMDE0MzM0LC0wLjA3MTY4IC0wLjEwMDM0NywtMC4yMDA2ODggTCA2LjI2NTY3OSwxMC40NDQ4NzUgNy45NTcyMDA5LDcuNjkyNTcwNCBRIDguMDQzMjE0Miw3LjU2MzU1NTkgOC4wNzE4ODA1LDcuNDkxODgwOCBMIDcuOTI4NTMxMiw3LjQ0ODg3OTYgUSA3Ljc5OTUxNjgsNy40MjAyMTIyIDcuNzQyMTc2NCw3LjM5MTU0NDcgNy40MTI0NzMzLDcuMjQ4MTk1NCA3LjE0NzI3NzUsNi45OTczMzQ0IDYuODgyMDgwNiw2Ljc0NjQ3MzUgNi43Mzg3MzEzLDYuNDMxMTA1MiA2LjQ5NTAzODMsNS45MTUwNDczIDYuNjA5NzE2OSw1LjM1NTk4NSA2LjY2NzA1MTcsNS4wMjYyODIgNi44NTM0MTEsNC43Mzk1ODM0IDcuMDM5NzY0Nyw0LjQ1Mjg4NDggNy4yOTc3OTM3LDQuMjUyMTk2MiA3LjgyODE4NjQsMy44NjUxNTI4IDguNDczMjU3NywzLjg2NTE1MjggOC44NjAzMDExLDMuODUwODE5MSA5LjIyNTg0MTcsNC4wMDEzMzQxIDkuNTkxMzgyMyw0LjE1MTg1MTQgOS44NjM3NDYxLDQuNDM4NTUgcSAwLjI0MzY5MjksMC4yMjkzNTgyIDAuMzc5ODc0OSwwLjU1MTg5NDQgMC4xMzYxODEsMC4zMjI1MzYxIDAuMTUwNTE3LDAuNjUyMjM5MiAwLDAuMjQzNjk0MSAtMC4wODYwMSwwLjYwMjA2NjggbCAxLjAwMzQ0NSwwLjI3MjM2MzggMC4xMTQ2NzksMC4wMTQzMzQgUSAxMS42MjY5MzgsNS45MTUwNDYyIDExLjUyNjU5Niw1LjI5ODY0NDYgMTEuNDY5MjYxLDQuODI1NTkyMyAxMS4yNDcwNjYsNC4zODgzNzY1IDExLjAyNDg3NCwzLjk1MTE2MDYgMTAuNjgwODM3LDMuNjIxNDU3NiAxMC4wNzg3NjksMy4wMTkzOTA4IDkuMjA0MzQsMi44MTg3MDIyIDkuMTE4MzI2NywyLjc5MDAzNDggOC45NDYzMTExLDIuNzYxMzU2MyBMIDguNzQ1NjIxNCwyLjczMjY4ODkgWiBtIDAuMjU4MDI3OSwxLjc3NzUzMDggcSAtMC4yNDM2OTMxLDAgLTAuNDg3Mzg3MiwwLjEwMDM0NyBRIDcuNzQyMTc0Miw0LjcxMDkxNDggNy41NDg2NTI1LDQuOTA0NDM0MyA3LjM1NTEzMTksNS4wOTc5NTUgNy4yNjkxMjE4LDUuMzU1OTgzOSA3LjE1NDQ0MjIsNS42NDI2ODI1IDcuMjExNzg2OCw1Ljk4NjcyMTQgcSAwLjA0MzAwMSwwLjI1ODAyNzkgMC4yMDA2ODg1LDAuNDg3Mzg3MiAwLjE1NzY4NDEsMC4yMjkzNTkzIDAuNDAxMzc4MywwLjM1ODM3MzggMC4zNDQwMzc4LDAuMjE1MDIzNCAwLjgwMjc1NTMsMC4xODYzNTI2IDAuMDQzMDAxLDAuMDU3MzQ2IDAuMDcxNjgsMC4xMTQ2ODA4IEwgMTAuMjkzOCw5Ljg3MTQ4NiBxIDAuMDQzLDAuMDg2MDEzIDAuMDg2MDEsMC4xMjkwMTQgMC4zODcwNDQsLTAuMzcyNzA3IDAuODM4NTk0LC0wLjUwODg4OTQgMC40NTE1NTEsLTAuMTM2MTgxNCAwLjkzMTc3LC0wLjA1MDE3MyAwLjQ4MDIyLDAuMDg2MDEzIDAuODM4NTk0LDAuMzcyNzA3NiAwLjQ1ODcxNywwLjM1ODM3MjggMC42MjM1NywwLjg4MTU5ODggMC4xNjQ4NTEsMC41MjMyMjUgMC4wMDcxLDEuMDUzNjE3IC0wLjExNDY4LDAuNDAxMzc4IC0wLjQwODU0NSwwLjcxNjc0NyAtMC4yOTM4NjcsMC4zMTUzNjggLTAuNjk1MjQ1LDAuNDczMDUyIC0wLjQ0NDM4MywwLjE4NjM1NCAtMC45NTMyNzMsMC4xMjE4NDcgLTAuNTA4ODksLTAuMDY0NTEgLTAuOTEwMjY3LC0wLjM1MTIwNiAtMC4wNTczNCwtMC4wNDMgLTAuMTg2MzU0LC0wLjE0MzM0OSBsIC0wLjA3MTY4LC0wLjA4NjAxIHEgLTAuMDU3MzQsMC4wNDMgLTAuMTU3Njg1LDAuMTQzMzUgbCAtMC42NzM3Mzk5LDAuNjU5NDA2IHEgMC4zMjk3MDMsMC4zMjk3MDQgMC43NDU0MTQ5LDAuNTUxODk0IDAuNDE1NzEzLDAuMjIyMTkyIDAuODc0NDMsMC4zMDgyMDIgbCAwLjMxNTM2OSwwLjA1NzM1IGggMC41NTkwNjIgbCAwLjQwMTM3OCwtMC4wNzE2OCBxIDAuOTE3NDM1LC0wLjE4NjM1NCAxLjU3Njg0MiwtMC44NjAwOTYgMC4zMTUzNjksLTAuMzE1MzY4IDAuNTIzMjI1LC0wLjcyMzkxNCAwLjIwNzg1NywtMC40MDg1NDUgMC4yNzk1MzEsLTAuODUyOTI4IDAuMDcxNjgsLTAuNTE2MDU3IC0wLjAyODY3LC0xLjAyNDk0OCBRIDE0LjcwODkzOSwxMC4xNTgxODEgMTQuNDUwOTE0LDkuNzQyNDY4MyAxNC4xOTI4ODUsOS4zMjY3NTUyIDEzLjgyMDE3Niw5LjAxMTM4NyAxMy40NDc0NjksOC42OTYwMTc3IDEzLjAwMzA4Niw4LjUwOTY2MzkgMTIuNTE1Njk4LDguMzA4OTc1MyAxMS45OTI0NzMsOC4yODAzMDU3IDExLjQ2OTI0OCw4LjI1MTYzODMgMTAuOTY3NTI1LDguMzgwNjUyNyBMIDEwLjcyMzgzMiw4LjQ1MjMzMjMgOS41NjI3MDM5LDYuNDg4NDQ2NyBRIDkuNzQ5MDU3Nyw2LjIxNjA4MjkgOS43OTIwNjMyLDUuOTU4MDU0IDkuODYzNzMxOCw1LjQ5OTMzNjUgOS42MDU3MDg0LDUuMDk3OTU4MyA5LjM3NjM1MDIsNC43Mzk1ODU2IDguOTc0OTcxOSw0LjU5NjIzNjMgOC43MzEyNzc4LDQuNTEwMjIzIDguNDczMjQ4OSw0LjUxMDIyMyBaIE0gNC40MzA4MDU3LDguMjk0NjQxNiBRIDMuNTk5MzgwNiw4LjQ4MDk5NjUgMi45OTczMTI3LDkuMDU0MzkzNiAyLjMyMzU3MTgsOS42ODUxMzAxIDIuMTIyODc3OCwxMC41NTk1NjEgbCAtMC4wNTczMTMsMC4zNDQwMzggdiAwLjUzMDM5MiBsIDAuMDI4NzExLDAuMTU3Njg0IHEgMC4wMjg3MTIsMC4xODYzNTUgMC4wNTczMTMsMC4yODY2OTkgMC4xMDAzMzYsMC40NDQzODMgMC4zNTEyMDE0LDAuODQ1NzYyIDAuMjUwODYyMSwwLjQwMTM3NyAwLjYwOTIzNDgsMC43MDI0MTEgMC43MTY3NDY1LDAuNTg3NzMyIDEuNjQ4NTE3NCwwLjcwMjQxMSAwLjU0NDcyNjQsMC4wNTczNCAxLjA4OTQ1NCwtMC4wNjQ1MSAwLjU0NDcyNzUsLTAuMTIxODQ3IDEuMDAzNDQ1LC0wLjQwODU0NSAwLjc1OTc1MDksLTAuNDg3Mzg4IDEuMTE4MTI0NywtMS4zMDQ0OCAwLjEwMDM0NywtMC4yNDM2OTMgMC4yMDA2ODg2LC0wLjY0NTA3MSAwLjA4NjAxMywtMC4wMTQzMyAwLjI1ODAyODksMCBsIDEuNzkxODY2NCwwLjAyODY3IHEgMC4yMDA2ODgsMCAwLjI4NjY5NywwLjAxNDMzIDAuMTU3Njg0LDAuMjg2NyAwLjM1ODM3NCwwLjQ0NDM4NCAwLjIwMDY4OSwwLjE1NzY4MyAwLjQ1MTU1MSwwLjIyOTM1OCAwLjI1MDg2MSwwLjA3MTY4IDAuNTA4ODg5LDAuMDU3MzQgMC40MDEzNzksLTAuMDQzIDAuNzE2NzQ2LC0wLjI4NjY5NyAwLjM4NzA0MywtMC4zMDEwMzUgMC40NTg3MTksLTAuNzc0MDg3IDAuMDI4NjcsLTAuMjQzNjkzIC0wLjAyMTUxLC0wLjQ3MzA1MyAtMC4wNTAxNywtMC4yMjkzNTggLTAuMTkzNTIyLC0wLjQzMDA0OCAtMC4yMjkzNTgsLTAuMzE1MzY4IC0wLjU4NzczMiwtMC40NTg3MTcgLTAuMjQzNjk0LC0wLjEwMDM0NzEgLTAuNTA4ODksLTAuMDkzMTc1IC0wLjI2NTE5NiwwLjAwNzE1IC0wLjUwODg5LDAuMTA3NTA5IC0wLjQwMTM3NywwLjE3MjAxOSAtMC42MTY0MDIsMC41MzAzOTEgbCAtMC4wNDMsMC4wODYwMSBxIC0wLjIwMDY4OSwwIC0wLjYwMjA2NzIsLTAuMDE0MzMgTCA4LjMwMTI2NjEsMTAuNjU5OTA3IFEgOC4wODYyNDI3LDEwLjY0NTU3NyA3LjY4NDg2NDUsMTAuNjQ1NTc3IEwgNi45NjgxMTgsMTAuNjMxMjQ3IDcuMDExMTE5LDEwLjg3NDk0IFEgNy4xMjU4MDIzLDExLjQ5MTMzIDYuODI0NzY4OSwxMi4wMzYwNTggNi42MjQwODAzLDEyLjQyMzEgNi4yNTEzNzE3LDEyLjY4MTEyOSA1Ljg3ODY2MzEsMTIuOTM5MTU4IDUuNDM0MjgwNCwxMi45OTY0OTggNC45MzI1NTg0LDEzLjA4MjUxMSA0LjQzMDgzNTQsMTIuODg4OTg5IDMuOTI5MTEzNCwxMi42OTU0NjggMy42MTM3NDUyLDEyLjI3OTc1NCAzLjIxMjM2NjksMTEuNzc4MDMyIDMuMjI2NzAxOCwxMS4xNDcyOTYgMy4yNDEwMzU1LDEwLjYxNjkwMyAzLjU1NjQwNDgsMTAuMTU4MTg2IDMuNzQyNzU5Niw5Ljg4NTgyMDggNC4wMTUxMjIzLDkuNjk5NDY4MiA0LjI4NzQ4NjEsOS41MTMxMTM0IDQuNjAyODU0Myw5LjQyNzEwMzMgbCAwLjEyOTAxNDUsLTAuMDQzMDAxIHoiCiAgICAgICBpZD0icGF0aDEiCiAgICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO3N0cm9rZS13aWR0aDowLjAxNDMzNDkiIC8+PC9nPjwvc3ZnPgo="; + const runtime = Scratch.vm.runtime; + let hideFromPalette = true; let webhooks; function setupStorage() { - if (!Scratch.vm.runtime.extensionStorage["cubesterWebhooks"]) { - Scratch.vm.runtime.extensionStorage["cubesterWebhooks"] = - Object.create(null); - Scratch.vm.runtime.extensionStorage["cubesterWebhooks"].webhooks = + if (!runtime.extensionStorage["cubesterWebhooks"]) { + runtime.extensionStorage["cubesterWebhooks"] = Object.create(null); + runtime.extensionStorage["cubesterWebhooks"].webhooks = Object.create(null); } - webhooks = Scratch.vm.runtime.extensionStorage["cubesterWebhooks"].webhooks; + webhooks = runtime.extensionStorage["cubesterWebhooks"].webhooks; } setupStorage(); - Scratch.vm.runtime.on("PROJECT_LOADED", setupStorage); + runtime.on("PROJECT_LOADED", setupStorage); function isURLValid(string) { try { From fd23b2330452662e7ebe02749bd7c04fdd82a782 Mon Sep 17 00:00:00 2001 From: SharkPool <139097378+SharkPool-SP@users.noreply.github.com> Date: Fri, 17 Jan 2025 20:52:24 -0800 Subject: [PATCH 05/14] Webhooks.js -- dont allow empty string names --- extensions/CubesterYT/Webhooks.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/CubesterYT/Webhooks.js b/extensions/CubesterYT/Webhooks.js index 46d1292444..e6562c194a 100644 --- a/extensions/CubesterYT/Webhooks.js +++ b/extensions/CubesterYT/Webhooks.js @@ -147,7 +147,7 @@ let name; do { name = prompt(Scratch.translate("Enter Webhook name:")); - if (name === null) { + if (name === null || name === "") { return; } if (Object.keys(webhooks).includes(name)) { From a61f3dd11dc369be1884f4b192ddfb48fd486e3d Mon Sep 17 00:00:00 2001 From: Cubester Date: Sat, 18 Jan 2025 16:11:20 -0500 Subject: [PATCH 06/14] This is the proper way --- extensions/CubesterYT/Webhooks.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/extensions/CubesterYT/Webhooks.js b/extensions/CubesterYT/Webhooks.js index e6562c194a..9667b268e8 100644 --- a/extensions/CubesterYT/Webhooks.js +++ b/extensions/CubesterYT/Webhooks.js @@ -147,9 +147,16 @@ let name; do { name = prompt(Scratch.translate("Enter Webhook name:")); - if (name === null || name === "") { + if (name === null) { return; } + if (name === "") { + alert( + Scratch.translate( + "Please enter a name with at least one character!" + ) + ); + } if (Object.keys(webhooks).includes(name)) { alert( Scratch.translate( @@ -157,7 +164,7 @@ ) ); } - } while (Object.keys(webhooks).includes(name)); + } while (Object.keys(webhooks).includes(name) || name === ""); let URL; do { URL = prompt(Scratch.translate("Enter Webhook URL:")); From ea1538999ae89a33ab8daa50425903c609bf593b Mon Sep 17 00:00:00 2001 From: Cubester Date: Sat, 18 Jan 2025 16:40:17 -0500 Subject: [PATCH 07/14] Just to be safe --- extensions/CubesterYT/Webhooks.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/CubesterYT/Webhooks.js b/extensions/CubesterYT/Webhooks.js index 9667b268e8..df8ae860b3 100644 --- a/extensions/CubesterYT/Webhooks.js +++ b/extensions/CubesterYT/Webhooks.js @@ -201,8 +201,8 @@ delete webhooks[name]; if (Object.keys(webhooks).length === 0) { hideFromPalette = true; - Scratch.vm.extensionManager.refreshBlocks(); } + Scratch.vm.extensionManager.refreshBlocks(); } data(args) { try { From 50462c6ee24c0802258d0e07bea0aac312b679eb Mon Sep 17 00:00:00 2001 From: Cubester Date: Sat, 18 Jan 2025 17:18:33 -0500 Subject: [PATCH 08/14] Monkey discovers how to make :fire: --- extensions/CubesterYT/Webhooks.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/CubesterYT/Webhooks.js b/extensions/CubesterYT/Webhooks.js index df8ae860b3..f7223c49d5 100644 --- a/extensions/CubesterYT/Webhooks.js +++ b/extensions/CubesterYT/Webhooks.js @@ -181,7 +181,7 @@ } while (!isURLValid(URL)); webhooks[name] = { URL, DATA: {}, TYPE: "application/json" }; hideFromPalette = false; - Scratch.vm.extensionManager.refreshBlocks(); + Scratch.vm.extensionManager.refreshBlocks("cubesterWebhooks"); } deleteWebhook() { let name; @@ -202,7 +202,7 @@ if (Object.keys(webhooks).length === 0) { hideFromPalette = true; } - Scratch.vm.extensionManager.refreshBlocks(); + Scratch.vm.extensionManager.refreshBlocks("cubesterWebhooks"); } data(args) { try { From 0d171a39aa32a5c28989b0874475d24a4712285b Mon Sep 17 00:00:00 2001 From: Cubester Date: Sat, 18 Jan 2025 18:52:23 -0500 Subject: [PATCH 09/14] Adhere to reviewer --- extensions/CubesterYT/Webhooks.js | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/extensions/CubesterYT/Webhooks.js b/extensions/CubesterYT/Webhooks.js index f7223c49d5..6c5d5801ce 100644 --- a/extensions/CubesterYT/Webhooks.js +++ b/extensions/CubesterYT/Webhooks.js @@ -13,6 +13,7 @@ "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB3aWR0aD0iNjQiCiAgIGhlaWdodD0iNjQiCiAgIHZpZXdCb3g9IjAgMCAxNi45MzMzMzMgMTYuOTMzMzMzIgogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmcxIgogICB4bWw6c3BhY2U9InByZXNlcnZlIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIxLjQgKDg2YThhZDcsIDIwMjQtMTAtMTEpIgogICBzb2RpcG9kaTpkb2NuYW1lPSJXZWJob29rc0ljb24uc3ZnIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0ibmFtZWR2aWV3MSIKICAgICBwYWdlY29sb3I9IiM1MDUwNTAiCiAgICAgYm9yZGVyY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0iMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlY2hlY2tlcmJvYXJkPSIxIgogICAgIGlua3NjYXBlOmRlc2tjb2xvcj0iIzUwNTA1MCIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6em9vbT0iOC4xOCIKICAgICBpbmtzY2FwZTpjeD0iMzIuMjczODM5IgogICAgIGlua3NjYXBlOmN5PSIzMy4wNjg0NiIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE5MjAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTAxNyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIiAvPjxkZWZzCiAgICAgaWQ9ImRlZnMxIiAvPjxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIj48Y2lyY2xlCiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6I2M3M2E2MztzdHJva2Utd2lkdGg6MC4yNzA0NDc7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICBpZD0icGF0aDIiCiAgICAgICBjeD0iOC40NjY2NjYyIgogICAgICAgY3k9IjguNDY2NjY2MiIKICAgICAgIHI9IjguNDY2NjY2MiIgLz48cGF0aAogICAgICAgZmlsbD0iIzAwMDAwMCIKICAgICAgIGQ9Ik0gOC4yMTUyMjc2LDIuNzMyNjkgSCA4LjIwMDg5MzkgTCA4LjA1NzU0NDYsMi43NjEzNTc0IFEgNy41ODQ0OTIzLDIuODE4NzAzMyA3LjEzMjk0MjcsMy4wMjY1NTQzIDYuNjgxMzkyMSwzLjIzNDQwOTggNi4zMzczNTMxLDMuNTc4NDQ4NyA1Ljc0OTYyMTEsNC4xMDg4NDE0IDUuNTIwMjYyOSw0Ljg4MjkyNzIgNS4zOTEyNDg0LDUuMzEyOTc1IDUuNDA1NTgzMyw1Ljc4NjAyNzQgNS40MTk5MTcsNi4yNTkwNzk3IDUuNTc3NjAyMiw2LjY4OTEyNzYgNS44MjEyOTYzLDcuMzM0MTk5OSA2LjMyMzAxODMsNy44MDcyNTIzIEwgNi41MDkzNzMxLDcuOTc5MjcxMiA1LjMxOTU3MzIsOS45MTQ0ODYxIFEgNC45NDY4NjU3LDkuOTAwMTUyMSA0LjY3NDUwMiwxMC4wMTQ4MzMgcSAtMC40MzAwNDc5LDAuMTg2MzU1IC0wLjY0NTA3MTMsMC41NzMzOTggLTAuMTAwMzQ3LDAuMjE1MDI0IC0wLjEyOTAxNDUsMC40NDQzODIgLTAuMDI4NjY3LDAuMjI5MzU5IDAuMDI4NjY4LDAuNDU4NzE4IDAuMTE0Njc5NiwwLjQzMDA0NyAwLjQ3MzA1MjMsMC42ODgwNzYgMC4yMTUwMjQ1LDAuMTQzMzUgMC40NzMwNTIzLDAuMjA3ODU3IDAuMjU4MDI5LDAuMDY0NTEgMC41MTYwNTc5LDAuMDI4NjcgMC4yNTgwMjksLTAuMDM1ODQgMC40OTQ1NTUxLC0wLjE3OTE4NSAwLjIzNjUyNjIsLTAuMTQzMzUgMC4zOTQyMTAzLC0wLjM1ODM3NCAwLjE3MjAxOSwtMC4yNDM2OTMgMC4yMDc4NTY2LC0wLjU1OTA2MSAwLjAzNTg0LC0wLjMxNTM3IC0wLjA3ODg0MSwtMC41ODc3MzQgLTAuMDE0MzM0LC0wLjA3MTY4IC0wLjEwMDM0NywtMC4yMDA2ODggTCA2LjI2NTY3OSwxMC40NDQ4NzUgNy45NTcyMDA5LDcuNjkyNTcwNCBRIDguMDQzMjE0Miw3LjU2MzU1NTkgOC4wNzE4ODA1LDcuNDkxODgwOCBMIDcuOTI4NTMxMiw3LjQ0ODg3OTYgUSA3Ljc5OTUxNjgsNy40MjAyMTIyIDcuNzQyMTc2NCw3LjM5MTU0NDcgNy40MTI0NzMzLDcuMjQ4MTk1NCA3LjE0NzI3NzUsNi45OTczMzQ0IDYuODgyMDgwNiw2Ljc0NjQ3MzUgNi43Mzg3MzEzLDYuNDMxMTA1MiA2LjQ5NTAzODMsNS45MTUwNDczIDYuNjA5NzE2OSw1LjM1NTk4NSA2LjY2NzA1MTcsNS4wMjYyODIgNi44NTM0MTEsNC43Mzk1ODM0IDcuMDM5NzY0Nyw0LjQ1Mjg4NDggNy4yOTc3OTM3LDQuMjUyMTk2MiA3LjgyODE4NjQsMy44NjUxNTI4IDguNDczMjU3NywzLjg2NTE1MjggOC44NjAzMDExLDMuODUwODE5MSA5LjIyNTg0MTcsNC4wMDEzMzQxIDkuNTkxMzgyMyw0LjE1MTg1MTQgOS44NjM3NDYxLDQuNDM4NTUgcSAwLjI0MzY5MjksMC4yMjkzNTgyIDAuMzc5ODc0OSwwLjU1MTg5NDQgMC4xMzYxODEsMC4zMjI1MzYxIDAuMTUwNTE3LDAuNjUyMjM5MiAwLDAuMjQzNjk0MSAtMC4wODYwMSwwLjYwMjA2NjggbCAxLjAwMzQ0NSwwLjI3MjM2MzggMC4xMTQ2NzksMC4wMTQzMzQgUSAxMS42MjY5MzgsNS45MTUwNDYyIDExLjUyNjU5Niw1LjI5ODY0NDYgMTEuNDY5MjYxLDQuODI1NTkyMyAxMS4yNDcwNjYsNC4zODgzNzY1IDExLjAyNDg3NCwzLjk1MTE2MDYgMTAuNjgwODM3LDMuNjIxNDU3NiAxMC4wNzg3NjksMy4wMTkzOTA4IDkuMjA0MzQsMi44MTg3MDIyIDkuMTE4MzI2NywyLjc5MDAzNDggOC45NDYzMTExLDIuNzYxMzU2MyBMIDguNzQ1NjIxNCwyLjczMjY4ODkgWiBtIDAuMjU4MDI3OSwxLjc3NzUzMDggcSAtMC4yNDM2OTMxLDAgLTAuNDg3Mzg3MiwwLjEwMDM0NyBRIDcuNzQyMTc0Miw0LjcxMDkxNDggNy41NDg2NTI1LDQuOTA0NDM0MyA3LjM1NTEzMTksNS4wOTc5NTUgNy4yNjkxMjE4LDUuMzU1OTgzOSA3LjE1NDQ0MjIsNS42NDI2ODI1IDcuMjExNzg2OCw1Ljk4NjcyMTQgcSAwLjA0MzAwMSwwLjI1ODAyNzkgMC4yMDA2ODg1LDAuNDg3Mzg3MiAwLjE1NzY4NDEsMC4yMjkzNTkzIDAuNDAxMzc4MywwLjM1ODM3MzggMC4zNDQwMzc4LDAuMjE1MDIzNCAwLjgwMjc1NTMsMC4xODYzNTI2IDAuMDQzMDAxLDAuMDU3MzQ2IDAuMDcxNjgsMC4xMTQ2ODA4IEwgMTAuMjkzOCw5Ljg3MTQ4NiBxIDAuMDQzLDAuMDg2MDEzIDAuMDg2MDEsMC4xMjkwMTQgMC4zODcwNDQsLTAuMzcyNzA3IDAuODM4NTk0LC0wLjUwODg4OTQgMC40NTE1NTEsLTAuMTM2MTgxNCAwLjkzMTc3LC0wLjA1MDE3MyAwLjQ4MDIyLDAuMDg2MDEzIDAuODM4NTk0LDAuMzcyNzA3NiAwLjQ1ODcxNywwLjM1ODM3MjggMC42MjM1NywwLjg4MTU5ODggMC4xNjQ4NTEsMC41MjMyMjUgMC4wMDcxLDEuMDUzNjE3IC0wLjExNDY4LDAuNDAxMzc4IC0wLjQwODU0NSwwLjcxNjc0NyAtMC4yOTM4NjcsMC4zMTUzNjggLTAuNjk1MjQ1LDAuNDczMDUyIC0wLjQ0NDM4MywwLjE4NjM1NCAtMC45NTMyNzMsMC4xMjE4NDcgLTAuNTA4ODksLTAuMDY0NTEgLTAuOTEwMjY3LC0wLjM1MTIwNiAtMC4wNTczNCwtMC4wNDMgLTAuMTg2MzU0LC0wLjE0MzM0OSBsIC0wLjA3MTY4LC0wLjA4NjAxIHEgLTAuMDU3MzQsMC4wNDMgLTAuMTU3Njg1LDAuMTQzMzUgbCAtMC42NzM3Mzk5LDAuNjU5NDA2IHEgMC4zMjk3MDMsMC4zMjk3MDQgMC43NDU0MTQ5LDAuNTUxODk0IDAuNDE1NzEzLDAuMjIyMTkyIDAuODc0NDMsMC4zMDgyMDIgbCAwLjMxNTM2OSwwLjA1NzM1IGggMC41NTkwNjIgbCAwLjQwMTM3OCwtMC4wNzE2OCBxIDAuOTE3NDM1LC0wLjE4NjM1NCAxLjU3Njg0MiwtMC44NjAwOTYgMC4zMTUzNjksLTAuMzE1MzY4IDAuNTIzMjI1LC0wLjcyMzkxNCAwLjIwNzg1NywtMC40MDg1NDUgMC4yNzk1MzEsLTAuODUyOTI4IDAuMDcxNjgsLTAuNTE2MDU3IC0wLjAyODY3LC0xLjAyNDk0OCBRIDE0LjcwODkzOSwxMC4xNTgxODEgMTQuNDUwOTE0LDkuNzQyNDY4MyAxNC4xOTI4ODUsOS4zMjY3NTUyIDEzLjgyMDE3Niw5LjAxMTM4NyAxMy40NDc0NjksOC42OTYwMTc3IDEzLjAwMzA4Niw4LjUwOTY2MzkgMTIuNTE1Njk4LDguMzA4OTc1MyAxMS45OTI0NzMsOC4yODAzMDU3IDExLjQ2OTI0OCw4LjI1MTYzODMgMTAuOTY3NTI1LDguMzgwNjUyNyBMIDEwLjcyMzgzMiw4LjQ1MjMzMjMgOS41NjI3MDM5LDYuNDg4NDQ2NyBRIDkuNzQ5MDU3Nyw2LjIxNjA4MjkgOS43OTIwNjMyLDUuOTU4MDU0IDkuODYzNzMxOCw1LjQ5OTMzNjUgOS42MDU3MDg0LDUuMDk3OTU4MyA5LjM3NjM1MDIsNC43Mzk1ODU2IDguOTc0OTcxOSw0LjU5NjIzNjMgOC43MzEyNzc4LDQuNTEwMjIzIDguNDczMjQ4OSw0LjUxMDIyMyBaIE0gNC40MzA4MDU3LDguMjk0NjQxNiBRIDMuNTk5MzgwNiw4LjQ4MDk5NjUgMi45OTczMTI3LDkuMDU0MzkzNiAyLjMyMzU3MTgsOS42ODUxMzAxIDIuMTIyODc3OCwxMC41NTk1NjEgbCAtMC4wNTczMTMsMC4zNDQwMzggdiAwLjUzMDM5MiBsIDAuMDI4NzExLDAuMTU3Njg0IHEgMC4wMjg3MTIsMC4xODYzNTUgMC4wNTczMTMsMC4yODY2OTkgMC4xMDAzMzYsMC40NDQzODMgMC4zNTEyMDE0LDAuODQ1NzYyIDAuMjUwODYyMSwwLjQwMTM3NyAwLjYwOTIzNDgsMC43MDI0MTEgMC43MTY3NDY1LDAuNTg3NzMyIDEuNjQ4NTE3NCwwLjcwMjQxMSAwLjU0NDcyNjQsMC4wNTczNCAxLjA4OTQ1NCwtMC4wNjQ1MSAwLjU0NDcyNzUsLTAuMTIxODQ3IDEuMDAzNDQ1LC0wLjQwODU0NSAwLjc1OTc1MDksLTAuNDg3Mzg4IDEuMTE4MTI0NywtMS4zMDQ0OCAwLjEwMDM0NywtMC4yNDM2OTMgMC4yMDA2ODg2LC0wLjY0NTA3MSAwLjA4NjAxMywtMC4wMTQzMyAwLjI1ODAyODksMCBsIDEuNzkxODY2NCwwLjAyODY3IHEgMC4yMDA2ODgsMCAwLjI4NjY5NywwLjAxNDMzIDAuMTU3Njg0LDAuMjg2NyAwLjM1ODM3NCwwLjQ0NDM4NCAwLjIwMDY4OSwwLjE1NzY4MyAwLjQ1MTU1MSwwLjIyOTM1OCAwLjI1MDg2MSwwLjA3MTY4IDAuNTA4ODg5LDAuMDU3MzQgMC40MDEzNzksLTAuMDQzIDAuNzE2NzQ2LC0wLjI4NjY5NyAwLjM4NzA0MywtMC4zMDEwMzUgMC40NTg3MTksLTAuNzc0MDg3IDAuMDI4NjcsLTAuMjQzNjkzIC0wLjAyMTUxLC0wLjQ3MzA1MyAtMC4wNTAxNywtMC4yMjkzNTggLTAuMTkzNTIyLC0wLjQzMDA0OCAtMC4yMjkzNTgsLTAuMzE1MzY4IC0wLjU4NzczMiwtMC40NTg3MTcgLTAuMjQzNjk0LC0wLjEwMDM0NzEgLTAuNTA4ODksLTAuMDkzMTc1IC0wLjI2NTE5NiwwLjAwNzE1IC0wLjUwODg5LDAuMTA3NTA5IC0wLjQwMTM3NywwLjE3MjAxOSAtMC42MTY0MDIsMC41MzAzOTEgbCAtMC4wNDMsMC4wODYwMSBxIC0wLjIwMDY4OSwwIC0wLjYwMjA2NzIsLTAuMDE0MzMgTCA4LjMwMTI2NjEsMTAuNjU5OTA3IFEgOC4wODYyNDI3LDEwLjY0NTU3NyA3LjY4NDg2NDUsMTAuNjQ1NTc3IEwgNi45NjgxMTgsMTAuNjMxMjQ3IDcuMDExMTE5LDEwLjg3NDk0IFEgNy4xMjU4MDIzLDExLjQ5MTMzIDYuODI0NzY4OSwxMi4wMzYwNTggNi42MjQwODAzLDEyLjQyMzEgNi4yNTEzNzE3LDEyLjY4MTEyOSA1Ljg3ODY2MzEsMTIuOTM5MTU4IDUuNDM0MjgwNCwxMi45OTY0OTggNC45MzI1NTg0LDEzLjA4MjUxMSA0LjQzMDgzNTQsMTIuODg4OTg5IDMuOTI5MTEzNCwxMi42OTU0NjggMy42MTM3NDUyLDEyLjI3OTc1NCAzLjIxMjM2NjksMTEuNzc4MDMyIDMuMjI2NzAxOCwxMS4xNDcyOTYgMy4yNDEwMzU1LDEwLjYxNjkwMyAzLjU1NjQwNDgsMTAuMTU4MTg2IDMuNzQyNzU5Niw5Ljg4NTgyMDggNC4wMTUxMjIzLDkuNjk5NDY4MiA0LjI4NzQ4NjEsOS41MTMxMTM0IDQuNjAyODU0Myw5LjQyNzEwMzMgbCAwLjEyOTAxNDUsLTAuMDQzMDAxIHoiCiAgICAgICBpZD0icGF0aDEiCiAgICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO3N0cm9rZS13aWR0aDowLjAxNDMzNDkiIC8+PC9nPjwvc3ZnPgo="; const runtime = Scratch.vm.runtime; + const keys = Object.keys; let hideFromPalette = true; let webhooks; @@ -50,12 +51,12 @@ } else if (Array.isArray(value)) { value.forEach((elem, index) => process(`${name}[${index}]`, elem)); } else if (typeof value === "object") { - Object.keys(value).forEach((key) => + keys(value).forEach((key) => process(`${name}[${key}]`, value[key]) ); } }; - Object.keys(data).forEach((key) => process(key, data[key])); + keys(data).forEach((key) => process(key, data[key])); return parts.join("&"); } @@ -157,14 +158,14 @@ ) ); } - if (Object.keys(webhooks).includes(name)) { + if (keys(webhooks).includes(name)) { alert( Scratch.translate( "This Webhook already exists! Please try a different name." ) ); } - } while (Object.keys(webhooks).includes(name) || name === ""); + } while (keys(webhooks).includes(name) || name === ""); let URL; do { URL = prompt(Scratch.translate("Enter Webhook URL:")); @@ -190,16 +191,16 @@ if (name === null) { return; } - if (!Object.keys(webhooks).includes(name)) { + if (!keys(webhooks).includes(name)) { alert( Scratch.translate( "This Webhook does not exist. Please enter a valid webhook name." ) ); } - } while (!Object.keys(webhooks).includes(name)); + } while (!keys(webhooks).includes(name)); delete webhooks[name]; - if (Object.keys(webhooks).length === 0) { + if (keys(webhooks).length === 0) { hideFromPalette = true; } Scratch.vm.extensionManager.refreshBlocks("cubesterWebhooks"); @@ -207,10 +208,10 @@ data(args) { try { switch (webhooks[args.WEBHOOK].TYPE) { - case "application/json": - return JSON.stringify(webhooks[args.WEBHOOK].DATA); case "application/x-www-form-urlencoded": return toForm(webhooks[args.WEBHOOK].DATA); + default: + return JSON.stringify(webhooks[args.WEBHOOK].DATA); } } catch (error) { return ""; @@ -244,8 +245,8 @@ } _webhookMenu() { - if (Object.keys(webhooks).length > 0) { - return Object.keys(webhooks); + if (keys(webhooks).length > 0) { + return keys(webhooks); } else { return [""]; } From 13977e0eef0cc63b501e5b15f6d591fe83d2aa48 Mon Sep 17 00:00:00 2001 From: Cubester Date: Sat, 18 Jan 2025 18:55:28 -0500 Subject: [PATCH 10/14] Formatting is crazy --- extensions/CubesterYT/Webhooks.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/extensions/CubesterYT/Webhooks.js b/extensions/CubesterYT/Webhooks.js index 6c5d5801ce..8090630da4 100644 --- a/extensions/CubesterYT/Webhooks.js +++ b/extensions/CubesterYT/Webhooks.js @@ -51,9 +51,7 @@ } else if (Array.isArray(value)) { value.forEach((elem, index) => process(`${name}[${index}]`, elem)); } else if (typeof value === "object") { - keys(value).forEach((key) => - process(`${name}[${key}]`, value[key]) - ); + keys(value).forEach((key) => process(`${name}[${key}]`, value[key])); } }; keys(data).forEach((key) => process(key, data[key])); From 6c05a97b20fc98b3aa985f19d6555761198b6eff Mon Sep 17 00:00:00 2001 From: Muffin Date: Mon, 20 Jan 2025 13:04:10 -0600 Subject: [PATCH 11/14] using object.create(null) when initializing the storage doesnt make sense since it wont be null when restoring storage that already exists --- extensions/CubesterYT/Webhooks.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/CubesterYT/Webhooks.js b/extensions/CubesterYT/Webhooks.js index 8090630da4..d3cfd473e4 100644 --- a/extensions/CubesterYT/Webhooks.js +++ b/extensions/CubesterYT/Webhooks.js @@ -19,9 +19,9 @@ let webhooks; function setupStorage() { if (!runtime.extensionStorage["cubesterWebhooks"]) { - runtime.extensionStorage["cubesterWebhooks"] = Object.create(null); - runtime.extensionStorage["cubesterWebhooks"].webhooks = - Object.create(null); + runtime.extensionStorage["cubesterWebhooks"] = { + webhooks: {} + }; } webhooks = runtime.extensionStorage["cubesterWebhooks"].webhooks; } From b5c1c1503b382e6737b075541cc278bfaef78932 Mon Sep 17 00:00:00 2001 From: Cubester Date: Mon, 20 Jan 2025 14:35:44 -0500 Subject: [PATCH 12/14] Fixes --- extensions/CubesterYT/Webhooks.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/extensions/CubesterYT/Webhooks.js b/extensions/CubesterYT/Webhooks.js index d3cfd473e4..5da653b8c1 100644 --- a/extensions/CubesterYT/Webhooks.js +++ b/extensions/CubesterYT/Webhooks.js @@ -20,10 +20,13 @@ function setupStorage() { if (!runtime.extensionStorage["cubesterWebhooks"]) { runtime.extensionStorage["cubesterWebhooks"] = { - webhooks: {} + webhooks: {}, }; } webhooks = runtime.extensionStorage["cubesterWebhooks"].webhooks; + if (keys(webhooks).length > 0) { + hideFromPalette = false; + } } setupStorage(); runtime.on("PROJECT_LOADED", setupStorage); @@ -142,10 +145,10 @@ }; } - addWebhook() { + async addWebhook() { let name; do { - name = prompt(Scratch.translate("Enter Webhook name:")); + name = await prompt(Scratch.translate("Enter Webhook name:")); if (name === null) { return; } @@ -166,7 +169,7 @@ } while (keys(webhooks).includes(name) || name === ""); let URL; do { - URL = prompt(Scratch.translate("Enter Webhook URL:")); + URL = await prompt(Scratch.translate("Enter Webhook URL:")); if (URL === null) { return; } @@ -182,10 +185,10 @@ hideFromPalette = false; Scratch.vm.extensionManager.refreshBlocks("cubesterWebhooks"); } - deleteWebhook() { + async deleteWebhook() { let name; do { - name = prompt(Scratch.translate("Enter Webhook name:")); + name = await prompt(Scratch.translate("Enter Webhook name:")); if (name === null) { return; } From 411295c2c08331c01141b7c9b0f12676de5c3aeb Mon Sep 17 00:00:00 2001 From: Cubester Date: Mon, 20 Jan 2025 15:44:11 -0500 Subject: [PATCH 13/14] =?UTF-8?q?Monkey=20acquires=20new=20brain=20cell=20?= =?UTF-8?q?=F0=9F=A7=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/CubesterYT/Webhooks.js | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/extensions/CubesterYT/Webhooks.js b/extensions/CubesterYT/Webhooks.js index 5da653b8c1..7576808cf5 100644 --- a/extensions/CubesterYT/Webhooks.js +++ b/extensions/CubesterYT/Webhooks.js @@ -13,7 +13,6 @@ "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB3aWR0aD0iNjQiCiAgIGhlaWdodD0iNjQiCiAgIHZpZXdCb3g9IjAgMCAxNi45MzMzMzMgMTYuOTMzMzMzIgogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmcxIgogICB4bWw6c3BhY2U9InByZXNlcnZlIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIxLjQgKDg2YThhZDcsIDIwMjQtMTAtMTEpIgogICBzb2RpcG9kaTpkb2NuYW1lPSJXZWJob29rc0ljb24uc3ZnIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0ibmFtZWR2aWV3MSIKICAgICBwYWdlY29sb3I9IiM1MDUwNTAiCiAgICAgYm9yZGVyY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0iMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlY2hlY2tlcmJvYXJkPSIxIgogICAgIGlua3NjYXBlOmRlc2tjb2xvcj0iIzUwNTA1MCIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6em9vbT0iOC4xOCIKICAgICBpbmtzY2FwZTpjeD0iMzIuMjczODM5IgogICAgIGlua3NjYXBlOmN5PSIzMy4wNjg0NiIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE5MjAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTAxNyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIiAvPjxkZWZzCiAgICAgaWQ9ImRlZnMxIiAvPjxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIj48Y2lyY2xlCiAgICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6I2M3M2E2MztzdHJva2Utd2lkdGg6MC4yNzA0NDc7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICBpZD0icGF0aDIiCiAgICAgICBjeD0iOC40NjY2NjYyIgogICAgICAgY3k9IjguNDY2NjY2MiIKICAgICAgIHI9IjguNDY2NjY2MiIgLz48cGF0aAogICAgICAgZmlsbD0iIzAwMDAwMCIKICAgICAgIGQ9Ik0gOC4yMTUyMjc2LDIuNzMyNjkgSCA4LjIwMDg5MzkgTCA4LjA1NzU0NDYsMi43NjEzNTc0IFEgNy41ODQ0OTIzLDIuODE4NzAzMyA3LjEzMjk0MjcsMy4wMjY1NTQzIDYuNjgxMzkyMSwzLjIzNDQwOTggNi4zMzczNTMxLDMuNTc4NDQ4NyA1Ljc0OTYyMTEsNC4xMDg4NDE0IDUuNTIwMjYyOSw0Ljg4MjkyNzIgNS4zOTEyNDg0LDUuMzEyOTc1IDUuNDA1NTgzMyw1Ljc4NjAyNzQgNS40MTk5MTcsNi4yNTkwNzk3IDUuNTc3NjAyMiw2LjY4OTEyNzYgNS44MjEyOTYzLDcuMzM0MTk5OSA2LjMyMzAxODMsNy44MDcyNTIzIEwgNi41MDkzNzMxLDcuOTc5MjcxMiA1LjMxOTU3MzIsOS45MTQ0ODYxIFEgNC45NDY4NjU3LDkuOTAwMTUyMSA0LjY3NDUwMiwxMC4wMTQ4MzMgcSAtMC40MzAwNDc5LDAuMTg2MzU1IC0wLjY0NTA3MTMsMC41NzMzOTggLTAuMTAwMzQ3LDAuMjE1MDI0IC0wLjEyOTAxNDUsMC40NDQzODIgLTAuMDI4NjY3LDAuMjI5MzU5IDAuMDI4NjY4LDAuNDU4NzE4IDAuMTE0Njc5NiwwLjQzMDA0NyAwLjQ3MzA1MjMsMC42ODgwNzYgMC4yMTUwMjQ1LDAuMTQzMzUgMC40NzMwNTIzLDAuMjA3ODU3IDAuMjU4MDI5LDAuMDY0NTEgMC41MTYwNTc5LDAuMDI4NjcgMC4yNTgwMjksLTAuMDM1ODQgMC40OTQ1NTUxLC0wLjE3OTE4NSAwLjIzNjUyNjIsLTAuMTQzMzUgMC4zOTQyMTAzLC0wLjM1ODM3NCAwLjE3MjAxOSwtMC4yNDM2OTMgMC4yMDc4NTY2LC0wLjU1OTA2MSAwLjAzNTg0LC0wLjMxNTM3IC0wLjA3ODg0MSwtMC41ODc3MzQgLTAuMDE0MzM0LC0wLjA3MTY4IC0wLjEwMDM0NywtMC4yMDA2ODggTCA2LjI2NTY3OSwxMC40NDQ4NzUgNy45NTcyMDA5LDcuNjkyNTcwNCBRIDguMDQzMjE0Miw3LjU2MzU1NTkgOC4wNzE4ODA1LDcuNDkxODgwOCBMIDcuOTI4NTMxMiw3LjQ0ODg3OTYgUSA3Ljc5OTUxNjgsNy40MjAyMTIyIDcuNzQyMTc2NCw3LjM5MTU0NDcgNy40MTI0NzMzLDcuMjQ4MTk1NCA3LjE0NzI3NzUsNi45OTczMzQ0IDYuODgyMDgwNiw2Ljc0NjQ3MzUgNi43Mzg3MzEzLDYuNDMxMTA1MiA2LjQ5NTAzODMsNS45MTUwNDczIDYuNjA5NzE2OSw1LjM1NTk4NSA2LjY2NzA1MTcsNS4wMjYyODIgNi44NTM0MTEsNC43Mzk1ODM0IDcuMDM5NzY0Nyw0LjQ1Mjg4NDggNy4yOTc3OTM3LDQuMjUyMTk2MiA3LjgyODE4NjQsMy44NjUxNTI4IDguNDczMjU3NywzLjg2NTE1MjggOC44NjAzMDExLDMuODUwODE5MSA5LjIyNTg0MTcsNC4wMDEzMzQxIDkuNTkxMzgyMyw0LjE1MTg1MTQgOS44NjM3NDYxLDQuNDM4NTUgcSAwLjI0MzY5MjksMC4yMjkzNTgyIDAuMzc5ODc0OSwwLjU1MTg5NDQgMC4xMzYxODEsMC4zMjI1MzYxIDAuMTUwNTE3LDAuNjUyMjM5MiAwLDAuMjQzNjk0MSAtMC4wODYwMSwwLjYwMjA2NjggbCAxLjAwMzQ0NSwwLjI3MjM2MzggMC4xMTQ2NzksMC4wMTQzMzQgUSAxMS42MjY5MzgsNS45MTUwNDYyIDExLjUyNjU5Niw1LjI5ODY0NDYgMTEuNDY5MjYxLDQuODI1NTkyMyAxMS4yNDcwNjYsNC4zODgzNzY1IDExLjAyNDg3NCwzLjk1MTE2MDYgMTAuNjgwODM3LDMuNjIxNDU3NiAxMC4wNzg3NjksMy4wMTkzOTA4IDkuMjA0MzQsMi44MTg3MDIyIDkuMTE4MzI2NywyLjc5MDAzNDggOC45NDYzMTExLDIuNzYxMzU2MyBMIDguNzQ1NjIxNCwyLjczMjY4ODkgWiBtIDAuMjU4MDI3OSwxLjc3NzUzMDggcSAtMC4yNDM2OTMxLDAgLTAuNDg3Mzg3MiwwLjEwMDM0NyBRIDcuNzQyMTc0Miw0LjcxMDkxNDggNy41NDg2NTI1LDQuOTA0NDM0MyA3LjM1NTEzMTksNS4wOTc5NTUgNy4yNjkxMjE4LDUuMzU1OTgzOSA3LjE1NDQ0MjIsNS42NDI2ODI1IDcuMjExNzg2OCw1Ljk4NjcyMTQgcSAwLjA0MzAwMSwwLjI1ODAyNzkgMC4yMDA2ODg1LDAuNDg3Mzg3MiAwLjE1NzY4NDEsMC4yMjkzNTkzIDAuNDAxMzc4MywwLjM1ODM3MzggMC4zNDQwMzc4LDAuMjE1MDIzNCAwLjgwMjc1NTMsMC4xODYzNTI2IDAuMDQzMDAxLDAuMDU3MzQ2IDAuMDcxNjgsMC4xMTQ2ODA4IEwgMTAuMjkzOCw5Ljg3MTQ4NiBxIDAuMDQzLDAuMDg2MDEzIDAuMDg2MDEsMC4xMjkwMTQgMC4zODcwNDQsLTAuMzcyNzA3IDAuODM4NTk0LC0wLjUwODg4OTQgMC40NTE1NTEsLTAuMTM2MTgxNCAwLjkzMTc3LC0wLjA1MDE3MyAwLjQ4MDIyLDAuMDg2MDEzIDAuODM4NTk0LDAuMzcyNzA3NiAwLjQ1ODcxNywwLjM1ODM3MjggMC42MjM1NywwLjg4MTU5ODggMC4xNjQ4NTEsMC41MjMyMjUgMC4wMDcxLDEuMDUzNjE3IC0wLjExNDY4LDAuNDAxMzc4IC0wLjQwODU0NSwwLjcxNjc0NyAtMC4yOTM4NjcsMC4zMTUzNjggLTAuNjk1MjQ1LDAuNDczMDUyIC0wLjQ0NDM4MywwLjE4NjM1NCAtMC45NTMyNzMsMC4xMjE4NDcgLTAuNTA4ODksLTAuMDY0NTEgLTAuOTEwMjY3LC0wLjM1MTIwNiAtMC4wNTczNCwtMC4wNDMgLTAuMTg2MzU0LC0wLjE0MzM0OSBsIC0wLjA3MTY4LC0wLjA4NjAxIHEgLTAuMDU3MzQsMC4wNDMgLTAuMTU3Njg1LDAuMTQzMzUgbCAtMC42NzM3Mzk5LDAuNjU5NDA2IHEgMC4zMjk3MDMsMC4zMjk3MDQgMC43NDU0MTQ5LDAuNTUxODk0IDAuNDE1NzEzLDAuMjIyMTkyIDAuODc0NDMsMC4zMDgyMDIgbCAwLjMxNTM2OSwwLjA1NzM1IGggMC41NTkwNjIgbCAwLjQwMTM3OCwtMC4wNzE2OCBxIDAuOTE3NDM1LC0wLjE4NjM1NCAxLjU3Njg0MiwtMC44NjAwOTYgMC4zMTUzNjksLTAuMzE1MzY4IDAuNTIzMjI1LC0wLjcyMzkxNCAwLjIwNzg1NywtMC40MDg1NDUgMC4yNzk1MzEsLTAuODUyOTI4IDAuMDcxNjgsLTAuNTE2MDU3IC0wLjAyODY3LC0xLjAyNDk0OCBRIDE0LjcwODkzOSwxMC4xNTgxODEgMTQuNDUwOTE0LDkuNzQyNDY4MyAxNC4xOTI4ODUsOS4zMjY3NTUyIDEzLjgyMDE3Niw5LjAxMTM4NyAxMy40NDc0NjksOC42OTYwMTc3IDEzLjAwMzA4Niw4LjUwOTY2MzkgMTIuNTE1Njk4LDguMzA4OTc1MyAxMS45OTI0NzMsOC4yODAzMDU3IDExLjQ2OTI0OCw4LjI1MTYzODMgMTAuOTY3NTI1LDguMzgwNjUyNyBMIDEwLjcyMzgzMiw4LjQ1MjMzMjMgOS41NjI3MDM5LDYuNDg4NDQ2NyBRIDkuNzQ5MDU3Nyw2LjIxNjA4MjkgOS43OTIwNjMyLDUuOTU4MDU0IDkuODYzNzMxOCw1LjQ5OTMzNjUgOS42MDU3MDg0LDUuMDk3OTU4MyA5LjM3NjM1MDIsNC43Mzk1ODU2IDguOTc0OTcxOSw0LjU5NjIzNjMgOC43MzEyNzc4LDQuNTEwMjIzIDguNDczMjQ4OSw0LjUxMDIyMyBaIE0gNC40MzA4MDU3LDguMjk0NjQxNiBRIDMuNTk5MzgwNiw4LjQ4MDk5NjUgMi45OTczMTI3LDkuMDU0MzkzNiAyLjMyMzU3MTgsOS42ODUxMzAxIDIuMTIyODc3OCwxMC41NTk1NjEgbCAtMC4wNTczMTMsMC4zNDQwMzggdiAwLjUzMDM5MiBsIDAuMDI4NzExLDAuMTU3Njg0IHEgMC4wMjg3MTIsMC4xODYzNTUgMC4wNTczMTMsMC4yODY2OTkgMC4xMDAzMzYsMC40NDQzODMgMC4zNTEyMDE0LDAuODQ1NzYyIDAuMjUwODYyMSwwLjQwMTM3NyAwLjYwOTIzNDgsMC43MDI0MTEgMC43MTY3NDY1LDAuNTg3NzMyIDEuNjQ4NTE3NCwwLjcwMjQxMSAwLjU0NDcyNjQsMC4wNTczNCAxLjA4OTQ1NCwtMC4wNjQ1MSAwLjU0NDcyNzUsLTAuMTIxODQ3IDEuMDAzNDQ1LC0wLjQwODU0NSAwLjc1OTc1MDksLTAuNDg3Mzg4IDEuMTE4MTI0NywtMS4zMDQ0OCAwLjEwMDM0NywtMC4yNDM2OTMgMC4yMDA2ODg2LC0wLjY0NTA3MSAwLjA4NjAxMywtMC4wMTQzMyAwLjI1ODAyODksMCBsIDEuNzkxODY2NCwwLjAyODY3IHEgMC4yMDA2ODgsMCAwLjI4NjY5NywwLjAxNDMzIDAuMTU3Njg0LDAuMjg2NyAwLjM1ODM3NCwwLjQ0NDM4NCAwLjIwMDY4OSwwLjE1NzY4MyAwLjQ1MTU1MSwwLjIyOTM1OCAwLjI1MDg2MSwwLjA3MTY4IDAuNTA4ODg5LDAuMDU3MzQgMC40MDEzNzksLTAuMDQzIDAuNzE2NzQ2LC0wLjI4NjY5NyAwLjM4NzA0MywtMC4zMDEwMzUgMC40NTg3MTksLTAuNzc0MDg3IDAuMDI4NjcsLTAuMjQzNjkzIC0wLjAyMTUxLC0wLjQ3MzA1MyAtMC4wNTAxNywtMC4yMjkzNTggLTAuMTkzNTIyLC0wLjQzMDA0OCAtMC4yMjkzNTgsLTAuMzE1MzY4IC0wLjU4NzczMiwtMC40NTg3MTcgLTAuMjQzNjk0LC0wLjEwMDM0NzEgLTAuNTA4ODksLTAuMDkzMTc1IC0wLjI2NTE5NiwwLjAwNzE1IC0wLjUwODg5LDAuMTA3NTA5IC0wLjQwMTM3NywwLjE3MjAxOSAtMC42MTY0MDIsMC41MzAzOTEgbCAtMC4wNDMsMC4wODYwMSBxIC0wLjIwMDY4OSwwIC0wLjYwMjA2NzIsLTAuMDE0MzMgTCA4LjMwMTI2NjEsMTAuNjU5OTA3IFEgOC4wODYyNDI3LDEwLjY0NTU3NyA3LjY4NDg2NDUsMTAuNjQ1NTc3IEwgNi45NjgxMTgsMTAuNjMxMjQ3IDcuMDExMTE5LDEwLjg3NDk0IFEgNy4xMjU4MDIzLDExLjQ5MTMzIDYuODI0NzY4OSwxMi4wMzYwNTggNi42MjQwODAzLDEyLjQyMzEgNi4yNTEzNzE3LDEyLjY4MTEyOSA1Ljg3ODY2MzEsMTIuOTM5MTU4IDUuNDM0MjgwNCwxMi45OTY0OTggNC45MzI1NTg0LDEzLjA4MjUxMSA0LjQzMDgzNTQsMTIuODg4OTg5IDMuOTI5MTEzNCwxMi42OTU0NjggMy42MTM3NDUyLDEyLjI3OTc1NCAzLjIxMjM2NjksMTEuNzc4MDMyIDMuMjI2NzAxOCwxMS4xNDcyOTYgMy4yNDEwMzU1LDEwLjYxNjkwMyAzLjU1NjQwNDgsMTAuMTU4MTg2IDMuNzQyNzU5Niw5Ljg4NTgyMDggNC4wMTUxMjIzLDkuNjk5NDY4MiA0LjI4NzQ4NjEsOS41MTMxMTM0IDQuNjAyODU0Myw5LjQyNzEwMzMgbCAwLjEyOTAxNDUsLTAuMDQzMDAxIHoiCiAgICAgICBpZD0icGF0aDEiCiAgICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO3N0cm9rZS13aWR0aDowLjAxNDMzNDkiIC8+PC9nPjwvc3ZnPgo="; const runtime = Scratch.vm.runtime; - const keys = Object.keys; let hideFromPalette = true; let webhooks; @@ -24,7 +23,7 @@ }; } webhooks = runtime.extensionStorage["cubesterWebhooks"].webhooks; - if (keys(webhooks).length > 0) { + if (Object.keys(webhooks).length > 0) { hideFromPalette = false; } } @@ -54,10 +53,12 @@ } else if (Array.isArray(value)) { value.forEach((elem, index) => process(`${name}[${index}]`, elem)); } else if (typeof value === "object") { - keys(value).forEach((key) => process(`${name}[${key}]`, value[key])); + Object.keys(value).forEach((key) => + process(`${name}[${key}]`, value[key]) + ); } }; - keys(data).forEach((key) => process(key, data[key])); + Object.keys(data).forEach((key) => process(key, data[key])); return parts.join("&"); } @@ -146,6 +147,7 @@ } async addWebhook() { + const list = Object.keys(webhooks); let name; do { name = await prompt(Scratch.translate("Enter Webhook name:")); @@ -159,14 +161,14 @@ ) ); } - if (keys(webhooks).includes(name)) { + if (list.includes(name)) { alert( Scratch.translate( "This Webhook already exists! Please try a different name." ) ); } - } while (keys(webhooks).includes(name) || name === ""); + } while (list.includes(name) || name === ""); let URL; do { URL = await prompt(Scratch.translate("Enter Webhook URL:")); @@ -186,22 +188,23 @@ Scratch.vm.extensionManager.refreshBlocks("cubesterWebhooks"); } async deleteWebhook() { + const list = Object.keys(webhooks); let name; do { name = await prompt(Scratch.translate("Enter Webhook name:")); if (name === null) { return; } - if (!keys(webhooks).includes(name)) { + if (!list.includes(name)) { alert( Scratch.translate( "This Webhook does not exist. Please enter a valid webhook name." ) ); } - } while (!keys(webhooks).includes(name)); + } while (!list.includes(name)); delete webhooks[name]; - if (keys(webhooks).length === 0) { + if (Object.keys(webhooks).length === 0) { hideFromPalette = true; } Scratch.vm.extensionManager.refreshBlocks("cubesterWebhooks"); @@ -246,8 +249,9 @@ } _webhookMenu() { - if (keys(webhooks).length > 0) { - return keys(webhooks); + const list = Object.keys(webhooks); + if (list.length > 0) { + return list; } else { return [""]; } From 99fd5228cdbf96870508c0766adb9a060231accc Mon Sep 17 00:00:00 2001 From: Cubester Date: Mon, 20 Jan 2025 15:55:45 -0500 Subject: [PATCH 14/14] `try catch` isn't always the way --- extensions/CubesterYT/Webhooks.js | 47 +++++++++++++++---------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/extensions/CubesterYT/Webhooks.js b/extensions/CubesterYT/Webhooks.js index 7576808cf5..982083895b 100644 --- a/extensions/CubesterYT/Webhooks.js +++ b/extensions/CubesterYT/Webhooks.js @@ -210,42 +210,41 @@ Scratch.vm.extensionManager.refreshBlocks("cubesterWebhooks"); } data(args) { - try { - switch (webhooks[args.WEBHOOK].TYPE) { - case "application/x-www-form-urlencoded": - return toForm(webhooks[args.WEBHOOK].DATA); - default: - return JSON.stringify(webhooks[args.WEBHOOK].DATA); - } - } catch (error) { + if (!webhooks[args.WEBHOOK]) { return ""; } + switch (webhooks[args.WEBHOOK].TYPE) { + case "application/x-www-form-urlencoded": + return toForm(webhooks[args.WEBHOOK].DATA); + default: + return JSON.stringify(webhooks[args.WEBHOOK].DATA); + } } setData(args) { + if (!webhooks[args.WEBHOOK]) { + return; + } try { webhooks[args.WEBHOOK].DATA = JSON.parse( Scratch.Cast.toString(args.JSON) ); - webhooks[args.WEBHOOK].TYPE = args.TYPE; - } catch (error) { - return; - } + } catch (error) {} + webhooks[args.WEBHOOK].TYPE = args.TYPE; } postData(args) { - try { - Scratch.fetch(webhooks[args.WEBHOOK].URL, { - method: "POST", - headers: { - "Content-type": webhooks[args.WEBHOOK].TYPE, - }, - body: - webhooks[args.WEBHOOK].TYPE === "application/json" - ? JSON.stringify(webhooks[args.WEBHOOK].DATA) - : toForm(webhooks[args.WEBHOOK].DATA), - }); - } catch (error) { + if (!webhooks[args.WEBHOOK]) { return; } + Scratch.fetch(webhooks[args.WEBHOOK].URL, { + method: "POST", + headers: { + "Content-type": webhooks[args.WEBHOOK].TYPE, + }, + body: + webhooks[args.WEBHOOK].TYPE === "application/json" + ? JSON.stringify(webhooks[args.WEBHOOK].DATA) + : toForm(webhooks[args.WEBHOOK].DATA), + }); } _webhookMenu() {