summaryrefslogtreecommitdiff
path: root/src/renderer/gameserver/onlineCount.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/renderer/gameserver/onlineCount.ts')
-rw-r--r--src/renderer/gameserver/onlineCount.ts86
1 files changed, 75 insertions, 11 deletions
diff --git a/src/renderer/gameserver/onlineCount.ts b/src/renderer/gameserver/onlineCount.ts
index af8a7b6..d78fa96 100644
--- a/src/renderer/gameserver/onlineCount.ts
+++ b/src/renderer/gameserver/onlineCount.ts
@@ -1,18 +1,19 @@
import GameServer from './server';
-const MAX_SHOWN_NAMES = 3;
+const MAX_SHOWN_NAMES = 5;
-export function makeOnlineCounterList(server:GameServer):HTMLElement{
+export async function makeOnlineCounterList(server:GameServer):Promise<HTMLElement>{
- const playerList = [
- 'LawnCable',
- 'Saulc GM',
- 'Crazyfefe',
- 'Jesus Saves',
- 'DUSTMAN'
- ];
-
- return generateHTML(playerList);
+ try {
+ const playerList = await fetchOnlineList(server);
+ return generateHTML(playerList);
+ } catch (err) {
+ console.log(err);
+ const OnlineCounterContainer = document.createElement('span');
+ OnlineCounterContainer.classList.add("onlineCounter");
+ OnlineCounterContainer.innerHTML = `<i class="fas fa-times fa-xs"></i>Error:<br>${err}`;
+ return OnlineCounterContainer;
+ }
}
@@ -49,3 +50,66 @@ function generateHTML(onlinePlayers:string[]):HTMLElement{
OnlineCounterContainer.appendChild(PlayerList);
return OnlineCounterContainer;
}
+
+export enum OnlineListParser {
+ Invalid,
+ TMW,
+ TMW2API,
+ EXAMPLE_DATA,
+};
+
+async function fetchOnlineList(server:GameServer):Promise<string[]>{
+
+ if(!server.OnlineList)throw new Error("No Online list was\n specified for this Server");
+
+ if(server.OnlineList.parser && server.OnlineList.url){
+ switch(server.OnlineList.parser){
+ case OnlineListParser.EXAMPLE_DATA:
+ return [
+ 'LawnCable',
+ 'Saulc GM',
+ 'Crazyfefe',
+ 'Jesus Saves',
+ 'DUSTMAN'
+ ];
+ case OnlineListParser.TMW:
+ return tmwParser(await request(server.OnlineList.url));
+ default:
+ throw new Error("Online List Parser is unknown");
+ }
+ } else {
+ throw new Error("Online List wasn't configured right");
+ }
+}
+
+
+function tmwParser(rawData:string):string[]{
+ let stringArray:string[]=[];
+ rawData.replace(/<td>(.+?)<\/td>/g, (x:string, content:string) =>{
+ stringArray.push(content.replace(/<\/{0,1}.+?>/g, ""));
+ return "";
+ });
+ return stringArray;
+}
+
+
+function request(url:string):Promise<string>{
+ return new Promise((res, rej)=>{
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', url);
+ xhr.addEventListener("error", (ev)=>{
+ console.log("Probably a network error:", ev);
+ rej(new Error("Probably a network error"));
+ });
+ xhr.onload = function() {
+ if (xhr.status === 200) {
+ res(xhr.responseText);
+ }
+ else {
+ console.log(`xhr.status: ${xhr.status} != 200`);
+ rej(new Error("Probably a network error"));
+ }
+ };
+ xhr.send();
+ });
+}