EraFN Filters

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);
})();