From 619cdb9c4cacfd1128beeafa6080c5923bf105c6 Mon Sep 17 00:00:00 2001
From: nuttylmao <76841561+nuttylmao@users.noreply.github.com>
Date: Mon, 22 Sep 2025 04:39:20 +1000
Subject: [PATCH] Revert "Merge Beta to Main"
---
.common/core/widget-dock-core/index.html | 88 --
.common/core/widget-dock-core/script.js | 299 -------
.common/core/widget-dock-core/style.css | 147 ----
.common/resources/logo.png | Bin 212325 -> 0 bytes
.common/resources/streamer.bot.png | Bin 30881 -> 0 bytes
.common/styles/global.css | 370 --------
.old/multistream-title-updater/connected.svg | 7 -
.../disconnected.svg | 7 -
.old/multistream-title-updater/index.html | 81 --
.old/multistream-title-updater/script.js | 444 ----------
.templates/obs-dock/config.json | 6 -
.templates/obs-dock/contents/index.html | 14 -
.templates/obs-dock/contents/script.js | 45 -
.templates/obs-dock/contents/style.css | 3 -
.templates/obs-dock/index.html | 20 -
.templates/obs-dock/script.js | 16 -
multistream-title-updater/config.json | 18 -
.../connected.svg | 0
.../icons/platforms/youtube-shorts.png | Bin 76351 -> 0 bytes
multistream-title-updater/contents/index.html | 228 -----
multistream-title-updater/contents/script.js | 546 ------------
multistream-title-updater/contents/style.css | 85 --
.../disconnected.svg | 0
.../icons.afdesign | Bin
multistream-title-updater/index.html | 87 +-
.../info.svg | 0
.../requiredActions.txt | 6 +-
multistream-title-updater/script.js | 452 +++++++++-
.../style.css | 0
.../twitch.png | Bin
.../youtube.png | Bin
printer-bot/config.json | 14 -
.../contents/icons/platforms/.old/kick.png | Bin 1169 -> 0 bytes
.../contents/icons/platforms/.old/twitch.png | Bin 4015 -> 0 bytes
.../contents/icons/platforms/.old/youtube.png | Bin 8618 -> 0 bytes
printer-bot/contents/icons/platforms/kick.png | Bin 3056 -> 0 bytes
.../contents/icons/platforms/twitch.png | Bin 40856 -> 0 bytes
.../contents/icons/platforms/youtube.png | Bin 31113 -> 0 bytes
printer-bot/contents/index.html | 76 --
printer-bot/contents/script.js | 790 -----------------
printer-bot/contents/style.css | 78 --
.../icons/platforms/kick.png | Bin
.../icons/platforms/kofi.png | Bin
.../icons/platforms/patreon.png | Bin
.../icons/platforms/tiktok.png | Bin
.../icons/platforms/tipeeeStream.png | Bin
.../icons/platforms/twitch.png | Bin
.../icons/platforms/youtube.png | Bin
printer-bot/index.html | 55 +-
printer-bot/script.js | 812 +++++++++++++++++-
printer-bot/style.css | 127 +++
51 files changed, 1486 insertions(+), 3435 deletions(-)
delete mode 100644 .common/core/widget-dock-core/index.html
delete mode 100644 .common/core/widget-dock-core/script.js
delete mode 100644 .common/core/widget-dock-core/style.css
delete mode 100644 .common/resources/logo.png
delete mode 100644 .common/resources/streamer.bot.png
delete mode 100644 .common/styles/global.css
delete mode 100644 .old/multistream-title-updater/connected.svg
delete mode 100644 .old/multistream-title-updater/disconnected.svg
delete mode 100644 .old/multistream-title-updater/index.html
delete mode 100644 .old/multistream-title-updater/script.js
delete mode 100644 .templates/obs-dock/config.json
delete mode 100644 .templates/obs-dock/contents/index.html
delete mode 100644 .templates/obs-dock/contents/script.js
delete mode 100644 .templates/obs-dock/contents/style.css
delete mode 100644 .templates/obs-dock/index.html
delete mode 100644 .templates/obs-dock/script.js
delete mode 100644 multistream-title-updater/config.json
rename {.common/core/widget-dock-core/icons => multistream-title-updater}/connected.svg (100%)
delete mode 100644 multistream-title-updater/contents/icons/platforms/youtube-shorts.png
delete mode 100644 multistream-title-updater/contents/index.html
delete mode 100644 multistream-title-updater/contents/script.js
delete mode 100644 multistream-title-updater/contents/style.css
rename {.common/core/widget-dock-core/icons => multistream-title-updater}/disconnected.svg (100%)
rename {.old/multistream-title-updater => multistream-title-updater}/icons.afdesign (100%)
rename {.old/multistream-title-updater => multistream-title-updater}/info.svg (100%)
rename {.old/multistream-title-updater => multistream-title-updater}/requiredActions.txt (98%)
rename {.old/multistream-title-updater => multistream-title-updater}/style.css (100%)
rename {.old/multistream-title-updater => multistream-title-updater}/twitch.png (100%)
rename {.old/multistream-title-updater => multistream-title-updater}/youtube.png (100%)
delete mode 100644 printer-bot/config.json
delete mode 100644 printer-bot/contents/icons/platforms/.old/kick.png
delete mode 100644 printer-bot/contents/icons/platforms/.old/twitch.png
delete mode 100644 printer-bot/contents/icons/platforms/.old/youtube.png
delete mode 100644 printer-bot/contents/icons/platforms/kick.png
delete mode 100644 printer-bot/contents/icons/platforms/twitch.png
delete mode 100644 printer-bot/contents/icons/platforms/youtube.png
delete mode 100644 printer-bot/contents/index.html
delete mode 100644 printer-bot/contents/script.js
delete mode 100644 printer-bot/contents/style.css
rename {multistream-title-updater/contents => printer-bot}/icons/platforms/kick.png (100%)
rename {multistream-title-updater/contents => printer-bot}/icons/platforms/kofi.png (100%)
rename {multistream-title-updater/contents => printer-bot}/icons/platforms/patreon.png (100%)
rename {multistream-title-updater/contents => printer-bot}/icons/platforms/tiktok.png (100%)
rename {multistream-title-updater/contents => printer-bot}/icons/platforms/tipeeeStream.png (100%)
rename {multistream-title-updater/contents => printer-bot}/icons/platforms/twitch.png (100%)
rename {multistream-title-updater/contents => printer-bot}/icons/platforms/youtube.png (100%)
create mode 100644 printer-bot/style.css
diff --git a/.common/core/widget-dock-core/index.html b/.common/core/widget-dock-core/index.html
deleted file mode 100644
index 85038fd..0000000
--- a/.common/core/widget-dock-core/index.html
+++ /dev/null
@@ -1,88 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.common/core/widget-dock-core/script.js b/.common/core/widget-dock-core/script.js
deleted file mode 100644
index bdbbff8..0000000
--- a/.common/core/widget-dock-core/script.js
+++ /dev/null
@@ -1,299 +0,0 @@
-////////////////
-// PARAMETERS //
-////////////////
-
-const queryString = window.location.search;
-const urlParams = new URLSearchParams(queryString);
-
-const configJson = urlParams.get("config") || "";
-
-
-///////////////////
-// PAGE ELEMENTS //
-///////////////////
-
-const sbConnectDialog = document.getElementById('sb-connect-dialog');
-const sbAddressInput = document.getElementById('sb-address');
-const sbPortInput = document.getElementById('sb-port');
-const sbPasswordInput = document.getElementById('sb-password');
-const sbErrorLabel = document.getElementById('sb-error-label');
-
-const sbRequiredActionsDialog = document.getElementById('sb-required-actions-dialog');
-const sbRequiredActionsSuccessLabel = document.getElementById('sb-required-actions-success');
-const sbRequiredActionsFailureLabel = document.getElementById('sb-required-actions-failure');
-const sbRequiredActionsFailureSubtext = document.getElementById('sb-required-actions-failure-subtext');
-
-const sbRequiredActionsList = document.getElementById('sb-required-actions-list');
-const sbImportCodeLabel = document.getElementById('sb-import-code');
-const sbImportCopyButton = document.getElementById('sb-import-copy-button');
-
-const sbActionsButton = document.getElementById('sb-actions-button');
-const sbStatusButton = document.getElementById('sb-status-button');
-const sbStatusIcon = document.getElementById('sb-status-icon');
-
-const blurLayer = document.getElementById('blur-layer');
-
-const contentIFrame = document.getElementById('content');
-
-
-//////////////////////
-// GLOBAL VARIABLES //
-//////////////////////
-
-let sbClientListeners;
-
-
-
-/////////////////////////
-// STREAMER.BOT CLIENT //
-/////////////////////////
-
-// Check local storage
-if (localStorage.getItem('sbServerAddress') === null)
- localStorage.setItem('sbServerAddress', '127.0.0.1');
-if (localStorage.getItem('sbServerPort') === null)
- localStorage.setItem('sbServerPort', '8080');
-
-sbAddressInput.value = localStorage.getItem('sbServerAddress');
-sbPortInput.value = localStorage.getItem('sbServerPort');
-sbPasswordInput.value = localStorage.getItem('sbServerPassword');
-
-const sbServerAddress = sbAddressInput.value;
-const sbServerPort = sbPortInput.value;
-const sbServerPassword = sbPasswordInput.value;
-
-sbClient = new StreamerbotClient({
- host: sbServerAddress,
- port: sbServerPort,
- password: sbServerPassword,
- immediate: true,
-
- onConnect: (data) => {
- console.log(`Streamer.bot successfully connected to ${sbServerAddress}:${sbServerPort}`)
- console.debug(data);
-
- SetConnectionState(true);
-
- // Notify iframe
- contentIFrame.addEventListener("load", () => {
- NotifyTheContentIFrameThatSBHasConnectedSuccessfullySoItCanDoStuff(data);
- });
- NotifyTheContentIFrameThatSBHasConnectedSuccessfullySoItCanDoStuff();
-
- // Idk why but listeners get cleared when re-connecting, so copy them back in
- if (sbClientListeners)
- sbClient.listeners = sbClientListeners;
- },
-
- onDisconnect: () => {
- console.error(`Streamer.bot disconnected from ${sbServerAddress}:${sbServerPort}`)
- SetConnectionState(false);
- },
-
- onError: (err) => {
- console.error(`Streamer.bot disconnected from ${sbServerAddress}:${sbServerPort}`)
- SetErrorMessage(err);
- }
-});
-
-function SetConnectionState(isConnected) {
- if (isConnected) {
- localStorage.setItem('sbServerAddress', sbAddressInput.value);
- localStorage.setItem('sbServerPort', sbPortInput.value);
- localStorage.setItem('sbServerPassword', sbPasswordInput.value);
-
- sbConnectDialog.style.display = "none";
- blurLayer.style.display = "none";
- sbErrorLabel.style.display = 'none';
- sbStatusIcon.src = 'icons/connected.svg';
-
- sbStatusButton.title = `Connected to ${sbClient.info.name} (${sbClient.info.version})`;
-
- // Check required actions
- CheckRequiredActions();
- }
- else {
- sbConnectDialog.style.display = "flex";
- blurLayer.style.display = "block";
- sbStatusIcon.src = 'icons/disconnected.svg';
-
- SetErrorMessage('Disconnected from Streamer.bot');
- }
-}
-
-function SetErrorMessage(error) {
- sbErrorLabel.textContent = error;
- sbErrorLabel.style.display = 'block';
-}
-
-
-
-////////////
-// CONFIG //
-////////////
-
-if (configJson) {
- // Set the header/title of the page
- fetch(configJson)
- .then(res => res.json())
- .then(config => {
- const root = document.documentElement;
- const domain = getComputedStyle(root).getPropertyValue('--domain').trim();
-
- // Set the page title
- parent.document.title = `${domain} • ${config.title}`;
-
- // Set the title label
- title.textContent = config.title;
- })
- .catch(err => console.error('Failed to load config:', err));
-}
-
-async function CheckRequiredActions() {
- if (configJson) {
- console.debug('Checking required actions...')
-
- // Set the header/title of the page
- fetch(configJson)
- .then(res => res.json())
- .then(async config => {
- // Clear the required actions list
- const sbRequiredActionsList = document.getElementById('sb-required-actions-list');
- sbRequiredActionsList.innerHTML = '';
-
- // Set the import code
- sbImportCodeLabel.textContent = config.sbImportCode;
-
- // Assume all actions are found
- SetRequiredActionState(true);
-
- // Check each required action
- if (config.requiredSbActions) {
- // Get a full list of actions currently installed in Streamer.bot
- const response = await sbClient.getActions();
-
- // Iterate over required SB actions and check if they're present
- config.requiredSbActions.forEach(req => {
- const exists = response.actions.some(act => act.id === req.id);
-
- console.debug(`${req.name}: ${exists ? 'Found' : 'Missing'}`)
-
- // As soon as one is found that doesn't exist, throw up warning
- if (!exists)
- SetRequiredActionState(false);
-
- // container div
- const item = document.createElement('div');
- item.className = 'sb-required-action';
-
- // name label
- const nameLabel = document.createElement('label');
- nameLabel.textContent = req.name;
-
- // status label
- const statusLabel = document.createElement('label');
- statusLabel.className = 'sb-required-action-found';
- //statusLabel.textContent = exists ? '✅' : '❌';
- statusLabel.textContent = exists ? 'Found' : 'Missing';
- statusLabel.style.color = exists ? '#00d26a' : '#f92f60';
- statusLabel.style.fontWeight = 500;
-
- // append labels to div
- item.appendChild(nameLabel);
- item.appendChild(statusLabel);
-
- // append div to list
- sbRequiredActionsList.appendChild(item);
- });
- }
- else {
- // There are no required actions, so hide the button
- sbActionsButton.style.display = 'none';
- }
- })
- .catch(err => console.error('Failed to load config:', err));
- }
-}
-
-function SetRequiredActionState(isSuccess) {
- if (isSuccess) {
- sbRequiredActionsSuccessLabel.style.display = 'block';
- sbRequiredActionsFailureLabel.style.display = 'none';
- sbRequiredActionsFailureSubtext.style.display = 'none';
-
- sbActionsButton.title = `All actions found`;
-
- sbActionsButton.textContent = '✅';
- }
- else {
- sbRequiredActionsSuccessLabel.style.display = 'none';
- sbRequiredActionsFailureLabel.style.display = 'block';
- sbRequiredActionsFailureSubtext.style.display = 'block';
-
- sbActionsButton.title = `You are missing Streamer.bot actions`;
-
- sbActionsButton.textContent = '⚠️';
-
- OpenRequiredActionsDialog();
- }
-}
-
-
-///////////////////////
-// PAGE INTERACTIONS //
-///////////////////////
-
-function Connect() {
- sbClientListeners = sbClient.listeners;
- sbClient.options.host = sbAddressInput.value;
- sbClient.options.port = sbPortInput.value;
- sbClient.options.password = sbPasswordInput.value;
- sbClient.connect();
-}
-
-function CopyImportCode() {
- const textToCopy = sbImportCodeLabel.textContent;
- navigator.clipboard.writeText(textToCopy)
- .then(() => {
- console.debug('Copied to clipboard!');
-
- // Click feedback
- const root = document.documentElement;
- const successColor = getComputedStyle(root).getPropertyValue('--success-color').trim();
- const buttonColor = getComputedStyle(root).getPropertyValue('--button-color').trim();
- sbImportCopyButton.textContent = 'Copied!';
- sbImportCopyButton.style.background = successColor;
- setTimeout(() => {
- sbImportCopyButton.textContent = 'Copy';
- sbImportCopyButton.style.background = buttonColor;
- }, 1500);
- })
- .catch(err => console.error('Failed to copy text: ', err));
-}
-
-function OpenConnectDialog() {
- sbConnectDialog.style.display = "flex";
- blurLayer.style.display = "block";
-}
-
-function ClosenConnectDialog() {
- sbConnectDialog.style.display = "none";
- blurLayer.style.display = "none";
-}
-
-function OpenRequiredActionsDialog() {
- sbRequiredActionsDialog.style.display = "flex";
- blurLayer.style.display = "block";
-}
-
-function CloseRequiredActionsDialog() {
- sbRequiredActionsDialog.style.display = "none";
- blurLayer.style.display = "none";
-}
-
-function NotifyTheContentIFrameThatSBHasConnectedSuccessfullySoItCanDoStuff(data) {
- contentIFrame.contentWindow.postMessage(
- { type: "sbClientConnected", data },
- "*" // replace with iframe origin for security if needed
- );
-}
\ No newline at end of file
diff --git a/.common/core/widget-dock-core/style.css b/.common/core/widget-dock-core/style.css
deleted file mode 100644
index a9f0f03..0000000
--- a/.common/core/widget-dock-core/style.css
+++ /dev/null
@@ -1,147 +0,0 @@
-html,
-body {
- height: 100%;
- display: flex;
- flex-direction: column;
-}
-
-/* Needed to force correct emoji representation */
-span {
- font-family: "Segoe UI Emoji", "Apple Color Emoji", "Noto Color Emoji", sans-serif;
-}
-
-
-
-/**************/
-/*** HEADER ***/
-/**************/
-
-#header {
- display: flex;
- flex-direction: row;
- align-items: center;
- padding: 0em 1em;
- gap: 1em;
- box-shadow: 0 0 10px rgba(0, 0, 0, 1);
- z-index: 1;
-}
-
-#header-end {
- margin-left: auto;
- align-items: center;
- display: flex;
- flex-direction: row;
-}
-
-
-
-/*********************/
-/*** PAGE CONTENTS ***/
-/*********************/
-
-#content {
- flex: 1;
- overflow: auto;
-}
-
-
-
-/********************************/
-/*** STREAMER.BOT CONNECT BOX ***/
-/********************************/
-
-#sb-required-actions-dialog {
- max-width: 80%;
- max-height: 80%;
- overflow: auto;
- display: none;
-}
-
-#sb-connect-dialog {
- max-width: 90%;
- /* never wider than 90% of viewport */
- width: 90%;
- /* scale with window */
- max-height: 90vh;
- /* never taller than 90% of viewport */
- overflow-y: auto;
- /* vertical scroll if content overflows */
- overflow-x: hidden;
- /* prevent horizontal scroll */
- box-sizing: border-box;
- /* include padding in width/height */
-}
-
-#sb-connect-dialog {
- width: 90%;
- max-width: 30em;
- max-height: 90vh;
- overflow-y: auto;
- overflow-x: hidden;
- box-sizing: border-box;
- position: fixed;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- padding: 1em;
-}
-
-#sb-connect-dialog>div:nth-of-type(2) {
- display: flex;
- gap: 1em;
-}
-
-#sb-connect-dialog .field {
- flex: 1;
- min-width: 0;
-}
-
-#sb-connect-button:enabled:hover {
- background-color: #3be477;
-}
-
-#sb-error-label {
- background: var(--error-background);
- border-radius: 0.5em;
- padding: 1em;
- color: var(--error-color);
- display: none;
-}
-
-
-
-/******************************************/
-/*** STREAMER.BOT REQUIRED ACTIONS LIST ***/
-/******************************************/
-
-.sb-required-action {
- display: flex;
- flex-direction: row;
- align-items: center;
- gap: 1em;
-}
-
-.sb-required-action-found {
- margin-left: auto;
-}
-
-#sb-import-code {
- white-space: nowrap;
- overflow-x: auto;
- overflow-y: hidden;
- width: 100%;
- font-family: monospace;
- font-size: 1em;
- padding: 0.5em;
-}
-
-#sb-import-wrapper {
- display: flex;
- align-items: center;
- gap: 0.5em;
- max-width: 30em;
-}
-
-#sb-import-copy-button {
- width: auto;
-}
\ No newline at end of file
diff --git a/.common/resources/logo.png b/.common/resources/logo.png
deleted file mode 100644
index 0d8a815da2ed34a995df1de0703ba9378ee853b2..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 212325
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