import { safeTags } from './encoding'; interface AOServer { name: string, description: string, ip: string, players: number, port?: number, ws_port?: number, wss_port?: number, assets?: string, online?: string, } const clientVersion = process.env.npm_package_version; // const MASTERSERVER_IP = 'master.aceattorneyonline.com:27014'; const serverlist_domain = 'servers.aceattorneyonline.com'; const protocol = window.location.protocol; const host = window.location.host; const serverlist_cache_key = 'masterlist'; const servers: AOServer[] = []; servers[-2] = { name: 'Singleplayer', description: 'Build cases, try out new things', ip: '127.0.0.1', port: 50001, assets: '', online: 'Online: 0/1', players: 0, }; servers[-1] = { name: 'Localhost', description: 'This is your computer on port 50001', ip: '127.0.0.1', port: 50001, assets: '', online: 'Offline', players: 0, }; function main() { getServerlist().then((serverlist) => { processServerlist(serverlist); }); processClientVersion(clientVersion); getMasterVersion().then((masterVersion) => { processMasterVersion(masterVersion); }); } main(); // Fetches the serverlist from the masterserver // Returns a properly typed list of servers async function getServerlist(): Promise { const url = `${protocol}//${serverlist_domain}/servers`; const response = await fetch(url); if (!response.ok) { console.error(`Bad status code from masterserver. status: ${response.status}, body: ${response.body}`); document.getElementById('ms_error').style.display = 'block'; // If we get a bad status code, try to use the cached serverlist return getCachedServerlist(); } const data = await response.json(); const serverlist: AOServer[] = []; for (const item of data) { if (!item.name) { console.warn(`Server ${item} has no name, skipping`); continue; } if (!item.ip) { console.warn(`Server ${item.name} has no ip, skipping`); continue; } if (!item.description) { console.warn(`Server ${item.name} has no description, skipping`); continue; } const newServer: AOServer = { name: item.name, description: item.description, ip: item.ip, players: item.players || 0, } if (item.ws_port) { newServer.ws_port = item.ws_port; } if (item.wss_port) { newServer.wss_port = item.wss_port; } // if none of ws_port or wss_port are defined, skip // Note that this is not an error condition, as many servers only has port (TCP) enabled // Which means they don't support webAO if (!newServer.ws_port && !newServer.wss_port) { continue; } serverlist.push(newServer); } // Always cache the result when we get it localStorage.setItem(serverlist_cache_key, JSON.stringify(serverlist)); return serverlist; } function getCachedServerlist(): AOServer[] { // If it's not in the cache, return an empty list const cached = localStorage.getItem(serverlist_cache_key) || '[]'; return JSON.parse(cached) as AOServer[]; } function processServerlist(serverlist: AOServer[]) { const clientURL: string = `${protocol}//${host}/client.html`; for (let i = 0; i < serverlist.length - 1; i++) { const server = serverlist[i]; let port = 0; let protocol = ''; if (server.ws_port) { port = server.ws_port; protocol = 'ws'; } if (server.wss_port) { port = server.wss_port; protocol = 'wss'; } if (port === 0 || protocol === '') { continue; } const connect = `${protocol}://${server.ip}:${port}`; const serverName = server.name; server.online = 'Offline'; servers.push(server); document.getElementById('masterlist').innerHTML += `
  • ${safeTags(server.name)} (${server.players})

    ` + `Watch` + `Join
  • `; } } async function getMasterVersion(): Promise { const url = `${protocol}//${serverlist_domain}/version`; const response = await fetch(url); if (!response.ok) { console.error(`Bad status code from masterserver version check. status: ${response.status}, body: ${response.body}`); return 'Unknown'; } return await response.text(); } function processClientVersion(data: string) { document.getElementById('clientinfo').innerHTML = `Client version: ${data}`; } function processMasterVersion(data: string) { document.getElementById('serverinfo').innerHTML = `Master server version: ${data}`; }