try fixing servers missing issues
// ==UserScript==
// @name modd.io servers sync
// @namespace http://tampermonkey.net/
// @version 1.4
// @description try fixing servers missing issues
// @author n0fir3
// @match *://*.modd.io/play/*
// @grant unsafeWindow
// @grant GM_xmlhttpRequest
// @connect www.modd.io
// @run-at document-start
// @license MIT
// ==/UserScript==
(function () {
'use strict';
function fetchServers(gameId) {
GM_xmlhttpRequest({
method: "GET",
url: `https://www.modd.io/api/v1/game-server/${gameId}/`,
onload: function (response) {
try {
const data = JSON.parse(response.responseText);
const serverList = data.gameServers || data.servers;
if (!serverList || !Array.isArray(serverList)) return;
const servers = serverList.filter(s => s.status === 'started' || s.isReachable);
const select = document.querySelector('#server-list');
if (!select) return;
select.innerHTML = '';
servers.forEach((server) => {
const option = document.createElement('option');
option.className = 'game-server';
option.value = server.id;
option.setAttribute('data-url', `wss://${server.ip}:${server.httpsPort || server.wsPort}`);
option.setAttribute('data-server-id', server.id);
option.textContent = `${server.name || 'Server'} (${server.playerCount || 0}/${server.maxPlayers || 0})`;
select.appendChild(option);
});
select.dispatchEvent(new Event('change', { bubbles: true }));
} catch (e) {}
}
});
}
function init() {
const runLogic = () => {
const select = document.querySelector('#server-list');
const gId = unsafeWindow.gameId;
if (select && gId) {
fetchServers(gId);
return true;
}
return false;
};
if (runLogic()) return;
const observer = new MutationObserver(() => {
if (runLogic()) observer.disconnect();
});
observer.observe(document.documentElement, { childList: true, subtree: true });
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();