import FingerprintJS from '@fingerprintjs/fingerprintjs';
import { unescapeChat, safeTags } from './encoding.js';
const version = process.env.npm_package_version;
const MASTERSERVER_IP = 'master.aceattorneyonline.com:27014';
let masterserver;
let hdid;
const options = { fonts: { extendedJsFonts: true, userDefinedFonts: ['Ace Attorney', '8bitoperator', 'DINEngschrift'] }, excludes: { userAgent: true, enumerateDevices: true } };
let selectedServer = -1;
const servers = [];
servers[-2] = {
name: 'Singleplayer', description: 'Build cases, try out new things', ip: '127.0.0.1', port: 50001, assets: '', online: '',
};
servers[-1] = {
name: 'Localhost', description: 'This is your computer on port 50001', ip: '127.0.0.1', port: 50001, assets: '', online: 'Online: ?/?',
};
const fpPromise = FingerprintJS.load();
fpPromise
.then((fp) => fp.get())
.then((result) => {
hdid = result.visitorId;
check_https();
masterserver = new WebSocket(`ws://${MASTERSERVER_IP}`);
masterserver.onopen = (evt) => onOpen(evt);
masterserver.onerror = (evt) => onError(evt);
masterserver.onmessage = (evt) => onMessage(evt);
// 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) {
selectedServer = ID;
if (document.getElementById(`server${ID}`).className === '') { checkOnline(ID, `${servers[ID].ip}:${servers[ID].port}`); }
if (servers[ID].description !== undefined) {
document.getElementById('serverdescription_content').innerHTML = `${servers[ID].online}
${safeTags(servers[ID].description)}`;
} else {
document.getElementById('serverdescription_content').innerHTML = '';
}
}
window.setServ = setServ;
function onOpen(_e) {
console.log(`Your emulated HDID is ${hdid}`);
masterserver.send('ID#webAO#webAO#%');
masterserver.send('ALL#%');
masterserver.send('VC#%');
}
/**
* Triggered when an network error occurs.
* @param {ErrorEvent} e
*/
function onError(evt) {
document.getElementById('ms_error').style.display = 'block';
document.getElementById('ms_error_code').innerText = `A network error occurred: ${evt.reason} (${evt.code})`;
}
function checkOnline(serverID, coIP) {
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 = `${servers[serverID].online}
${safeTags(servers[serverID].description)}`; }
}
// assign the callbacks
oserv.onopen = function (evt) {
onCOOpen(evt);
};
oserv.onmessage = function (evt) {
onCOMessage(evt);
};
oserv.onerror = function (_evt) {
console.warn(`${coIP} threw an error.`);
document.getElementById(`server${serverID}`).className = 'unavailable';
};
}
function onMessage(e) {
const msg = e.data;
const header = msg.split('#', 2)[0];
console.debug(msg);
if (header === 'ALL') {
const allservers = msg.split('#').slice(1);
for (let i = 0; i < allservers.length - 1; i++) {
const serverEntry = allservers[i];
const args = serverEntry.split('&');
const thisserver = {
name: args[0], description: args[1], ip: args[2], port: Number(args[3]), assets: args[4], online: 'Online: ?/?',
};
servers[i] = thisserver;
const ipport = `${args[2]}:${args[3]}`;
const asset = args[4] ? `&asset=${args[4]}` : '';
document.getElementById('masterlist').innerHTML
+= `
${safeTags(servers[i].name)}
` + `Watch` + `Join