HSS

HELL STUMBLECHAT SCRIPT

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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();