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(`${servers.num_clients}/63 Server full: ${servers.ip}:${servers.port}`) } /* A bit hacky way of killing ddnss */ exec(`pkill -9 -f ddnss`) } 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() }) }) }