HELL STUMBLECHAT SCRIPT
// ==UserScript== // @name HSS // @namespace http://tampermonkey.net/ // @version BETA2 // @description HELL STUMBLECHAT SCRIPT // @author MeKLiN // @match https://stumblechat.com/room/* // @icon https://www.google.com/s2/favicons?sz=64&domain=stumblechat.com // @grant none // @run-at document-end // @license MIT // ==/UserScript== (function() { let css = ` .message .nickname ~ .content { display: inline-block; top: -7px; position: relative; margin-left: 2px; margin-right: 1em; } .content + .content { display: inline-block!important; margin-right: 1em; } .message .nickname ~ .content span { line-height: 1.5em; } `; if (typeof GM_addStyle !== "undefined") { GM_addStyle(css); } else { let styleNode = document.createElement("style"); styleNode.appendChild(document.createTextNode(css)); (document.querySelector("head") || document.documentElement).appendChild(styleNode); } })(); var scripts = document.getElementsByTagName("script"); var script = null; var found = false; for (var i = 0; i < scripts.length; i++) { script = scripts[i]; if (/^jQuery.*\.js$/i.test(script.src)) { found = true; break; } } if (!found) { try { $ || jQuery || $ === jQuery; found = true; } catch (err) { } } if (!found) { // inject jQuery. script = document.createElement("script"); script.type = "text/javascript"; var protocol = /^https:/i.test(document.location) ? "https" : "http"; script.src = protocol + "://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"; document.getElementsByTagName("body")[0].appendChild(script); } // Define App globally window.App = { Init: () => { // Define the behavior of App.Init() here console.log('App.Init() called'); } }; class VerifyScript { constructor() { this.setupVerifyButton(); // Call the setupVerifyButton method first this.observeDOM(); this.setupConsoleOverlay(); this.clickCount = 0; } setupVerifyButton = () => { // Define the setupVerifyButton behavior here console.log('setupVerifyButton called'); } clickVerifyButton = (verifyButton) => { this.clickCount++; this.logToOverlay(`Attempting to click VERIFY button ${this.clickCount} time(s)...`); if (verifyButton) { this.logToOverlay('VERIFY button found.'); // Remove any existing event listeners on the button verifyButton.removeEventListener('click', this.clickVerifyButton); // Manually create and dispatch a click event const clickEvent = new MouseEvent('click', { bubbles: true, cancelable: true, view: window }); this.logToOverlay('Before dispatchEvent'); verifyButton.dispatchEvent(clickEvent); this.logToOverlay('After dispatchEvent'); if (this.clickCount < 3) { setTimeout(() => { if (this.isMouseLocked()) { this.sendMouseUp(); } this.clickVerifyButton(verifyButton); }, 500); // Delay between clicks } else if (this.clickCount === 3) { // After the third click, call App.Init() this.logToOverlay('Third click completed, calling App.Init()...'); setTimeout(() => { this.logToOverlay('Calling App.Init()...'); App.Init(); }, 500); // Adjust the delay as needed } } else { this.logToOverlay('VERIFY button not found.'); } } isMouseLocked = () => { return document.pointerLockElement === document.body || document.mozPointerLockElement === document.body || document.webkitPointerLockElement === document.body; } sendMouseUp = () => { this.logToOverlay('Mouse is locked, sending mouseup command...'); const mouseUpEvent = new MouseEvent('mouseup', { bubbles: true, cancelable: true, view: window }); document.body.dispatchEvent(mouseUpEvent); } observeDOM = () => { this.logToOverlay('Setting up MutationObserver...'); const observer = new MutationObserver((mutationsList) => { this.logToOverlay(`Mutation observed... ${mutationsList.length} mutation(s) in total.`); for (const mutation of mutationsList) { this.logToOverlay(`Mutation type: ${mutation.type}`); this.logToOverlay(`Mutation target: ${mutation.target.outerHTML}`); this.logToOverlay(`Added nodes: ${mutation.addedNodes.length}`); mutation.addedNodes.forEach((node) => { if (node instanceof HTMLElement) { this.logToOverlay(`Added node: ${node.nodeName}`); // Check if the added node is the VERIFY button if (node.id === 'interact') { // Add a slight delay to ensure modal visibility setTimeout(() => { // If so, click the button without scrolling this.clickVerifyButton(node); // Attempt other ways to click the button document.querySelector('#modal #interact').click(); // First attempt document.querySelector('#modal button#interact').click(); // Second attempt // Additional attempts node.click(); // Third attempt const customClickEvent = new CustomEvent('click', { bubbles: true }); node.dispatchEvent(customClickEvent); // Fourth attempt const mouseDownEvent = new MouseEvent('mousedown', { bubbles: true }); node.dispatchEvent(mouseDownEvent); const mouseUpEvent = new MouseEvent('mouseup', { bubbles: true }); node.dispatchEvent(mouseUpEvent); // Fifth attempt node.parentElement.click(); // Sixth attempt console.log(`Attempt ${this.clickCount + 6}: jQuery click`); $(node).trigger('click'); // Seventh attempt console.log(`Attempt ${this.clickCount + 7}: Focus and simulate Enter key`); node.focus(); const keyboardEvent = new KeyboardEvent('keydown', { key: 'Enter' }); node.dispatchEvent(keyboardEvent); // Eighth attempt const pointerDownEvent = new PointerEvent('pointerdown', { bubbles: true }); node.dispatchEvent(pointerDownEvent); const pointerUpEvent = new PointerEvent('pointerup', { bubbles: true }); node.dispatchEvent(pointerUpEvent); // Ninth attempt const touchEvent = new TouchEvent('touchstart', { bubbles: true }); node.dispatchEvent(touchEvent); // Tenth attempt }, 500); // Adjust the delay as needed } } }); } }); // Start observing changes in the sc-modal element this.logToOverlay('Attempting to observe sc-modal element...'); const scModal = document.querySelector('#modal'); if (scModal) { this.logToOverlay('sc-modal element found. Starting observation...'); observer.observe(scModal, { childList: true, subtree: true }); } else { this.logToOverlay('sc-modal element not found.'); } // Start observing changes in the chat content this.logToOverlay('Attempting to observe chat content...'); const chatContent = document.querySelector('#chat-content'); if (chatContent) { this.logToOverlay('Chat content found. Starting observation...'); observer.observe(chatContent, { childList: true }); } else { this.logToOverlay2('Chat content not found.'); } } setupConsoleOverlay = () => { const consoleOverlay = document.createElement('div'); consoleOverlay.setAttribute('id', 'console-overlay'); consoleOverlay.style.position = 'fixed'; consoleOverlay.style.top = '10px'; consoleOverlay.style.left = '10px'; consoleOverlay.style.backgroundColor = 'rgba(255, 255, 255, 0.9)'; consoleOverlay.style.padding = '10px'; consoleOverlay.style.border = '1px solid #ccc'; consoleOverlay.style.zIndex = '9999'; // Minimize button const minimizeButton = document.createElement('button'); minimizeButton.textContent = 'Minimize'; minimizeButton.style.position = 'absolute'; minimizeButton.style.top = '5px'; minimizeButton.style.right = '5px'; minimizeButton.addEventListener('click', () => { consoleOverlay.style.display = 'none'; }); consoleOverlay.appendChild(minimizeButton); document.body.appendChild(consoleOverlay); this.consoleOverlay = consoleOverlay; } logToOverlay = (message) => { const logEntry = document.createElement('div'); logEntry.textContent = message; if (this.consoleOverlay) { this.consoleOverlay.appendChild(logEntry); } console.log(message); } logToOverlay2 = (message, target = this.consoleOverlay2) => { const logEntry = document.createElement('div'); logEntry.textContent = message; if (target) { target.appendChild(logEntry); } console.log(message); } } // Start the script new VerifyScript(); // Create draggable div window for system messages const systemMessageWindow = document.createElement('div'); systemMessageWindow.classList.add('system-message-window'); systemMessageWindow.style.position = 'fixed'; systemMessageWindow.style.top = '120px'; systemMessageWindow.style.right = '20px'; systemMessageWindow.style.background = 'rgba(255, 255, 255, 0.9)'; systemMessageWindow.style.border = '1px solid #ccc'; systemMessageWindow.style.padding = '10px'; systemMessageWindow.style.cursor = 'move'; systemMessageWindow.style.maxWidth = '400px'; // Limit the width to prevent infinite length systemMessageWindow.innerHTML = 'Bot window'; // Make the window draggable let isDragging = false; let offsetX, offsetY; systemMessageWindow.addEventListener('mousedown', e => { isDragging = true; offsetX = e.clientX - systemMessageWindow.getBoundingClientRect().left; offsetY = e.clientY - systemMessageWindow.getBoundingClientRect().top; }); document.addEventListener('mousemove', e => { if (isDragging) { const x = e.clientX - offsetX; const y = e.clientY - offsetY; systemMessageWindow.style.left = `${x}px`; systemMessageWindow.style.top = `${y}px`; } }); document.addEventListener('mouseup', () => { isDragging = false; }); // Append the window to the body document.body.appendChild(systemMessageWindow); class SystemMessages { constructor() { this.setupSystemMessageWindow(); } setupSystemMessageWindow() { const systemMessageWindow = document.createElement('div'); systemMessageWindow.classList.add('message-window'); systemMessageWindow.classList.add('system-message-window'); systemMessageWindow.style.position = 'fixed'; systemMessageWindow.style.top = '20px'; systemMessageWindow.style.right = '20px'; systemMessageWindow.style.background = 'rgba(255, 255, 255, 0.9)'; systemMessageWindow.style.border = '1px solid #ccc'; systemMessageWindow.style.padding = '10px'; systemMessageWindow.style.cursor = 'move'; systemMessageWindow.style.maxWidth = '400px'; // Limit the width to prevent infinite length systemMessageWindow.style.overflowY = 'auto'; // Add scrollbar systemMessageWindow.style.maxHeight = '200px'; // Limit height to enable scrollbar systemMessageWindow.innerHTML = 'System Messages Window'; // Add auto-scroll functionality systemMessageWindow.addEventListener('DOMNodeInserted', () => { systemMessageWindow.scrollTop = systemMessageWindow.scrollHeight; }); // Minimize button const minimizeButton = document.createElement('button'); minimizeButton.textContent = 'Minimize'; minimizeButton.style.position = 'absolute'; minimizeButton.style.top = '5px'; minimizeButton.style.right = '5px'; minimizeButton.addEventListener('click', () => { systemMessageWindow.style.display = 'none'; }); systemMessageWindow.appendChild(minimizeButton); // Make the window draggable let isDragging = false; let offsetX, offsetY; systemMessageWindow.addEventListener('mousedown', e => { isDragging = true; const rect = systemMessageWindow.getBoundingClientRect(); offsetX = e.clientX - rect.left; offsetY = e.clientY - rect.top; }); document.addEventListener('mousemove', e => { if (isDragging) { const x = e.clientX - offsetX; const y = e.clientY - offsetY; const maxX = window.innerWidth - systemMessageWindow.offsetWidth; const maxY = window.innerHeight - systemMessageWindow.offsetHeight; systemMessageWindow.style.left = `${Math.min(Math.max(0, x), maxX)}px`; systemMessageWindow.style.top = `${Math.min(Math.max(0, y), maxY)}px`; } }); document.addEventListener('mouseup', () => { isDragging = false; }); // Append the window to the body document.body.appendChild(systemMessageWindow); // Observe mutations in the chat content const observer = new MutationObserver(mutationsList => { mutationsList.forEach(mutation => { mutation.addedNodes.forEach(node => { if (node instanceof HTMLElement && node.classList.contains('message') && node.classList.contains('system')) { // Move the system message to the system message window const messageText = node.innerText.trim(); const messageElement = document.createElement('div'); messageElement.textContent = messageText; systemMessageWindow.appendChild(messageElement); // Hide the system message in the main chat box node.style.display = 'none'; } }); }); }); const chatContent = document.querySelector('#chat-content'); if (chatContent) { observer.observe(chatContent, { childList: true }); } else { console.error('Chat content not found.'); } } } // Start the SystemMessages script new SystemMessages(); class UserMessages { constructor() { this.setupUserMessageWindow(); } setupUserMessageWindow() { const userMessageWindow = document.createElement('div'); userMessageWindow.classList.add('message-window'); userMessageWindow.classList.add('user-message-window'); userMessageWindow.style.position = 'fixed'; userMessageWindow.style.top = '20px'; userMessageWindow.style.left = '20px'; // Adjusted position for user messages userMessageWindow.style.background = 'rgba(255, 255, 255, 0.9)'; userMessageWindow.style.border = '1px solid #ccc'; userMessageWindow.style.padding = '10px'; userMessageWindow.style.cursor = 'move'; userMessageWindow.style.maxWidth = '400px'; // Limit the width to prevent infinite length userMessageWindow.style.overflowY = 'auto'; // Add scrollbar userMessageWindow.style.maxHeight = '200px'; // Limit height to enable scrollbar userMessageWindow.innerHTML = 'User Messages Window'; // Add auto-scroll functionality userMessageWindow.addEventListener('DOMNodeInserted', () => { userMessageWindow.scrollTop = userMessageWindow.scrollHeight; }); // Minimize button const minimizeButton = document.createElement('button'); minimizeButton.textContent = 'Minimize'; minimizeButton.style.position = 'absolute'; minimizeButton.style.top = '5px'; minimizeButton.style.right = '5px'; minimizeButton.addEventListener('click', () => { userMessageWindow.style.display = 'none'; }); userMessageWindow.appendChild(minimizeButton); // Make the window draggable let isDragging = false; let offsetX, offsetY; userMessageWindow.addEventListener('mousedown', e => { isDragging = true; const rect = userMessageWindow.getBoundingClientRect(); offsetX = e.clientX - rect.left; offsetY = e.clientY - rect.top; }); document.addEventListener('mousemove', e => { if (isDragging) { const x = e.clientX - offsetX; const y = e.clientY - offsetY; const maxX = window.innerWidth - userMessageWindow.offsetWidth; const maxY = window.innerHeight - userMessageWindow.offsetHeight; userMessageWindow.style.left = `${Math.min(Math.max(0, x), maxX)}px`; userMessageWindow.style.top = `${Math.min(Math.max(0, y), maxY)}px`; } }); document.addEventListener('mouseup', () => { isDragging = false; }); // Append the window to the body document.body.appendChild(userMessageWindow); // Observe mutations in the chat content const observer = new MutationObserver(mutationsList => { mutationsList.forEach(mutation => { mutation.addedNodes.forEach(node => { if (node instanceof HTMLElement && node.classList.contains('message') && node.classList.contains('common')) { // Check if the added node is a common message and from the user "u_u" const nicknameElement = node.querySelector('.nickname'); if (nicknameElement && nicknameElement.innerText.trim() === 'u_u') { const messageText = node.innerText.trim(); const messageElement = document.createElement('div'); messageElement.textContent = messageText; userMessageWindow.appendChild(messageElement); // Hide the user's message in the main chat box node.style.display = 'none'; } } }); }); }); const chatContent = document.querySelector('#chat-content'); if (chatContent) { observer.observe(chatContent, { childList: true }); } else { console.error('Chat content not found.'); } } } // Start the UserMessages script new UserMessages();