diff --git a/AppData.zip b/AppData.zip index 4e0557b..807676e 100644 Binary files a/AppData.zip and b/AppData.zip differ diff --git a/AppData/Actions/createList.js b/AppData/Actions/createList.js index 60aa539..209aeb9 100644 --- a/AppData/Actions/createList.js +++ b/AppData/Actions/createList.js @@ -18,7 +18,7 @@ module.exports = { let transferVariables = require(`../Toolkit/variableTools.js`).transf; const transf = (value) => { - transferVariables(value, bridge.variables); + return transferVariables(value, bridge.variables); }; bridge.variables[transf(values.listName)] = []; diff --git a/AppData/Actions/deleteChannel.js b/AppData/Actions/deleteChannel.js new file mode 100644 index 0000000..7016a25 --- /dev/null +++ b/AppData/Actions/deleteChannel.js @@ -0,0 +1,47 @@ +module.exports = { + data: { + name: "Delete Channel", + channel: "", + channelFrom: "Command channel", + threadName: "", + autoArchive: "", + storeAs: "", + }, + UI: { + compatibleWith: ["Text", "Slash"], + text: "Delete Channel", + sepbar:"", + + btext: "Get Channel Via", + menuBar: {choices: ["Command Channel", "Variable*", "ID*"], storeAs: "channelFrom", extraField: "channel"}, + + variableSettings: { + channel: { + "Variable*": "direct" + } + } + }, + subtitle: "Get Channel Via: $[channelFrom]$", + async run(values, message, client, bridge) { + let transferVariables = require(`../Toolkit/variableTools.js`).transf; + + const transf = (value) => { + return transferVariables(value, bridge.variables); + }; + + let channel; + + if (values.channelFrom == 'Command Channel') { + channel = message.channel; + } + if (values.channelFrom == 'Variable*') { + let chan = bridge.variables[transf(values.channel)] + channel = chan.channel || client.getChannel(chan.id) + } + if (values.channelFrom == 'ID*') { + channel = client.getChannel(transf(values.channel)) + } + + channel.delete() + }, +}; diff --git a/AppData/Actions/deleteChannel_event.js b/AppData/Actions/deleteChannel_event.js new file mode 100644 index 0000000..732dd56 --- /dev/null +++ b/AppData/Actions/deleteChannel_event.js @@ -0,0 +1,44 @@ +module.exports = { + data: { + name: "Delete Channel", + channel: "", + channelFrom: "Variable*", + threadName: "", + autoArchive: "", + storeAs: "", + }, + UI: { + compatibleWith: ["Text", "Slash"], + text: "Delete Channel", + sepbar:"", + + btext: "Get Channel Via", + menuBar: {choices: ["Variable*", "ID*"], storeAs: "channelFrom", extraField: "channel"}, + + variableSettings: { + channel: { + "Variable*": "direct" + } + } + }, + subtitle: "Get Channel Via: $[channelFrom]$", + async run(values, message, client, bridge) { + let transferVariables = require(`../Toolkit/variableTools.js`).transf; + + const transf = (value) => { + return transferVariables(value, bridge.variables); + }; + + let channel; + + if (values.channelFrom == 'Variable*') { + let chan = bridge.variables[transf(values.channel)] + channel = chan.channel || client.getChannel(chan.id) + } + if (values.channelFrom == 'ID*') { + channel = client.getChannel(transf(values.channel)) + } + + channel.delete() + }, +}; diff --git a/AppData/Actions/sendmessage.js b/AppData/Actions/sendmessage.js index 63db067..6772e8a 100644 --- a/AppData/Actions/sendmessage.js +++ b/AppData/Actions/sendmessage.js @@ -496,9 +496,8 @@ module.exports = { channel = DMchannel; } if (values.sendTo == "Channel Variable*") { - channel = client.getChannel( - bridge.variables[varTools.transf(values.to, bridge.variables)].id, - ); + let chan = bridge.variables[varTools.transf(values.to, bridge.variables)] + channel = chan.channel || client.getChannel(chan.id) } if (values.sendTo == "Channel ID*") { channel = client.getChannel(varTools.transf(values.to, bridge.variables)); diff --git a/AppData/Actions/sendmessage_event.js b/AppData/Actions/sendmessage_event.js index f200266..8038b54 100644 --- a/AppData/Actions/sendmessage_event.js +++ b/AppData/Actions/sendmessage_event.js @@ -486,9 +486,8 @@ module.exports = { let channel; if (values.sendTo == "Channel Variable*") { - channel = client.getChannel( - bridge.variables[varTools.transf(values.to, bridge.variables)].id, - ); + let chan = bridge.variables[varTools.transf(values.to, bridge.variables)] + channel = chan.channel || client.getChannel(chan.id) } if (values.sendTo == "Channel ID*") { channel = client.getChannel(varTools.transf(values.to, bridge.variables)); diff --git a/AppData/Actions/startThread.js b/AppData/Actions/startThread.js new file mode 100644 index 0000000..2045998 --- /dev/null +++ b/AppData/Actions/startThread.js @@ -0,0 +1,79 @@ +module.exports = { + data: { + name: "Start Thread", + message: "", + messageFrom: "Command Message", + threadName: "", + autoArchive: "", + storeAs: "", + }, + UI: { + compatibleWith: ["Text"], + text: "Start Thread", + sepbar:"", + btext: "Get Thread Parent Message Via", + menuBar: {choices: ["Command Message", "Variable*"], storeAs: "messageFrom", extraField: "message"}, + + sepbar0:"", + + btext0: "Thread Name", + input: "threadName", + + sepbar1: "", + + btext1: "Thread Auto-Archive Duration", + menuBar0: {choices: ["1 Hour", "24 Hours", "3 Days", "1 Week"], storeAs: "autoArchive"}, + + sepbar2:"", + + btext2: "Store Thread As", + "input!":"storeAs", + + variableSettings: { + message: { + "Variable*": "direct" + } + } + }, + subtitle: "Message: $[messageFrom]$ - Archive After: $[autoArchive]$", + async run(values, message, client, bridge) { + let transferVariables = require(`../Toolkit/variableTools.js`).transf; + + const transf = (value) => { + return transferVariables(value, bridge.variables); + }; + + + let threadName = transf(values.threadName) + + let autoArchive; + + switch(values.autoArchive) { + case '1 Hour': + autoArchive = 60; + break + case '24 Hours': + autoArchive = 1440 + break + case '3 Days': + autoArchive = 4320 + break + case '1 Week': + autoArchive = 10080 + break + } + + let msg; + + if (values.messageFrom == 'Command Message') { + msg = message + } else { + msg = bridge.variables[transf(values.message)] + } + let thread = await msg.startThread({ + name: threadName, + autoArchiveDuration: autoArchive + }) + bridge.variables[transf(values.storeAs)] = thread + }, +}; diff --git a/AppData/Actions/startThread_event.js b/AppData/Actions/startThread_event.js new file mode 100644 index 0000000..519f254 --- /dev/null +++ b/AppData/Actions/startThread_event.js @@ -0,0 +1,73 @@ +module.exports = { + data: { + name: "Start Thread", + message: "", + threadName: "", + autoArchive: "", + storeAs: "", + }, + UI: { + compatibleWith: ["Slash", "Event"], + text: "Start Thread", + sepbar:"", + btext: "Parent Message Variable", + "input_direct": "message", + + sepbar0:"", + + btext0: "Thread Name", + input: "threadName", + + sepbar1: "", + + btext1: "Thread Auto-Archive Duration", + menuBar0: {choices: ["1 Hour", "24 Hours", "3 Days", "1 Week"], storeAs: "autoArchive"}, + + sepbar2:"", + + btext2: "Store Thread As", + "input!":"storeAs", + + variableSettings: { + message: { + "Variable*": "direct" + } + } + }, + subtitle: "Message: $[messageFrom]$ - Archive After: $[autoArchive]$", + async run(values, message, client, bridge) { + let transferVariables = require(`../Toolkit/variableTools.js`).transf; + + const transf = (value) => { + return transferVariables(value, bridge.variables); + }; + + + let threadName = transf(values.threadName) + + let autoArchive; + + switch(values.autoArchive) { + case '1 Hour': + autoArchive = 60; + break + case '24 Hours': + autoArchive = 1440 + break + case '3 Days': + autoArchive = 4320 + break + case '1 Week': + autoArchive = 10080 + break + } + + let msg = bridge.variables[transf(values.message)] + + let thread = await msg.startThread({ + name: threadName, + autoArchiveDuration: autoArchive + }) + bridge.variables[transf(values.storeAs)] = thread + }, +}; diff --git a/AppData/Kits/EditorBones.js b/AppData/Kits/EditorBones.js index 267f324..011abc9 100644 --- a/AppData/Kits/EditorBones.js +++ b/AppData/Kits/EditorBones.js @@ -3,6 +3,35 @@ const { app, ipcRenderer } = require("electron"); let selectedGroupType = "text"; let copiedAction; +const { Worker } = require('worker_threads'); + +function runInWorker(method) { + return new Promise((resolve, reject) => { + const worker = new Worker(` + const { parentPort } = require('worker_threads'); + parentPort.on('message', (method) => { + try { + method(); + parentPort.postMessage('Code execution completed.'); + } catch (error) { + parentPort.postMessage({ error: error.message }); + } + }); + `); + + worker.on('message', (message) => { + if (typeof message === 'string') { + resolve(message); + } else { + reject(new Error(message.error)); + } + worker.terminate(); + }); + + worker.postMessage(method.toString()); + }); +} + function editAction() { let variables = []; let actionType = "text"; @@ -82,6 +111,7 @@ const fs = require("fs"); const processPath = require("process").cwd(); const path = require("path"); var botData = JSON.parse(fs.readFileSync(processPath + "/AppData/data.json")); +document.getElementById('titlebar').innerText = `Studio Bot Maker - Editing ${botData.name}` let lastType = 0; // 0 = Command; 1 = Actions; let lastObj = "1"; let lastAct = "1"; @@ -739,27 +769,7 @@ function modcolor() { sidebar.style.width = "40vw"; sidebar.innerHTML = `
-
Editor Theme & Colors
-
Lights Off
-
Ultraviolet
-
Soothing Cherry
-
Strawberry
-
Bloodshot Pink
- -
Wood
-
Salmon
-
Golden Apple
-
Smoke
-
Lilac
-
Shiny Forest
-
Navy Blue
-
Forest Green
-
Aquamarine
-
Moody Blue
-
Gray
-
Mint
-
Anger
- + `; sidebar.onmouseleave = () => { sidebar.style.width = "0vw"; diff --git a/AppData/Kits/EditorComponents.js b/AppData/Kits/EditorComponents.js index 3357545..075ee1c 100644 --- a/AppData/Kits/EditorComponents.js +++ b/AppData/Kits/EditorComponents.js @@ -4,10 +4,18 @@ function addObjectToMenu(element, option) { type: option, data: actionUI[element].UItypes[option].data, }); + document.getElementById(actionUI[element].storeAs).style.filter = 'blur(22px)'; + setTimeout(() => { + document.getElementById(actionUI[element].storeAs).style.filter = ''; + }, 500); } refreshMenuItems(element); document.getElementById(`${element}AddButton`).style.transition = `all 0.${editorSettings.commonAnimation}s ease` document.getElementById(`${element}AddButton`).style.transform = "rotate(360deg)"; + setTimeout(() => { + document.getElementById(`${element}AddButton`).style.transform = "rotate(0deg)"; + document.getElementById(`${element}AddButton`).style.transition = `all 0.${editorSettings.commonAnimation}s ease` + }, editorSettings.commonAnimation * 200); document.getElementById( `${element}AddButton`, ).onclick = `refreshMenuItems('${element}')`; @@ -94,21 +102,37 @@ function editAction(at, actionNumber) { } storeActionData(); } +let draggedOverMenu, draggedPosition, draggedOverPosition; + +function handleOptionDrag(position, menu) { + draggedPosition = position; + draggedOverMenu = menu; +} + +function dragPositionOver(position, menu, event) { + if (draggedOverMenu == menu) event.preventDefault() + + draggedOverPosition = position; +} + +function handleDragOptionEnd() { + console.log(actionUI[draggedOverMenu], draggedOverMenu) + action.data[actionUI[draggedOverMenu].storeAs] = moveArrayElement(action.data[actionUI[draggedOverMenu].storeAs], draggedPosition, draggedOverPosition); + refreshMenuItems(draggedOverMenu) + draggedOverMenu = undefined; +} function refreshMenuItems(menu) { let menuObject = actionUI[menu]; let menuElement = document.getElementById(menuObject.storeAs); let endOptions = ``; menuElement.style.height = "44vh"; - menuElement.style.filter = "blur(22px)"; for (let object in action.data[menuObject.storeAs]) { let option = action.data[menuObject.storeAs][object]; - console.log(option, actionUI[menu]); let typeName = actionUI[menu].UItypes[option.type].name; - console.log(typeName); endOptions = `${endOptions} -
+
#${object}
${typeName}
diff --git a/AppData/Kits/EditorScripts.js b/AppData/Kits/EditorScripts.js index 3051541..34ddb6a 100644 --- a/AppData/Kits/EditorScripts.js +++ b/AppData/Kits/EditorScripts.js @@ -144,12 +144,17 @@ function mbSelect(storeAs, menu, extraField, UIreference) { pending.id = extraField; pending.contentEditable = "true"; pending.innerHTML = action.data[extraField]; - pending.addEventListener('input', (event) => { + saveField(extraField, menu); setTimeout(() => { validateInput(event); }, 10); + }) + pending.addEventListener('blur', (event) => { saveField(extraField, menu); + setTimeout(() => { + validateInput(event); + }, 10); }) } } @@ -170,12 +175,18 @@ function mbSelect(storeAs, menu, extraField, UIreference) { storeAs.parentNode.innerHTML = storeAs.innerText; if (pending != "" && cachedParentNode.nextSibling.className !== "selectBar") { pending.appendAfter(cachedParentNode); - pending.oninput = (event) => { + pending.addEventListener('input', (event) => { + saveField(extraField, menu); setTimeout(() => { + validateInput(event); + }, 10); + }) + pending.addEventListener('blur', (event) => { saveField(extraField, menu); + setTimeout(() => { validateInput(event); }, 10); - } + }) } if (document.getElementById(extraField)) { if (document.getElementById(extraField + "Selector")) { @@ -497,23 +508,28 @@ function restoreActions() { } function addObjectToCustomMenu(element) { + let targetField = document.getElementById(actionUI[element].storeAs); + targetField.style.transition = `all 0.${editorSettings.fastAnimation}s ease` + if (actionUI[element].max > action.data[actionUI[element].storeAs].length) { - let targetField = document.getElementById(actionUI[element].storeAs); if (Object.keys(actionUI[element].types).length > 1) { document.getElementById(`${element}AddButton`).style.transition = `all 0.${editorSettings.commonAnimation}s ease` document.getElementById(`${element}AddButton`).style.transform = "rotate(135deg)"; - targetField.style.transition = `all 0.${editorSettings.fastAnimation}s ease` document.getElementById(`${element}AddButton`).onclick = () => { refreshMenuItems(`${element}`); + + document.getElementById(actionUI[element].storeAs).style.filter = 'blur(22px)'; + setTimeout(() => { + document.getElementById(actionUI[element].storeAs).style.filter = ''; + }, 500); }; targetField.style.filter = "blur(22px)"; if (Object.keys(actionUI[element].types).length < 5) { targetField.style.height = "10vh"; } else if ( - Object.keys(actionUI[element].types).length > 5 && - Object.keys(actionUI[element].types).length < 8 + Object.keys(actionUI[element].types).length > 5 ) { targetField.style.height = "25vh"; } @@ -541,6 +557,7 @@ function addObjectToCustomMenu(element) { addObjectToMenu(`${element}`, Object.keys(actionUI[element].types)[0]); } } else { + document .getElementById(`${element}AddButton`) .classList.add("goofyhovereffect"); @@ -560,6 +577,15 @@ function deleteMenuOption(position, menu) { setTimeout(() => { refreshMenuItems(menu); }, 240); + document.getElementById(`${menu}AddButton`).style.transition = `all 0.${editorSettings.commonAnimation}s ease` + document.getElementById(`${menu}AddButton`).style.transform = "rotate(-360deg)"; + setTimeout(() => { + document.getElementById(`${menu}AddButton`).style.transition = `all 0s ease` + document.getElementById(`${menu}AddButton`).style.transition = `all 0s ease` + document.getElementById(`${menu}AddButton`).style.transition = `all 0s ease` + + document.getElementById(`${menu}AddButton`).style.transform = "rotate(0deg)"; + }, editorSettings.commonAnimation * 100); } function fuzzyMatch(str, pattern, accuracy) { @@ -734,7 +760,7 @@ function closeSearch() { actionView.style.scale = "1"; actionView.onclick = (event) => {}; actionView.style.borderRadius = "0px"; - actionView.style.height = "90vh"; + actionView.style.height = "84.5vh"; } function switchOutAction(actionFile) { @@ -747,7 +773,10 @@ function switchOutAction(actionFile) { document.getElementById("editorContent").innerHTML = ""; document.getElementById("editorContent").innerHTML = "
" + getUIelements(newAction.UI, action); - + + document.getElementById("action-name").innerHTML = + 'Editing ' + action.name + "
"; + document.getElementById('partOf').innerHTML = action.name; closeSearch(); } diff --git a/AppData/Kits/MiscScripts.js b/AppData/Kits/MiscScripts.js index 3a55ac1..9fcceda 100644 --- a/AppData/Kits/MiscScripts.js +++ b/AppData/Kits/MiscScripts.js @@ -256,9 +256,30 @@ function initSetup() {
Visuals
+
- +
Lights Off
+
Ultraviolet
+
Soothing Cherry
+
Strawberry
+
Bloodshot Pink
+
Wood
+
Golden Apple
+
Anger
+
Salmon
+
Lilac
+
Smoke
+
Gray
+
Garfield
+ + +
Shiny Forest
+
Navy Blue
+
Forest Green
+
Aquamarine
+
Moody Blue
+
Mint
Behaviour
diff --git a/AppData/presence.json b/AppData/presence.json index 7bf8b88..cae0ff2 100644 --- a/AppData/presence.json +++ b/AppData/presence.json @@ -1 +1 @@ -{"firstHeader":"Viewing Commands - 14 Commands in total","secondHeader":"Highlighted: eban - 5 actions","botName":"Studio Bot!"} \ No newline at end of file +{"firstHeader":"Viewing Commands - 12 Commands in total","secondHeader":"Highlighted: eban - 7 actions","botName":"Studio Bot!"} \ No newline at end of file diff --git a/EditorUI.html b/EditorUI.html index 1950d19..30a7d96 100644 --- a/EditorUI.html +++ b/EditorUI.html @@ -17,10 +17,14 @@ " id="everything_container" > +
+ +
+
-
Close
+
Save & Exit
- CTRL+TAB + CTRL+Q
@@ -285,10 +289,10 @@ actionUI = actionFile.UI; document.getElementById("action-name").innerHTML = 'Editing ' + action.name + "
"; + document.getElementById('partOf').innerHTML = action.name; document.getElementById("editorContent").innerHTML = `
` + getUIelements(actionUI, action); }); - function save() { for (let i in actionUI) { let element = actionUI[i]; diff --git a/index.html b/index.html index 100e35f..2f458a8 100644 --- a/index.html +++ b/index.html @@ -1,6 +1,22 @@ +
Studio Bot Maker
+
+ +
Settings
+
Project +
+
Export
+
Import
+
+ +
+
Start Bot
+
+
+ +