ddstats-server/libs/ddnss/handler.js

85 lines
2.6 KiB
JavaScript

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()
})
})
}