import fetch from 'node-fetch' import { exec } from 'child_process' import { skinDB } from "../db/init.js" export async function ddnssStart() { const response = await fetch('https://ddnet.tw/status/index.json'); const data = await response.json(); console.log(data) for (const servers of data) { /* Check if server isn't empty and not full */ if (servers.num_clients > 0 && servers.num_clients < 59) { let server = `${servers.ip}:${servers.port}` console.log(`Connecting: ${servers.ip}:${servers.port}`) /* exec ddnss */ await scrapeServer(`${server}`) } else console.log(`Server full: ${servers.ip}:${servers.port}`) } } export function scrapeServer(server) { let command = `./ddnss/build/DDNet "ui_server_address ${server}" -f ddnss/build/config.conf` let skinData return new Promise((done, failed) => { exec(command, { encoding: 'utf8', timeout: 10000 }, (err, stdout, stderr) => { if (err) { err.stdout = stdout err.stderr = stderr } /* Handle error from parsing of JSON */ try { skinData = JSON.parse(stdout) } catch (e) { done() return } if (skinData === null) { done() return } /* Get timestamp */ let ts = (Date.now()) /* Insert skindata */ for (const entry of skinData) { skinDB.prepare(`INSERT INTO "skindata" ( timestamp, player, clan, flag, skin, useColor, colorBodyRaw, colorBodyHex, colorFeetRaw, ColorFeetHex ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`). run( ts, entry.player, entry.clan, entry.flag, entry.skindata.skin, entry.skindata.useColor, entry.skindata.colorBody.raw, entry.skindata.colorBody.hex, entry.skindata.colorFeet.raw, entry.skindata.colorFeet.hex, ) } done() /* A bit hacky way of killing ddnss */ //exec(`pkill -9 -f ddnss`) }) }) } /* CREATE TABLE IF NOT EXISTS "skindata" ( "timestamp" INTEGER NOT NULL, "player" varchar(16) NOT NULL, "clan" varchar(12) NOT NULL, "flag" INTEGER NOT NULL, "skin" varchar(16) NOT NULL, "useColor" INTEGER NOT NULL, "colorBodyRaw" INTEGER NOT NULL, "colorBodyHex" varchar(8) NOT NULL, "colorFeetRaw" INTEGER NOT NULL, "colorFeetHex" varchar(8) NOT NULL); */