diff options
| author | Caleb Mabry <36182383+caleb-mabry@users.noreply.github.com> | 2022-03-23 15:31:04 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-03-23 15:31:04 -0400 |
| commit | 46d63b5ba4eeb30ac1f5add49b03b1aed8ae0328 (patch) | |
| tree | 228ef1f017ce0320f3d210a557d2803a03ec73e1 /webAO/master.ts | |
| parent | 0b6b4b085cee48248fe2025a2514252ee20ee774 (diff) | |
| parent | 2e734ec14fc760f80e2a9dc81cdf9269220bb791 (diff) | |
Merge branch 'master' into moving-audio-channels
Diffstat (limited to 'webAO/master.ts')
| -rw-r--r-- | webAO/master.ts | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/webAO/master.ts b/webAO/master.ts new file mode 100644 index 0000000..8fd8779 --- /dev/null +++ b/webAO/master.ts @@ -0,0 +1,155 @@ +import FingerprintJS from '@fingerprintjs/fingerprintjs'; + +import { unescapeChat, safeTags } from './encoding.js'; + +declare global { + interface Window { + setServ: (ID: any) => void; + } +} + +const myStorage = window.localStorage; + +const version = process.env.npm_package_version; + +const MASTERSERVER_IP = 'master.aceattorneyonline.com:27014'; + +let hdid: string; + +let selectedServer: number = -1; + +let servers: { name: string, description: string, ip: string, port: number, ws_port: number, assets: string, online: string }[] = []; +servers[-2] = { + name: 'Singleplayer', description: 'Build cases, try out new things', ip: '127.0.0.1', port: 50001, ws_port: 50001, assets: '', online: '', +}; +servers[-1] = { + name: 'Localhost', description: 'This is your computer on port 50001', ip: '127.0.0.1', port: 50001, ws_port: 50001, assets: '', online: 'Online: ?/?', +}; + +const fpPromise = FingerprintJS.load(); +fpPromise + .then((fp) => fp.get()) + .then((result) => { + hdid = result.visitorId; + + check_https(); + + fetch('https://servers.aceattorneyonline.com/servers') + .then(cachedServerlist) + .then((response) => loadServerlist(response)) + .catch(cachedServerlist); + + fetch('https://servers.aceattorneyonline.com/version') + .then((response) => response.text()) + .then((response) => processVersion(response)); + + // i don't need the ms to play alone + setTimeout(() => checkOnline(-1, '127.0.0.1:50001'), 0); + }); + +export function check_https() { + if (document.location.protocol === 'https:') { + document.getElementById('https_error').style.display = ''; + } +} + +export function setServ(ID: number) { + selectedServer = ID; + + if (document.getElementById(`server${ID}`).className === '') { checkOnline(ID, `${servers[ID].ip}:${servers[ID].ws_port}`); } + + if (servers[ID].description !== undefined) { + document.getElementById('serverdescription_content').innerHTML = `<b>${servers[ID].online}</b><br>${safeTags(servers[ID].description)}`; + } else { + document.getElementById('serverdescription_content').innerHTML = ''; + } +} +window.setServ = setServ; + +function checkOnline(serverID: number, coIP: string) { + let oserv; + if (serverID !== -2) { + try { + oserv = new WebSocket(`ws://${coIP}`); + } catch (SecurityError) { + document.getElementById(`server${serverID}`).className = 'unavailable'; + return; + } + } + + // define what the callbacks do + function onCOOpen(_e) { + document.getElementById(`server${serverID}`).className = 'available'; + oserv.send(`HI#${hdid}#%`); + oserv.send('ID#webAO#webAO#%'); + } + + function onCOMessage(e) { + const comsg = e.data; + const coheader = comsg.split('#', 2)[0]; + const coarguments = comsg.split('#').slice(1); + if (coheader === 'PN') { + servers[serverID].online = `Online: ${Number(coarguments[0])}/${Number(coarguments[1])}`; + oserv.close(); + return; + } if (coheader === 'BD') { + servers[serverID].online = 'Banned'; + servers[serverID].description = coarguments[0]; + oserv.close(); + return; + } + if (serverID === selectedServer) { + document.getElementById('serverdescription_content').innerHTML = `<b>${servers[serverID].online}</b><br>${safeTags(servers[serverID].description)}`; + } + } + + // assign the callbacks + oserv.onopen = function (evt) { + onCOOpen(evt); + }; + + oserv.onmessage = function (evt) { + onCOMessage(evt); + }; + + oserv.onerror = function (_evt) { + document.getElementById(`server${serverID}`).className = 'unavailable'; + }; +} + +function loadServerlist(thelist: { name: string, description: string, ip: string, port: number, ws_port: number, assets: string, online: string }[]) { + localStorage.setItem('masterlist', JSON.stringify(thelist)); + processServerlist(thelist); +} + +function cachedServerlist(response: Response) { + if (!response.ok) { + document.getElementById('ms_error').style.display = 'block'; + processServerlist(JSON.parse(localStorage.getItem('masterlist'))); + return; + } + return response.json(); +} + +function processServerlist(thelist: { name: string, description: string, ip: string, port: number, ws_port: number, assets: string, online: string }[]) { + for (let i = 0; i < thelist.length - 1; i++) { + const serverEntry: { name: string, description: string, ip: string, port: number, ws_port: number, assets: string, online: string } = thelist[i]; + + servers[i] = serverEntry; + + const ipport = `${serverEntry.ip}:${serverEntry.ws_port}`; + + if (serverEntry.ws_port) { + document.getElementById('masterlist').innerHTML + += `<li id="server${i}" onmouseover="setServ(${i})"><p>${safeTags(serverEntry.name)}</p>` + + `<a class="button" href="client.html?mode=watch&ip=${ipport}">Watch</a>` + + `<a class="button" href="client.html?mode=join&ip=${ipport}">Join</a></li>`; + } + } +} + +function processVersion(data: string) { + console.debug(data); + document.getElementById('clientinfo').innerHTML = `Client version: ${version}`; + document.getElementById('serverinfo').innerHTML = `Master server version: ${data}`; +} |
