您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
For TornPDA: Places a Torn-styled block with random selection buttons fixed over the interface so that it is not hidden by the matched numbers panel.
// ==UserScript== // @name Torn Keno Random Selector (TornPDA Version) // @namespace https://greasyfork.org/en/scripts/531078-torn-keno-random-selector // @version 03.28.2025.20.00 // @description For TornPDA: Places a Torn-styled block with random selection buttons fixed over the interface so that it is not hidden by the matched numbers panel. // @author KillerCleat // @match https://www.torn.com/page.php?sid=keno* // @grant none // @license MIT License // ==/UserScript== (function() { 'use strict'; // Utility: Randomly select 'count' unique elements from an array. function getRandomElements(arr, count) { const arrCopy = [...arr]; const result = []; for (let i = 0; i < count; i++) { if (arrCopy.length === 0) break; const index = Math.floor(Math.random() * arrCopy.length); result.push(arrCopy[index]); arrCopy.splice(index, 1); } return result; } // Inject CSS for the TornPDA version – fixed positioning with a high z-index. function injectStyles() { const style = document.createElement('style'); style.innerHTML = ` /* Our container is fixed, centered horizontally, with high z-index to overlay the win sheet */ #randomButtonsContainer { position: fixed !important; top: 250px !important; /* Adjust this value to push the block down further */ left: 50% !important; transform: translateX(-50%) !important; z-index: 999999 !important; width: auto; text-align: center; } /* Torn-styled text */ #randomButtonsContainer .desc p { margin: 0; padding: 0; font-size: 14px; font-weight: bold; } /* Force the buttons to be in one horizontal row */ #randomButtonsContainer .cancel-btn-wrap { display: inline-block; white-space: nowrap; margin-top: 5px; } /* Minor spacing for each button */ .btn-wrap.orange { display: inline-block; margin: 0 5px 5px 0; } `; document.head.appendChild(style); } // Create the Torn-styled block (text + row of buttons). function createRandomButtons() { if (document.getElementById('randomButtonsContainer')) return; // Outer container using Torn's "cancel" class. const container = document.createElement('div'); container.id = 'randomButtonsContainer'; container.className = 'cancel'; // Description text (using Torn's "desc" class). const desc = document.createElement('div'); desc.className = 'desc'; desc.tabIndex = 0; desc.innerHTML = '<p>Select how many random numbers to pick:</p>'; container.appendChild(desc); // Wrapper for the buttons. const cancelBtnWrap = document.createElement('div'); cancelBtnWrap.className = 'cancel-btn-wrap'; container.appendChild(cancelBtnWrap); // Create 10 Torn-styled buttons (1–10) in one row. for (let i = 1; i <= 10; i++) { const btnWrap = document.createElement('div'); btnWrap.className = 'btn-wrap orange'; const btnDiv = document.createElement('div'); btnDiv.className = 'btn'; const button = document.createElement('button'); button.className = 'torn-btn orange'; button.setAttribute('aria-label', `Select ${i}`); button.setAttribute('data-count', i); button.textContent = i; btnDiv.appendChild(button); btnWrap.appendChild(btnDiv); cancelBtnWrap.appendChild(btnWrap); } // Append the container directly to the body. document.body.appendChild(container); // Attach click handlers: simulate click on board numbers so Torn marks them. const boardSpans = document.querySelectorAll('#boardContainer span'); const allButtons = container.querySelectorAll('button'); allButtons.forEach(btn => { btn.addEventListener('click', function() { const count = parseInt(this.getAttribute('data-count'), 10); const unmarkedSpans = Array.from(boardSpans).filter( span => !span.classList.contains('marked') ); if (unmarkedSpans.length < count) { alert(`Not enough unmarked numbers available. Only ${unmarkedSpans.length} left.`); return; } const selectedSpans = getRandomElements(unmarkedSpans, count); selectedSpans.forEach(span => span.click()); }); }); } // Poll for the Keno board to be available, then create our container. function waitForKenoElements() { const boardContainer = document.getElementById('boardContainer'); if (boardContainer) { createRandomButtons(); clearInterval(checkInterval); } } injectStyles(); const checkInterval = setInterval(waitForKenoElements, 500); })();