Find empty Roblox servers at the click of a button.
当前为
- // ==UserScript==
- // @name RoSearcher
- // @namespace http://tampermonkey.net/
- // @version 0.3
- // @description Find empty Roblox servers at the click of a button.
- // @author https://github.com/NotDSF
- // @match https://www.roblox.com/games/*
- // @icon https://www.google.com/s2/favicons?domain=tampermonkey.net
- // @grant none
- // ==/UserScript==
- (function() {
- 'use strict';
- let GameID = document.URL.match(/games\/(\d+)\//)[1];
- function GetServers(Index) {
- return new Promise((resolve, reject) => {
- fetch(`https://www.roblox.com/games/getgameinstancesjson?placeId=${GameID}&startIndex=${Index}&_=1`, {
- method: "GET",
- })
- .then(res => res.text())
- .then(json => resolve(JSON.parse(json)))
- .catch(er => reject(er));
- });
- }
- fetch("https://raw.githubusercontent.com/NotDSF/RoSearcher/main/script-version")
- .then(res => res.text())
- .then(body => {
- if (body !== Version) {
- if (confirm("A new version of RoSearch is available, would you like to download it?")) {
- document.location.href = "https://greasyfork.org/en/scripts/430402-rosearcher";
- }
- }
- })
- .catch(er => {
- alert("RoSearcher Error:", er.toString());
- throw er;
- });
- async function main() {
- if (!confirm("Are you sure you want to find an empty server?")) return;
- let Status = document.getElementById("server-status");
- let MaxPingB = document.getElementById("ping-box");
- let IteratorB = document.getElementById("iterator-box");
- let MaxPlayersB = document.getElementById("player-box");
- let MaxPing = MaxPingB.value.length ? parseInt(MaxPingB.value) : 300;
- let Iterator = IteratorB.value.length ? parseInt(IteratorB.value) : 30;
- let MaxPlayers = MaxPlayersB.value.length ? parseInt(MaxPlayersB.value) : 4;
- let Index = 0;
- let LowestServer;
- Status.innerHTML = "Looking for servers...";
- while (true) {
- if (LowestServer && LowestServer.Len <= MaxPlayers && LowestServer.Ping <= MaxPing) {
- Status.innerHTML = `Found server! Players: ${LowestServer.Len} Ping: ${LowestServer.Ping}. Joining...`;
- eval(LowestServer.JoinScript);
- break;
- }
- let Servers = await GetServers(Index)
- .catch(er => {
- throw er;
- });
- if (!Servers.Collection.length) {
- if (LowestServer && Iterator === 10) {
- if (LowestServer.Len > MaxPlayers) alert(`We couldn't find a server with ${MaxPlayers} players or below! (Try editing your options)`);
- if (LowestServer.Ping > MaxPing) alert(`We couldn't find a server with ${MaxPing} ping or below! (Try editing your options)`);
- Status.innerHTML = `Found server! Players: ${LowestServer.Len} Ping: ${LowestServer.Ping}. Joining...`;
- eval(LowestServer.JoinScript);
- break;
- }
- if (LowestServer) {
- Iterator = 10;
- Index -= (Index > (Iterator * 2)) ? (Iterator * 2) : Iterator; // Just incase
- continue;
- }
- alert("Sorry we couldn't find a server!");
- Status.innerHTML = "";
- break;
- }
- for (let Server of Servers.Collection) {
- let PlayerLen = Server.CurrentPlayers.length;
- if (!LowestServer) {
- LowestServer = { Len: PlayerLen, Ping: Server.Ping, JoinLink: Server.JoinScript }
- continue;
- }
- if (PlayerLen < LowestServer.Len) {
- LowestServer = { Len: PlayerLen, Ping: Server.Ping, JoinScript: Server.JoinScript }
- }
- }
- Index += Iterator;
- Status.innerHTML = `Index: ${Index}, Lowest Server: ${LowestServer.Len}, Ping: ${LowestServer.Ping}...`;
- }
- }
- let GameInstances = document.getElementById("game-instances");
- let ParentDiv = document.createElement("div");
- let ContainerHead = document.createElement("div");
- ParentDiv.className = "stack";
- GameInstances.prepend(ParentDiv);
- // container header
- let Title = document.createElement("h3");
- Title.innerHTML = "RoSearch";
- ContainerHead.className = "container-header";
- ContainerHead.prepend(Title);
- // container children
- let pingbox = document.createElement("textarea");
- pingbox.className = "dialog-input ng-valid ng-isolate-scope ng-touched ng-not-empty ng-dirty ng-valid-parse";
- pingbox.rows = 1;
- pingbox.style = "overflow: hidden; overflow-wrap: break-word; resize: none; height: 30px; margin-bottom: 5px; display: inherit; border-radius: 3px; width: 330px;";
- pingbox.placeholder = "Max Ping (Leave Blank For Default)";
- pingbox.id = "ping-box";
- let maxPlayer = document.createElement("textarea");
- maxPlayer.className = "dialog-input ng-valid ng-isolate-scope ng-touched ng-not-empty ng-dirty ng-valid-parse";
- maxPlayer.rows = 1;
- maxPlayer.style = "overflow: hidden; overflow-wrap: break-word; resize: none; height: 30px; margin-bottom: 5px; display: inherit; border-radius: 3px; width: 330px;";
- maxPlayer.placeholder = "Max Players (Leave Blank For Default)";
- maxPlayer.id = "player-box";
- let Iterator = document.createElement("textarea");
- Iterator.className = "dialog-input ng-valid ng-isolate-scope ng-touched ng-not-empty ng-dirty ng-valid-parse";
- Iterator.rows = 1;
- Iterator.style = "overflow: hidden; overflow-wrap: break-word; resize: none; height: 30px; margin-bottom: 5px; display: inherit; border-radius: 3px; width: 330px;";
- Iterator.placeholder = "Iterator (Leave Blank For Default)";
- Iterator.id = "iterator-box";
- let fakeButton = document.createElement("span");
- fakeButton.className = "btn-secondary-md btn-more";
- fakeButton.innerHTML = "Find Empty Server";
- fakeButton.onclick = main;
- fakeButton.style = "display: inherit; width: min-content; margin-bottom: 20px;";
- let status = document.createElement("span");
- status.className = "section-content-off";
- status.id = "server-status";
- status.style = "display: inherit;";
- ParentDiv.prepend(ContainerHead, maxPlayer, pingbox, Iterator, fakeButton, status);
- })();