import fetch from 'node-fetch' import { exec } from 'child_process' import { skinDB } from '../database/init.js' import initLog from '../utils/log.js' const log = initLog("DDNSS") export async function ddnssStart() { const getServers = await fetch('https://ddnet.tw/status/index.json'); const servers = await getServers.json(); console.log(servers) for (const server of servers) { const connection = `${server.ip}:${server.port}` if (!(server.num_clients > 0 && server.num_clients < (server.max_clients - 2))) return log(`Server (essentially) full! >> ${server.ip}:${server.port} -> ${server.num_clients}/${server.max_clients} clients`) log(`Connecting to server >> ${connection}`) await scrapeServer(`${connection}`) } exec(`pkill -9 -f ddnss`) } function scrapeServer(server) { const command = `./ddnss/build/DDNet "ui_server_address ${server}" -f ddnss/build/config.conf` return new Promise((resolve, reject) => { exec(command, { encoding: 'utf8' }, (err, stdout, stderr) => { try { const skinData = JSON.parse(stdout) if (skinData === null) { resolve() return } const currentTime = Date.now() for (const entry of skinData) skinDB .prepare(` INSERT INTO "skindata" ( timestamp, player, clan, flag, skin, useColor, colorBodyRaw, colorBodyHex, colorFeetRaw, ColorFeetHex ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) `) .run( currentTime, 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, ) } catch (e) { log(`Failed to handle ${server}!`) } resolve() }) }) }