您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Filter the server list to your needs.
// ==UserScript== // @name EraFN Filters // @namespace http://tampermonkey.net/ // @version 0.2 // @description Filter the server list to your needs. // @author Christoffyw // @match https://status.erafn.org/ // @license MIT // @icon https://www.google.com/s2/favicons?sz=64&domain=erafn.org // @grant GM.getValue // @grant GM.setValue // @grant GM_getValue // @grant GM_setValue // ==/UserScript== const default_config = { versions: ["3.5", "4.1", "4.5", "5.10", "5.41", "6.20", "6.31", "7.40", "10.40"], regions: ["EU", "NA", "OCE"], gamemodes: ["Solo", "Duos", "Squads", "50v50", "Blitz! (Solo)", "Blitz! (Duos)", "Blitz! (Squads)", "Solid Gold", "Creative"], status: ["Offline", "Online", "Match has started"] } let config = { versions: [], regions: [], gamemodes: [], status: [] } // Return list of server elements based on class function refresh_servers() { return document.getElementsByClassName("bg-gray-800"); } // Extract server info from elements function extract_data(server_element) { let nameElement = server_element.firstChild.children[1].firstChild; let detailsElement = server_element.firstChild.children[1].lastChild; let statusElement = server_element.firstChild.lastChild.lastChild; let details = detailsElement.innerHTML.split(" / "); let temp_server_object = {}; temp_server_object.name = nameElement.innerHTML; temp_server_object.region = details[0]; temp_server_object.gamemode = details[1]; temp_server_object.version = details[2].replace("Fortnite ", ""); temp_server_object.status = statusElement.innerHTML; return temp_server_object; } // Loop through each server entry and extract data function update_data(servers, server_elements) { for(var i = 0; i < server_elements.length; i++) { servers[i] = extract_data(server_elements[i]); } filter(servers, server_elements); } // Filter out servers that don't meet the user's options function filter(servers, server_elements) { let versions = document.getElementsByName("versions"); for(var v = 0; v < versions.length; v++) { if(versions[v].checked) { if(!config.versions.includes(versions[v].value)) config.versions.push(versions[v].value); } else { if(config.versions.includes(versions[v].value)) config.versions.splice(config.versions.indexOf(versions[v].value), 1); } } let regions = document.getElementsByName("regions"); for(var r = 0; r < regions.length; r++) { if(regions[r].checked) { if(!config.regions.includes(regions[r].value)) config.regions.push(regions[r].value); } else { if(config.regions.includes(regions[r].value)) config.regions.splice(config.regions.indexOf(regions[r].value), 1); } } let gamemodes = document.getElementsByName("gamemodes"); for(var g = 0; g < gamemodes.length; g++) { if(gamemodes[g].checked) { if(!config.gamemodes.includes(gamemodes[g].value)) config.gamemodes.push(gamemodes[g].value); } else { if(config.gamemodes.includes(gamemodes[g].value)) config.gamemodes.splice(config.gamemodes.indexOf(gamemodes[g].value), 1); } } let status = document.getElementsByName("status"); for(var s = 0; s < status.length; s++) { if(status[s].checked) { if(!config.status.includes(status[s].value)) config.status.push(status[s].value); } else { if(config.status.includes(status[s].value)) config.status.splice(config.status.indexOf(status[s].value), 1); } } GM.setValue("config", JSON.stringify(config)); for(var i = 0; i < servers.length; i++) { let server = servers[i]; var show = true; if(!config.versions.includes(server.version)) show = false; if(!config.regions.includes(server.region)) show = false; if(!config.gamemodes.includes(server.gamemode)) show = false; if(!config.status.includes(server.status)) show = false; if(show == false) { if(server_elements[i]) server_elements[i].style.display = "none"; //console.log(config.versions.includes(server.version) + ": " + server.version); //console.log(config.regions.includes(server.region) + ": " + server.region); //console.log(config.gamemodes.includes(server.gamemode) + ": " + server.gamemode); //console.log(config.status.includes(server.status) + ": " + server.status); } else if(server_elements[i]) server_elements[i].style.display = ""; } } // Run code on start function start() { let server_elements = refresh_servers(); let servers = []; update_data(servers, server_elements); let server_tabs = document.getElementsByClassName("first-letter:border-opacity-50"); for(var y = 0; y < server_tabs.length; y++) { let server_tab = server_tabs[y]; server_tab.addEventListener("click", () => { setTimeout(() => { server_elements = refresh_servers(); update_data(servers, server_elements); filter(servers, server_elements); }, 1000); }); } setInterval(function(){ server_elements = refresh_servers(); update_data(servers, server_elements); filter(servers, server_elements); }, 500); var newHTML = document.createElement ('div'); newHTML.innerHTML = ' \ <div id="versions" style="display:inline-block; vertical-align: top"> \ <p>Versions</p> \ <input type="checkbox" name="versions" checked="true" value="3.5"> 3.5<br> \ <input type="checkbox" name="versions" checked="true" value="4.1"> 4.1<br> \ <input type="checkbox" name="versions" checked="true" value="4.5"> 4.5<br> \ <input type="checkbox" name="versions" checked="true" value="5.10"> 5.10<br> \ <input type="checkbox" name="versions" checked="true" value="5.41"> 5.41<br> \ <input type="checkbox" name="versions" checked="true" value="6.20"> 6.20<br> \ <input type="checkbox" name="versions" checked="true" value="6.31"> 6.31<br> \ <input type="checkbox" name="versions" checked="true" value="7.40"> 7.40<br> \ <input type="checkbox" name="versions" checked="true" value="10.40"> 10.40<br> \ </div> \ <div id="regions" style="display:inline-block; vertical-align: top"> \ <p>Regions</p> \ <input type="checkbox" name="regions" checked="true" value="EU"> EU<br> \ <input type="checkbox" name="regions" checked="true" value="NA"> NA<br> \ <input type="checkbox" name="regions" checked="true" value="OCE"> OCE<br> \ </div> \ <div id="gamemodes" style="display:inline-block; vertical-align: top"> \ <p>Gamemodes</p> \ <input type="checkbox" name="gamemodes" checked="true" value="Solo"> Solo<br> \ <input type="checkbox" name="gamemodes" checked="true" value="Duos"> Duos<br> \ <input type="checkbox" name="gamemodes" checked="true" value="Squads"> Squads<br> \ <input type="checkbox" name="gamemodes" checked="true" value="50v50"> 50v50<br> \ <input type="checkbox" name="gamemodes" checked="true" value="Blitz! (Solo)"> Blitz! (Solo)<br> \ <input type="checkbox" name="gamemodes" checked="true" value="Blitz! (Duos)"> Blitz! (Duos)<br> \ <input type="checkbox" name="gamemodes" checked="true" value="Blitz! (Squads)"> Blitz! (Squads)<br> \ <input type="checkbox" name="gamemodes" checked="true" value="Solid Gold"> Solid Gold<br> \ <input type="checkbox" name="gamemodes" checked="true" value="Creative"> Creative<br> \ </div> \ <div id="status" style="display:inline-block; vertical-align: top"> \ <p>Status</p> \ <input type="checkbox" name="status" checked="true" value="Offline"> Offline<br> \ <input type="checkbox" name="status" checked="true" value="Online"> Online<br> \ <input type="checkbox" name="status" checked="true" value="Match has started"> Match has started<br> \ </div> \ '; newHTML.className = "bg-gray-900 text-gray-200"; newHTML.style = "position: absolute;left: 50%;margin-right: -50%;transform: translate(-50%, 0);padding: 25px"; document.body.insertBefore(newHTML,document.body.firstChild); let root = document.getElementById("root"); root.firstChild.style = `padding-top: ${newHTML.clientHeight}px`; let checkboxes = document.querySelectorAll('[type="checkbox"]'); for(var c = 0; c < checkboxes.length; c++) { checkboxes[c].addEventListener("click", () => { console.log(config); }); } let versions = document.getElementsByName("versions"); for(var v = 0; v < versions.length; v++) { versions[v].checked = config.versions.includes(versions[v].value); } let regions = document.getElementsByName("regions"); for(var r = 0; r < regions.length; r++) { regions[r].checked = config.regions.includes(regions[r].value); } let gamemodes = document.getElementsByName("gamemodes"); for(var g = 0; g < gamemodes.length; g++) { gamemodes[g].checked = config.gamemodes.includes(gamemodes[g].value); } let status = document.getElementsByName("status"); for(var s = 0; s < status.length; s++) { status[s].checked = config.status.includes(status[s].value); } } (async function() { 'use strict'; let GM_Config = await GM.getValue("config"); config = GM_Config == undefined ? default_config : JSON.parse(GM_Config); console.log(config); setTimeout(() => { start(); }, 1000); })();