Auto-start new chat on disconnect and keep chat input focused.
目前為
// ==UserScript==
// @name Emerald Auto Next
// @namespace https://greasyfork.org/
// @version 1.2
// @description Auto-start new chat on disconnect and keep chat input focused.
// @author Zach
// @license Apache-2.0
// @icon https://emeraldchat.com/logo7.svg
// @match https://emeraldchat.com/app
// @grant none
// @compatible Firefox
// @compatible Violentmonkey
// ==/UserScript==
'use strict';
function randomTimeout(min, max) {
const minMs = min * 1000;
const maxMs = max * 1000;
return Math.floor(Math.random() * (maxMs - minMs + 1)) + minMs;
}
function simulateClick(element) {
const mouseDown = new MouseEvent('mousedown', { bubbles: true, cancelable: true });
const mouseUp = new MouseEvent('mouseup', { bubbles: true, cancelable: true });
const clickEvent = new MouseEvent('click', { bubbles: true, cancelable: true });
element.dispatchEvent(mouseDown);
element.dispatchEvent(mouseUp);
element.dispatchEvent(clickEvent);
}
function giveKarma() {
const [good, bad] = document.querySelectorAll("a.ui-button-match-mega");
if (!good || !bad) return;
const messages = document.querySelectorAll("#messages > .room-component-message-container").length;
if (messages > 3) {
simulateClick(good);
}
else {
simulateClick(bad);
}
}
function nextChat() {
const startButton = document.querySelector(".ui-button-match");
if (!startButton) return;
if (startButton.textContent === "Start") {
setTimeout(() => simulateClick(startButton), 1500);
}
}
function focusChat() {
const chatInput = document.getElementById("room-input");
if (!chatInput) return;
document.body.addEventListener("keydown", () => {
if (!document.querySelector("#ui-hatch > *, #ui-hatch-2 > *, #interests")) {
chatInput.focus();
}
}, { once: true });
}
function observeChanges() {
const container = document.getElementById("container");
if (!container) return;
const observer = new MutationObserver(() => {
giveKarma();
nextChat();
focusChat();
});
observer.observe(container, { childList: true, subtree: true });
}
window.onload = () => {
observeChanges();
};