您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Let you to see Diep.io online and select servers!
// ==UserScript== // @name Advanced Servers Selector for Diep.io // @version 1.0.4 // @description Let you to see Diep.io online and select servers! // @author @jaja.morgan // @match https://diep.io/* // @grant GM_addStyle // @license MIT // @namespace *://diep.io/ // ==/UserScript== const toggleKeys = ["t", "е"]; // toggle hotKeys const refreshTiming = 60; // autoRefresing in seconds let users_lsData = getUserLSData(); const SVGS = { sgp: `<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-sg" viewBox="0 0 512 512"> <defs> <clipPath id="sg-a"> <path fill-opacity=".7" d="M27.7 0h708.6v708.7H27.7z"></path> </clipPath> </defs> <g fill-rule="evenodd" clip-path="url(#sg-a)" transform="translate(-20) scale(.72249)"> <path fill="#fff" d="M0 0h1063v708.7H0z"></path> <path fill="#df0000" d="M0 0h1063v354.3H0z"></path> <path fill="#fff" d="M245.2 59.4a124.6 124.6 0 0 0 1.1 243.9 126.9 126.9 0 1 1-1.1-243.9z"></path> <path fill="#fff" d="m202 162.4-18.9-13.8 23.5-.2 7.2-22.3 7.5 22.3h23.4l-18.8 14 7.2 22.3L214 171l-19 13.8zm26 76.9-19-13.8 23.5-.2 7.3-22.3 7.4 22.2h23.5l-19 14 7.3 22.3-19-13.6-19 13.8zm86.3-.6-19-13.8 23.4-.2 7.3-22.3 7.4 22.3H357l-18.9 14 7.3 22.3-19.1-13.7-19 13.8zm25.7-76.2-19-13.8 23.5-.2 7.2-22.3 7.5 22.2h23.4l-18.8 14 7.2 22.3-19.1-13.6-19 13.8zM271.7 112l-19-13.8 23.5-.2 7.3-22.3 7.4 22.3h23.5l-19 14 7.3 22.2-19-13.6-19 13.8z"></path> </g> </svg>`, fra: `<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-de" viewBox="0 0 512 512" > <path fill="#ffce00" d="M0 341.3h512V512H0z"></path> <path fill="#000" d="M0 0h512v170.7H0z"></path> <path fill="#d00" d="M0 170.7h512v170.6H0z"></path> </svg>`, atl: `<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-us" viewBox="0 0 512 512"> <g fill-rule="evenodd"> <g stroke-width="1pt"> <path fill="#bd3d44" d="M0 0h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0z" transform="scale(3.9385)"></path> <path fill="#fff" d="M0 10h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0z" transform="scale(3.9385)"></path> </g> <path fill="#192f5d" d="M0 0h98.8v70H0z" transform="scale(3.9385)"></path> <path fill="#fff" d="m8.2 3 1 2.8H12L9.7 7.5l.9 2.7-2.4-1.7L6 10.2l.9-2.7-2.4-1.7h3zm16.5 0 .9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.5 0 .9 2.8H45l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0 1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0 .9 2.8h2.9l-2.4 1.7 1 2.7L74 8.5l-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0 .9 2.8h2.9L92 7.5l1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm-74.1 7 .9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0 1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0 .9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.5 0 .9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7H65zm16.4 0 1 2.8H86l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm-74 7 .8 2.8h3l-2.4 1.7.9 2.7-2.4-1.7L6 24.2l.9-2.7-2.4-1.7h3zm16.4 0 .9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0 .9 2.8H45l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0 1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0 .9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0 .9 2.8h2.9L92 21.5l1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm-74.1 7 .9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0 1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0 .9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0 .9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7H65zm16.4 0 1 2.8H86l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm-74 7 .8 2.8h3l-2.4 1.7.9 2.7-2.4-1.7L6 38.2l.9-2.7-2.4-1.7h3zm16.4 0 .9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0 .9 2.8H45l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0 1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0 .9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0 .9 2.8h2.9L92 35.5l1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm-74.1 7 .9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0 1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0 .9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0 .9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7H65zm16.4 0 1 2.8H86l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm-74 7 .8 2.8h3l-2.4 1.7.9 2.7-2.4-1.7L6 52.2l.9-2.7-2.4-1.7h3zm16.4 0 .9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0 .9 2.8H45l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0 1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0 .9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0 .9 2.8h2.9L92 49.5l1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm-74.1 7 .9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0 1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0 .9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0 .9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7H65zm16.4 0 1 2.8H86l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm-74 7 .8 2.8h3l-2.4 1.7.9 2.7-2.4-1.7L6 66.2l.9-2.7-2.4-1.7h3zm16.4 0 .9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0 .9 2.8H45l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0 1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0 .9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0 .9 2.8h2.9L92 63.5l1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9z" transform="scale(3.9385)"></path> </g> </svg>`, syd: ` <svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-au" viewBox="0 0 512 512" > <path id="path598" fill="#006" stroke-width="1.3" d="M0 0h512v512H0z" ></path> <path id="path606" fill="#fff" fill-rule="evenodd" stroke-width="1.3" d="M54.9 368.6 95.5 384l13.4-41.4 13.3 41.4 40.7-15.4-24.1 36.3 37.4 22.2-43.3 3.7 6 43.1-30-31.5-30 31.5 6-43-43.4-3.8L79 404.9m325 71.5-19 1.6 2.7 18.8-13-13.7-13 13.7L364 478l-18.8-1.6 16.3-9.6L351 451l17.7 6.7 5.8-18 5.7 18L398 451l-10.4 15.8m16.2-270.4L385 198l2.6 18.8-13-13.7-13 13.7L364 198l-18.8-1.6 16.3-9.6L351 171l17.7 6.7 5.8-18 5.7 18L398 171l-10.4 15.8m-88.8 123.4-18.8 1.6 2.6 18.7-13-13.7-13 13.7 2.5-18.7-18.8-1.6 16.3-9.7-10.5-15.7 17.7 6.7 5.8-18 5.7 18 17.7-6.7-10.4 15.7M497 282.2l-18.8 1.6 2.6 18.7-13-13.7-13 13.7 2.5-18.7-18.8-1.6 16.3-9.7-10.5-15.7 17.7 6.7 5.8-18 5.8 18 17.6-6.7-10.4 15.7M416.6 355l-10.3 6.4 2.9-11.8-9.3-7.8 12-.9 4.7-11.2L421 341l12.1 1-9.2 7.7 2.9 11.8" ></path> <g id="g1582" transform="scale(.5)"> <path id="path1560" fill="#006" d="M0 0h512v512H0z"></path> <path id="path1562" fill="#fff" d="M512 0v64L322 256l190 187v69h-67L254 324 68 512H0v-68l186-187L0 74V0h62l192 188L440 0z" ></path> <path id="path1564" fill="#c8102e" d="m184 324 11 34L42 512H0v-3zm124-12 54 8 150 147v45zM512 0 320 196l-4-44L466 0zM0 1l193 189-59-8L0 49z" ></path> <path id="path1566" fill="#fff" d="M176 0v512h160V0zM0 176v160h512V176z" ></path> <path id="path1568" fill="#c8102e" d="M0 208v96h512v-96zM208 0v512h96V0z" ></path> </g> </svg>`, }; const INDICES = { regions: { atl: 1, fra: 2, sgp: 3, syd: 4, }, gameModes: { ffa: 1, teams: 2, "4teams": 3, maze: 4, event: 5, sandbox: 6, }, }; const VERSION = "1.0.4"; let latestVerison = false; let lobbiesArr = []; let inRefreshing = false; let selectedLobbyURL = null; let preferTeam = ""; let refInterval; const list = document.createElement("div"); list.id = "list"; list.innerHTML = `<div class="list__headers "> <h3 class="lobby__region sortable">Region</h3> <h3 class="lobby__name ">IP</h3> <h3 class="lobby__onl sortable">Players</h3> <h3 class="lobby__gm sortable">Game Mode</h3> <span class="list__current-version">Current Version: ${VERSION}</span> </div> <div class="list__container"> <div class="list__lobbies"> <div class="scanning"> <div>SCANNING ALL FREQUENCIES</div> <div> <span class="circle circle-1"></span> <span class="circle circle-2"></span> <span class="circle circle-3"></span> <span class="circle circle-4"></span> <span class="circle circle-5"></span> <span class="circle circle-6"></span> <span class="circle circle-7"></span> <span class="circle circle-8"></span> <span class="circle circle-9"></span> <span class="circle circle-10"></span> </div> </div> </div> <div class="list__filter"> <div class="filter__container"> <h3>Filter</h3> <ul class="filter__cbs"></ul> <h3>Options</h3> <ul class="filter__opts"></ul> </div> <ul class="filter__buttons"> <button class="green-btn btn-blocked">Connect</button> <button class="yellow-btn">Refresh</button> </ul> </div> </div>`; document.body.append(list); const list_header_players = list.querySelector(".list__headers .lobby__onl"); const list_header_region = list.querySelector(".list__headers .lobby__region"); const list_header_gamemode = list.querySelector(".list__headers .lobby__gm"); list_header_players.onclick = () => { if (users_lsData.sortMode !== "p_increase") { users_lsData.sortMode = "p_increase"; } else { users_lsData.sortMode = "p_decrease"; } sort(); }; list_header_region.onclick = () => { if (users_lsData.sortMode !== "regions") { users_lsData.sortMode = "regions"; sort(); } }; list_header_gamemode.onclick = () => { if (users_lsData.sortMode !== "gms") { users_lsData.sortMode = "gms"; sort(); } }; const list_lobbies = list.querySelector(".list__lobbies"); const scanning = list.querySelector(".list__lobbies .scanning"); const connect_btn = list.querySelector("button.green-btn"); connect_btn.isBlocked = true; connect_btn.onclick = () => { if (connect_btn.isBlocked) return; localStorage.setItem("recon", "true"); if (["teams", "4teams", "event"].includes(lobby_gamemode)) { selectedLobbyURL = selectedLobbyURL + preferTeam; } window.location.href = selectedLobbyURL; }; const refresh_btn = list.querySelector("button.yellow-btn"); refresh_btn.onclick = () => { if (inRefreshing) return; connect_btn.isBlocked = true; connect_btn.classList.add("btn-blocked"); selectedLobbyURL = ""; clearInterval(refInterval); refresh(); refInterval = setInterval(() => { refresh(); }, refreshTiming * 1000); }; class BaseEl { constructor(tag, parent, blockPrev = false, isLast = false) { this.el = document.createElement(tag); if (blockPrev) this.el.addEventListener("mousedown", (event) => { event.stopImmediatePropagation(); }); if (isLast) this.el.style.marginBottom = "30px"; parent.append(this.el); } initFn(id, el) { switch (id) { case "showFra": el.onclick = () => { if (!el.checked) { users_lsData.hideRegions.push("fra"); } else users_lsData.hideRegions = users_lsData.hideRegions.filter( (e) => e !== "fra" ); sort(); }; break; case "showAtl": el.onclick = () => { if (!el.checked) { users_lsData.hideRegions.push("atl"); } else users_lsData.hideRegions = users_lsData.hideRegions.filter( (e) => e !== "atl" ); sort(); }; break; case "showSgp": el.onclick = () => { if (!el.checked) { users_lsData.hideRegions.push("sgp"); } else users_lsData.hideRegions = users_lsData.hideRegions.filter( (e) => e !== "sgp" ); sort(); }; break; case "showSyd": el.onclick = () => { if (!el.checked) { users_lsData.hideRegions.push("syd"); } else users_lsData.hideRegions = users_lsData.hideRegions.filter( (e) => e !== "syd" ); sort(); }; break; case "showFfa": el.onclick = () => { if (!el.checked) { users_lsData.hideModes.push("ffa"); } else users_lsData.hideModes = users_lsData.hideModes.filter( (e) => e !== "ffa" ); sort(); }; break; case "showTdm": el.onclick = () => { if (!el.checked) { users_lsData.hideModes.push("teams"); } else users_lsData.hideModes = users_lsData.hideModes.filter( (e) => e !== "teams" ); sort(); }; break; case "show4tdm": el.onclick = () => { if (!el.checked) { users_lsData.hideModes.push("4teams"); } else users_lsData.hideModes = users_lsData.hideModes.filter( (e) => e !== "4teams" ); sort(); }; break; case "showMaze": el.onclick = () => { if (!el.checked) { users_lsData.hideModes.push("maze"); } else users_lsData.hideModes = users_lsData.hideModes.filter( (e) => e !== "maze" ); sort(); }; break; case "showEv": el.onclick = () => { if (!el.checked) { users_lsData.hideModes.push("event"); } else users_lsData.hideModes = users_lsData.hideModes.filter( (e) => e !== "event" ); sort(); }; break; case "showSnd": el.onclick = () => { if (!el.checked) { users_lsData.hideModes.push("sandbox"); } else users_lsData.hideModes = users_lsData.hideModes.filter( (e) => e !== "sandbox" ); sort(); }; break; case "selectTeam": el.innerHTML = ` <option value="" selected>Random</option> <option value="0x0">Blue</option> <option value="0x1">Red</option> <option value="0x2">Purple</option> <option value="0x3">Green</option>`; el.onchange = () => { preferTeam = el.value; }; el.onchange(); break; } } } class CheckBox extends BaseEl { constructor(id, parent, text, isChecked, isLast = false) { super("line", list.querySelector(parent), false, isLast); const label = document.createElement("label"); label.htmlFor = id; label.className = "custom-cb"; label.innerText = text; const input = document.createElement("input"); input.id = id; input.type = "checkbox"; input.checked = isChecked; super.initFn(id, input); this.el.append(input, label); } } class Select extends BaseEl { constructor(id, text, isLast = false) { super("line", list.querySelector("ul.filter__opts"), true, isLast); const label = document.createElement("label"); label.htmlFor = id; label.innerText = text; const select = document.createElement("select"); select.id = id; select.className = "custom-sl"; super.initFn(id, select); this.el.append(select, label); } } function createLobby(r_name, lobby_data) { const lobby = document.createElement("div"); lobby.classList = "lobby"; lobby.innerHTML = ` <h4 class="lobby__region">${SVGS[`${r_name}`]}</h4> <h4 class="lobby__name">${lobby_data.ip}</h4> <h4 class="lobby__onl">${lobby_data.numPlayers}</h4> <h4 class="lobby__gm">${lobby_data.gamemode}</h4>`; lobby.data = lobby_data; lobby.data.region = r_name; lobby.onclick = () => { let prevChosen = list_lobbies.querySelector(".selected"); if (prevChosen) prevChosen.classList.remove("selected"); lobby.classList.add("selected"); connect_btn.isBlocked = false; connect_btn.classList.remove("btn-blocked"); selectedLobbyURL = `https://diep.io?s=${lobby_data.ip}&g=${lobby_data.gamemode}&l=`; console.log("Selected lobby: " + selectedLobbyURL); }; return lobby; } async function init() { if (!users_lsData) { users_lsData = { sortMode: "region", hideRegions: [], hideModes: ["sandbox"], }; localStorage.setItem("dsso_data", JSON.stringify(users_lsData)); } let tyui = JSON.parse(localStorage.getItem("tyui")); if (!tyui) { localStorage.setItem("tyui", JSON.stringify(1)); } if (tyui !== "NaN") { if (tyui >= 5) { setTimeout(() => { if ( confirm( `Could you please leave a review on how much you enjoyed using my script "Advanced Servers Selector for Diep.io"? If you have any ideas for improvements or encountered a bug, you can add it to the review.` ) ) { window.open( "https://greasyfork.org/uk/scripts/526041-advanced-servers-selector-for-diep-io/feedback", "_blank" ); } localStorage.setItem("tyui", JSON.stringify("NaN")); }, 3000); } else { localStorage.setItem("tyui", JSON.stringify(tyui + 1)); } } const initOBJs = { filter_checkboxes: { showAtl: ["Show Atlanta:", !users_lsData.hideRegions.includes("atl")], showFra: ["Show Frankfurt:", !users_lsData.hideRegions.includes("fra")], showSgp: ["Show Singapore:", !users_lsData.hideRegions.includes("sgp")], showSyd: [ "Show Sydney:", !users_lsData.hideRegions.includes("syd"), true, ], showFfa: ["Show FFA:", !users_lsData.hideModes.includes("ffa")], showTdm: ["Show Teams:", !users_lsData.hideModes.includes("teams")], show4tdm: ["Show Teams (4):", !users_lsData.hideModes.includes("4teams")], showMaze: ["Show Maze:", !users_lsData.hideModes.includes("maze")], showEv: ["Show Event modes:", !users_lsData.hideModes.includes("event")], showSnd: ["Show Sandbox:", !users_lsData.hideModes.includes("sandbox")], }, options_checkboxes: {}, options_selectors: { selectTeam: ["Prefer team:", false], }, }; for (let _p in initOBJs) { let p = initOBJs[_p]; for (let _id in p) { switch (_p) { case "filter_checkboxes": new CheckBox(_id, "ul.filter__cbs", ...p[_id]); break; case "options_checkboxes": new CheckBox(_id, "ul.filter__opts", ...p[_id]); break; case "options_selectors": new Select(_id, ...p[_id]); break; } } } refresh(); await checkVersion(); const list_header = list.querySelector(".list__headers"); if (latestVerison) { let newV = document.createElement("a"); newV.classList = "list__new-version"; newV.href = "https://greasyfork.org/uk/scripts/526041-advanced-servers-selector-for-diep-io"; newV.innerText = `New version is available — ${latestVerison}`; list_header.append(newV); list.querySelector(".list__current-version").style.bottom = "5px"; } else { list.querySelector(".list__current-version").style.top = "7.5px"; } refInterval = setInterval(() => { refresh(); }, refreshTiming * 1000); setInterval(() => { if (!lobby_ip) return; [...list_lobbies.children].forEach((e) => { if (e.classList.contains("lobby")) { if (e.querySelector(".lobby__name").innerText === lobby_ip) { e.classList.add("active"); } else e.classList.remove("active"); } }); }, 100); } async function getData() { try { const response = await fetch("https://lb.diep.io/api/lb/pc"); return await response.json(); } catch (e) { console.error(e); } } async function refresh() { [...list_lobbies.children].forEach((e) => { if (e.classList.contains("lobby")) e.remove(); }); scanning.style.display = "block"; lobbiesArr = []; inRefreshing = true; const data = await getData(); scanning.style.display = "none"; inRefreshing = false; for (const region of data.regions) { for (const lobby of region.lobbies) { lobbiesArr.push(createLobby(region.region, lobby)); } } sort(); } function sort() { [...list_lobbies.children].forEach((e) => { if (e.classList.contains("lobby")) e.remove(); }); [...list.querySelectorAll(".list__headers h3")].forEach((e) => { if (e.classList.contains("sort-1")) e.classList.remove("sort-1"); if (e.classList.contains("sort-2")) e.classList.remove("sort-2"); if (e.classList.contains("sort-3")) e.classList.remove("sort-3"); }); if (users_lsData.sortMode === "p_increase") { list_header_players.classList.add("sort-2"); lobbiesArr .sort((a, b) => { return a.data.numPlayers - b.data.numPlayers; }) .reverse(); } else if (users_lsData.sortMode === "p_decrease") { list_header_players.classList.add("sort-3"); lobbiesArr.sort((a, b) => { return a.data.numPlayers - b.data.numPlayers; }); } else if (users_lsData.sortMode === "regions") { list_header_region.classList.add("sort-1"); lobbiesArr.sort((a, b) => { return ( INDICES.regions[`${a.data.region}`] - INDICES.regions[`${b.data.region}`] ); }); } else if (users_lsData.sortMode === "gms") { list_header_gamemode.classList.add("sort-1"); lobbiesArr.sort((a, b) => { return ( INDICES.gameModes[`${a.data.gamemode}`] - INDICES.gameModes[`${b.data.gamemode}`] ); }); } lobbiesArr.forEach((e) => { if (users_lsData.hideModes.includes(e.data.gamemode)) return; if (users_lsData.hideRegions.includes(e.data.region)) return; list_lobbies.append(e); }); updateUserLSData(); } function setDraggable(el, el_child) { var newPosX = 0, newPosY = 0, MousePosX = 0, MousePosY = 0; if (el_child) { el_child.forEach((e) => e.addEventListener("mousedown", MouseDown)); } else el.addEventListener("mousedown", MouseDown); function MouseDown(mouseDown) { MousePosX = mouseDown.pageX; MousePosY = mouseDown.pageY; if (el_child) { el_child.forEach((e) => e.classList.add("dragableging")); } else el.classList.add("dragableging"); document.addEventListener("mousemove", elementMove); document.addEventListener("mouseup", stopElementMove); } function elementMove(mouseMove) { newPosX = MousePosX - mouseMove.pageX; newPosY = MousePosY - mouseMove.pageY; MousePosX = mouseMove.pageX; MousePosY = mouseMove.pageY; el.style.top = el.offsetTop - newPosY + "px"; el.style.left = el.offsetLeft - newPosX + "px"; } function stopElementMove() { if (el_child) { el_child.forEach((e) => e.classList.remove("dragableging")); } else el.classList.remove("dragableging"); document.removeEventListener("mousemove", elementMove); document.removeEventListener("mouseup", stopElementMove); } } function getUserLSData() { return JSON.parse(localStorage.getItem("dsso_data")); } function updateUserLSData() { localStorage.setItem("dsso_data", JSON.stringify(users_lsData)); } async function checkVersion() { const url = "https://raw.githubusercontent.com/jajamorgan/ve/refs/heads/main/version.json"; try { const response = await fetch(url); if (!response.ok) throw new Error(`Ошибка: ${response.status}`); let { version } = await response.json(); let lVersion = version.split("."); const cVersion = VERSION.split("."); for (let i = 0; i < 3; i++) { if (parseFloat(lVersion[i]) > parseFloat(cVersion[i])) { latestVerison = lVersion.join("."); break; } } console.log("Advanced Selector version:", cVersion.join(".")); } catch (error) { console.error("Request ERR:", error); } } document .getElementById("spawn-button") .addEventListener("click", () => (list.style.display = "none")); document .getElementById("game-over-continue") .addEventListener("click", () => (list.style.display = "block")); document.addEventListener("keydown", (e) => { if (toggleKeys.includes(e.key)) { if (list.style.display == "none") { list.style.display = "block"; } else list.style.display = "none"; } }); setDraggable(list, [list.querySelector(".list__headers")]); init(); GM_addStyle(`#server-selector { display: none !important; } #logo { position: absolute; bottom: 80px; } #spawn-input { position: absolute !important; bottom: 250px; } #spawn-button { position: absolute !important; bottom: 200px; } #copy-party-link { position: absolute !important; height: 33px; width: 200px !important; left: 210px; top: 100px; } #list button { border: none; } * { outline: none; border: none; margin: 0; padding: 0; } :root { --font-lobby: #8addd3; --font-headers: #5b9e7d; --font-filter: #69c49f; --font-buttons: #bbc9c9; --list-back: #050c0a; --lobby-menu-back: #081c1c; --lobby-back: #153832; --filter-back: #133532; --green-btn-back: #1b4333; --green-hov-back: #2bd469; --green-act-back: #04fb46; --yellow-btn-back: #4f4917; --yellow-hov-back: #c4b73b; --yellow-act-back: #dfcc20; --gray-btn-back: #343434; } #list { position: absolute; z-index: 999; top: 10px; left: 50%; transform: translateX(-50%); font-family: "Ubuntu", sans-serif; font-size: 14px; background-color: var(--list-back); padding: 0 5px; user-select: none; box-shadow: #050c0a8a 0px 0px 2px 6px; } .list__headers { position: relative; background-color: #050c0a; color: var(--font-headers); display: flex; justify-content: space-between; align-items: center; text-align: center; cursor: grab; gap: 25px; padding: 8px; width: 625px; padding-right: 280px; } .list__headers h3 { position: relative; padding: 10px 8px; } .sortable { cursor: pointer; } .dragableging { cursor: grabbing; } .sort-1::after, .sort-2::after, .sort-3::after { content: "▼"; color: var(--font-headers); position: absolute; font-weight: bold; font-size: 24px; top: 0; right: -10px; text-shadow: var(--font-headers) 0px 0px 5px; } .sort-1::after { transform: translateY(20%) rotate(90deg); } .sort-2::after { right: -12px; transform: translateY(20%); } .sort-3::after { right: -12px; transform: translateY(20%) rotate(180deg); } .list__container { display: flex; justify-content: space-between; align-items: flex-start; text-align: center; padding: 3px 3px 8px 3px; } .list__lobbies { position: relative; background-color: #081c1c; padding-right: 4px; overflow-y: scroll; display: flex; flex-direction: column; align-items: center; width: 645px; height: 395px; } .list__new-version { position: absolute; padding: 4px; font-size: 14px; right: -2px; top: 5px; font-weight: bold; color: #dfc200; text-decoration: none; animation: newVersion 7s linear infinite; } .list__new-version:hover { filter: brightness(0.8); } .list__current-version { font-size: 14px; right: 5px; position: absolute; font-weight: bold; color: var(--font-lobby); } @keyframes newVersion { 0% { transform: rotate(0deg); } 25% { transform: rotate(2deg); } 50% { transform: rotate(0deg); } 75% { transform: rotate(-2deg); } 100% { transform: rotate(0deg); } } /* * lobbies */ .list__lobbies .scanning { display: none; top: 50%; left: 50%; transform: translateX(-50%) translateY(-75%); position: absolute; background-color: #153832; color: var(--font-lobby); font-size: 26px; padding: 5px 10px; width: 420px; } .circle { display: inline-block; width: 10px; height: 10px; opacity: 0; border-radius: 3px; background-color: var(--font-lobby); animation: loading 1.5s cubic-bezier(0.8, 0.5, 0.2, 1.4) infinite; position: relative; } @keyframes loading { 0% { opacity: 0; transform: scale(0); } 40% { opacity: 0; transform: scale(0); } 60% { opacity: 1; transform: scale(1); } 80% { opacity: 1; transform: scale(1); } 100% { opacity: 0; transform: scale(0); } } @keyframes selected { 0% { filter: brightness(0.75); } 50% { filter: brightness(1); } 100% { filter: brightness(0.75); } } .circle-1 { animation-delay: 0s; } .circle-2 { animation-delay: 0.05s; } .circle-3 { animation-delay: 0.1s; } .circle-4 { animation-delay: 0.15s; } .circle-5 { animation-delay: 0.2s; } .circle-6 { animation-delay: 0.25s; } .circle-7 { animation-delay: 0.3s; } .circle-8 { animation-delay: 0.35s; } .circle-9 { animation-delay: 0.4s; } .circle-10 { animation-delay: 0.5s; } #list ::-webkit-scrollbar { background-color: var(--lobby-menu-back); width: 8px; padding: 1px; } #list ::-webkit-scrollbar-thumb { background-color: #f3fdfd; border-radius: 1px; } .lobby { cursor: pointer; background-color: var(--lobby-back); color: var(--font-lobby); padding: 5px 15px; border-radius: 5px; border: #375552 2px solid; margin-bottom: -1px; display: flex; justify-content: space-between; align-items: center; gap: 25px; min-width: 500px; } .lobby.active { animation: selected 1.5s cubic-bezier(0.8, 0.5, 0.2, 1.4) infinite; } .lobby.selected { background-color: #315a56; } .lobby:hover { background-color: #2c6b54; transition: 0.05s; } .lobby svg { align-items: center; border-radius: 50%; height: 25px; width: auto; } .lobby__region { width: 80px; } .lobby__name { width: 250px; } .lobby .lobby__name { user-select: text; } .lobby__onl { width: 75px; } .lobby__gm { width: 120px; } /* * filter */ .list__filter { font-weight: bolder; background-color: var(--filter-back); color: var(--font-filter); height: 395px; width: 250px; } .filter__container { overflow-y: scroll; max-height: 290px; } .list__filter h3 { font-size: 28px; margin: 15px 0; } .list__filter ul { display: flex; flex-direction: column; justify-content: space-between; text-align: left; margin: 0 7.5px; } ul.filter__cbs { margin-bottom: 20px; padding-right: 10px; } ul.filter__opts { margin-bottom: 10px; padding-right: 10px; max-height: 150px; } .list__filter line { position: relative; width: 100%; font-size: 14px; margin: 7.5px 0; } .list__filter input { position: absolute; opacity: 0; } .custom-cb::before { content: ""; cursor: pointer; top: 50%; right: 0; transform: translateY(-50%); position: absolute; background-color: transparent; border: var(--font-filter) 2px solid; width: 20px; height: 20px; } .custom-cb::after { content: ""; cursor: pointer; opacity: 0; top: 50%; right: 4.3px; transform: translateY(-50%); position: absolute; background-color: var(--font-filter); width: 15px; height: 15px; } .list__filter input:checked + .custom-cb::after { opacity: 1; transition: 0.05s; } .custom-sl { padding: 3px 0; transform: translateY(-50%); top: 50%; width: 100px; color: var(--filter-back); font-weight: bold; background-color: var(--font-filter); right: 0; border: none; position: absolute; } .custom-sl:hover { filter: brightness(1.33); transition: 0.1s; } .custom-cb:hover::after, .custom-cb:hover::before { filter: brightness(1.33); transition: 0.1s; } option { border: none; font-weight: bold; background-color: var(--list-back); color: var(--font-headers); } /* * buttons */ .filter__buttons { padding-top: 10px; } button { position: relative; font-size: 24px; font-weight: bold; color: var(--font-buttons); margin: 5px 0px; padding: 3px 0; border-radius: 7.5px; cursor: pointer; } button.gray-btn { background-color: var(--gray-btn-back); cursor: not-allowed; filter: brightness(0.5); } button.yellow-btn { background-color: var(--yellow-btn-back); } button.yellow-btn:hover { background-color: var(--yellow-hov-back); box-shadow: inset var(--yellow-btn-back) 0px 0px 12px 12px; } button.yellow-btn:active { background-color: var(--yellow-act-back); box-shadow: inset var(--yellow-btn-back) 0px 0px 10px 7px; } button.green-btn { background-color: var(--green-btn-back); } button.green-btn:not(.btn-blocked):hover { background-color: var(--green-hov-back); box-shadow: inset var(--green-btn-back) 0px 0px 12px 12px; } button.green-btn:not(.btn-blocked):active { background-color: var(--green-act-back); box-shadow: inset var(--green-btn-back) 0px 0px 10px 7px; } button.btn-blocked { cursor: not-allowed; filter: brightness(0.66); } `);