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