const markdown = require("marked").parse;
var servercount;
var playercount;
var masterserver;
// Changes the main page
// This is the tabs in the sidebar
function page(page) {
let btns = document.querySelectorAll(".gamesContainer button");
let pages = document.querySelectorAll(".mainContainer .contentContainer");
for (let i = 0; i < pages.length; i++) {
pages[i].classList.add("hidden");
}
for (let i = 0; i < btns.length; i++) {
btns[i].classList.add("inactive");
}
pages[page].classList.remove("hidden");
btns[page].classList.remove("inactive");
bgHolder.setAttribute("bg", page);
}; page(1)
function formatRelease(notes) {
if (! notes) {return ""}
let content = "";
if (notes.length === 1) {
content = notes[0];
} else {
for (let release of notes) {
if (release.prerelease) {continue}
let new_content =
// release date
new Date(release.published_at).toLocaleString() +
"\n" +
// release name
`# ${release.name}` +
"\n\n" +
// actual release text/body
release.body +
"\n\n\n";
content +=
"
\n"
+ markdown(new_content, {breaks: true}) + "\n" +
"
";
}
content = content.replaceAll(/\@(\S+)/g, `@$1`);
}
return markdown(content, {
breaks: true
});
}
// sets content of `div` to a single release block with centered text
// inside it, the text being `lang(lang_key)`
let set_error_content = (div, lang_key) => {
div.innerHTML =
"" +
"
" +
lang(lang_key) +
"" +
"
";
}
// Updates the Viper release notes
ipcRenderer.on("vp-notes", (event, response) => {
if (! response) {
return set_error_content(
vpReleaseNotes,
"request.no_vp_release_notes"
)
}
vpReleaseNotes.innerHTML = formatRelease(response);
});
// Updates the Northstar release notes
ipcRenderer.on("ns-notes", (event, response) => {
if (! response) {
return set_error_content(
nsRelease,
"request.no_ns_release_notes"
)
}
nsRelease.innerHTML = formatRelease(response);
});
async function loadVpReleases() {
ipcRenderer.send("get-vp-notes");
}; loadVpReleases();
async function loadNsReleases() {
ipcRenderer.send("get-ns-notes");
}; loadNsReleases();
// TODO: We gotta make this more automatic instead of switch statements
// it's both not pretty, but adding more sections requires way too much
// effort, compared to how it should be.
function showVpSection(section) {
if (!["main", "release", "info", "credits"].includes(section)) throw new Error("unknown vp section");
vpMainBtn.removeAttribute("active");
vpReleaseBtn.removeAttribute("active");
vpInfoBtn.removeAttribute("active");
vpMain.classList.add("hidden");
vpReleaseNotes.classList.add("hidden");
vpInfo.classList.add("hidden");
switch(section) {
case "main":
vpMainBtn.setAttribute("active", "");
vpMain.classList.remove("hidden");
break;
case "release":
vpReleaseBtn.setAttribute("active", "");
vpReleaseNotes.classList.remove("hidden");
break;
case "info":
vpInfoBtn.setAttribute("active", "");
vpInfo.classList.remove("hidden");
break;
}
}
function showNsSection(section) {
if (!["main", "release", "mods"].includes(section)) {
throw new Error("unknown ns section");
}
nsMainBtn.removeAttribute("active");
nsModsBtn.removeAttribute("active");
nsReleaseBtn.removeAttribute("active");
nsMain.classList.add("hidden");
nsMods.classList.add("hidden");
nsRelease.classList.add("hidden");
switch(section) {
case "main":
nsMainBtn.setAttribute("active", "");
nsMain.classList.remove("hidden");
break;
case "mods":
nsModsBtn.setAttribute("active", "");
nsMods.style.display = "block";
nsMods.classList.remove("hidden");
break;
case "release":
nsReleaseBtn.setAttribute("active", "");
nsRelease.classList.remove("hidden");
break;
}
}
async function loadServers() {
serverstatus.classList.add("checking");
try {
let host = "northstar.tf";
let path = "/client/servers";
// ask the masterserver for the list of servers, if this has
// been done recently, it'll simply return the cached version
let servers = JSON.parse(
await request(host, path, "ns-servers", false)
)
masterserver = true;
playercount = 0;
servercount = servers.length;
for (let i = 0; i < servers.length; i++) {
playercount += servers[i].playerCount
}
}catch (err) {
playercount = 0;
servercount = 0;
masterserver = false;
}
serverstatus.classList.remove("checking");
if (servercount == 0 || ! servercount || ! playercount) {masterserver = false}
let playerstr = lang("gui.server.players");
if (playercount == 1) {
playerstr = lang("gui.server.player");
}
if (masterserver) {
serverstatus.classList.add("up");
serverstatus.innerHTML = `${servercount} ${lang("gui.server.servers")} - ${playercount} ${playerstr}`;
} else {
serverstatus.classList.add("down");
serverstatus.innerHTML = lang("gui.server.offline");
}
}; loadServers()
// Refreshes every 5 minutes
setInterval(() => {
loadServers();
}, 300000)