ddstats-server/libs/ddnss/handler.js

79 lines
2.6 KiB
JavaScript
Raw Normal View History

2021-10-30 20:26:37 +02:00
import fetch from 'node-fetch'
import { exec } from 'child_process'
2021-10-31 23:43:36 +01:00
import { skinDB } from '../database/init.js'
import initLog from '../utils/log.js'
const log = initLog("DDNSS")
2021-10-30 20:26:37 +02:00
export async function ddnssStart() {
2021-10-31 23:43:36 +01:00
const getServers = await fetch('https://ddnet.tw/status/index.json');
const servers = await getServers.json();
console.log(servers)
2021-10-30 20:26:37 +02:00
2021-10-31 23:43:36 +01:00
for (const server of servers) {
const connection = `${server.ip}:${server.port}`
2021-10-30 20:26:37 +02:00
2021-10-31 23:43:36 +01:00
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`)
2021-10-30 20:26:37 +02:00
2021-10-31 23:43:36 +01:00
log(`Connecting to server >> ${connection}`)
await scrapeServer(`${connection}`)
2021-10-30 20:26:37 +02:00
}
2021-10-31 23:43:36 +01:00
2021-10-31 20:46:43 +01:00
exec(`pkill -9 -f ddnss`)
2021-10-30 20:26:37 +02:00
}
2021-10-31 23:43:36 +01:00
function scrapeServer(server) {
2021-10-30 20:26:37 +02:00
2021-10-31 23:43:36 +01:00
const command = `./ddnss/build/DDNet "ui_server_address ${server}" -f ddnss/build/config.conf`
2021-10-30 20:26:37 +02:00
2021-10-31 23:43:36 +01:00
return new Promise((resolve, reject) => {
exec(command, { encoding: 'utf8' }, (err, stdout, stderr) => {
2021-10-30 20:26:37 +02:00
try {
2021-10-31 23:43:36 +01:00
const skinData = JSON.parse(stdout)
2021-10-30 20:26:37 +02:00
2021-10-31 23:43:36 +01:00
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}!`)
2021-10-30 20:26:37 +02:00
}
2021-10-31 23:43:36 +01:00
resolve()
2021-10-30 20:26:37 +02:00
})
})
2021-10-31 20:46:43 +01:00
}