您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Right-click on a full lobby to auto-refresh and join when there's a spot available.
// ==UserScript== // @name Sketchful Auto Join // @namespace https://greasyfork.org/users/281093 // @match https://sketchful.io/* // @grant none // @version 1.2 // @author Bell // @description Right-click on a full lobby to auto-refresh and join when there's a spot available. // jshint esversion: 6 // ==/UserScript== const refreshInterval = 500; // Refresh interval, in milliseconds (function requestPermission() { if (Notification.permission === "granted") { console.log("Notifications allowed, Sketchful Auto Join loaded"); } else { Notification.requestPermission() .then(result => { console.log(result); }); } })(); window.onfocus = () => { sessionStorage.setItem('tabFocus', '1'); }; window.onblur = () => { sessionStorage.setItem('tabFocus', '0'); }; const lobbiesTable = document.querySelector("#menuLobbiesTable"); const menuNav = document.querySelector("#menu > div.menuNav > ul"); let refreshing = false; const config = { attributes: false, childList: true, subtree: true }; const onLobbyRefresh = function(mutationsList, observer) { for (let mutation of mutationsList) { let newNode = mutation.addedNodes[0]; if (newNode.classList.contains("table")) { updateLobbies(newNode.querySelectorAll(".menuLobbiesRoom")); } } }; const lobbyObserver = new MutationObserver(onLobbyRefresh); lobbyObserver.observe(lobbiesTable, config); lobbiesTable.addEventListener("contextmenu", setActiveLobby, false); lobbiesTable.addEventListener("click", clearActiveLobby, false); menuNav.addEventListener("click", clearActiveLobby, true); let activeLobby = null; function setActiveLobby(e) { e.preventDefault(); let lobby = e.target.parentNode; try { const hash = getLobbyHash(lobby); if (!activeLobby && isLobbyFull(lobby)) { activeLobby = hash; refreshLobbies(); } else { clearActiveLobby(); } } catch (error) { clearActiveLobby(); } } function clearActiveLobby() { if (activeLobby) { activeLobby = null; window.clearTimeout(this.refreshingID); refreshLobbies(); } } function refreshLobbies() { document.querySelector("#menuLobbiesRefresh").click(); } function isLobbyFull(lobby) { const capacity = getLobbyCapacity(lobby); return capacity.current >= capacity.max; } function getLobbyCapacity(lobby) { const capacityRegexp = /<td>(\d+)\/(\d+)<\/td>/; const capacityMatch = lobby.innerHTML.match(capacityRegexp); return { current: parseInt(capacityMatch[1]), max: parseInt(capacityMatch[2]) }; } function getLobbyHash(lobby) { const hashRegexp = /lobbyConnect\([^#]+(#[\w]+)/; return lobby.outerHTML.match(hashRegexp)[1]; } function notify() { if (Notification.permission === "granted") { let notification = new Notification("Joined", { icon: "https://sketchful.io/res/logo/pencils%20optimized.png", body: "Click the notification to return to the game.", requireInteraction: true, }); notification.onclick = function() { window.focus(); notification.close(); }; } else { console.log("Notifications are blocked."); } } function tryToJoin(lobby) { if (isLobbyFull(lobby)) { console.log(activeLobby + " is full, refreshing"); console.log(getLobbyCapacity(lobby)); this.refreshingID = window.setTimeout(refreshLobbies, refreshInterval); } else { console.log("Joining " + activeLobby); lobbyConnect(activeLobby); let focus = parseInt(sessionStorage.getItem('tabFocus')); console.log("AUOT JOIN NOTIFIC", focus); if (!focus) { notify(); } clearActiveLobby(); } } function updateLobbies(lobbies) { if (activeLobby) { for (let lobby of lobbies) { if (getLobbyHash(lobby) === activeLobby) { lobby.style.backgroundColor = "pink"; tryToJoin(lobby); } } } else { console.log("No active lobby"); } }