Greasy Fork is available in English.
07/08/2024 14:00:00
// ==UserScript== // @name Keno Race // @namespace Violentmonkey Scripts // @match https://stake*/* // @grant none // @version 2.0 // @author ConnorMcLeod // @description 07/08/2024 14:00:00 // @license MIT // ==/UserScript== let lastTextArea = null; setInterval(function() { let textarea = document.querySelector("#right-sidebar > div > div.footer.svelte-1g9csv6 > div.chat-input.svelte-15zhun5 > div > textarea"); if (textarea && textarea !== lastTextArea) { textarea.onkeyup = null; lastTextArea = textarea; textarea.onkeyup = (() => { if (location.href.includes('/casino/games/keno') && textarea.value.toLowerCase().startsWith("/race")) { textarea.value = ""; createBtn(); } }); } }, 200); function createBtn() { const btnTest = document.querySelector('button[ninouche="keno-race"]'); if (btnTest) { btnTest.remove(); } else { let gameSideBars = document.getElementsByClassName("game-sidebar"); if (gameSideBars.length) { const gameSideBar = gameSideBars[0]; const btn = Array.from(gameSideBar.getElementsByTagName('button')).at(-2).cloneNode(true); btn.setAttribute('ninouche', 'keno-race'); btn.textContent = "Keno Race"; btn.onclick = initKeno; gameSideBar.appendChild(btn); } } } let betButton = null; let observers = []; let szWinner = ""; function initKeno() { this.remove(); szWinner = ""; document.querySelector('button[data-testid="clear-table-button"]').click(); let names = []; do { szInput = prompt('Vérifie le montant du bet et tape les noms des joueurs (entre 2 et 5) séparés par des espaces\n\nNe rien écrire pour annuler'); if (!szInput.trim().length) { return; } if (szInput.startsWith('Winners: ')) { szInput = szInput.slice('Winners: '.length); } else if (szInput.startsWith('Congratulations ')) { szInput = szInput.slice('Congratulations '.length); szInput = szInput.split('! You won the')[0]; } szInput = szInput.replace(/\s\s/g, ' '); szInput = szInput.replace(/[@,]/g, ''); names = szInput.split(' '); } while (names.length < 2 || names.length > 5); let tiles = Array.from(document.getElementsByClassName('tile')); let tilesNumbers = Array.from(document.getElementsByClassName('tile-number')); tilesNumbers.forEach((t, i) => { t.textContent = Math.floor(i / 2) + 1; }); const startTilesDefault = [0, 8, 16, 24, 32]; const startTiles = startTilesDefault.slice(0, names.length); const endTiles = [7, 15, 23, 31, 39]; const covers = Array.from(document.getElementsByClassName('cover')); startTiles.forEach((e, i) => { covers[e].click(); tilesNumbers[2 * e].textContent = names[i]; tilesNumbers[2 * e + 1].textContent = names[i]; }); betButton = document.querySelector('button[data-test="bet-button"]'); const onTileChange = function (mutationsList) { matchingTiles = tiles.filter(e => e.classList.contains('is-match') && endTiles.includes( parseInt(e.getAttribute('data-index') ) )); if (matchingTiles.length === 1) { szWinner = matchingTiles[0].children[2].textContent; observers.forEach(e => e.disconnect()); } }; const onButtonChange = function (mutationsList) { if (betButton.getAttribute("data-test-action-enabled") === 'true') { let bPrinted = false; if (endTiles.some((e) => tiles[e].classList.contains('is-match'))) { observer.disconnect(); const speechSound = `Le gagnant est ${szWinner}`; const speechSoundSynthesis = new SpeechSynthesisUtterance(speechSound); speechSynthesis.speak(speechSoundSynthesis); alert(speechSound); } else { for (let l = 0; l < names.length; l++) { for (let i = 0; i <= 6; i++) { const index = l * 8 + i; if (tiles[index].classList.contains('is-match')) { tiles[index].click(); tilesNumbers[index * 2].textContent = index + 1; tilesNumbers[index * 2 + 1].textContent = index + 1; tiles[index + 1].click(); tilesNumbers[2 * (index + 1)].textContent = names[l]; tilesNumbers[2 * (index + 1) + 1].textContent = names[l]; if (i === 6) { const obs = new MutationObserver(onTileChange); observers.push(obs); const config = { attributeFilter: ["class"] }; obs.observe(tiles[index + 1], config); } break; } } } betButton.click(); } } }; betButton.click(); const observer = new MutationObserver(onButtonChange); const config = { attributeFilter: ["data-test-action-enabled"] }; observer.observe(betButton, config); }