103 lines
3.0 KiB
JavaScript
103 lines
3.0 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(`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);
|
|
*/
|