Solve some issues with ddnss

main
furo 2021-11-06 21:59:49 +01:00
parent 32cb0ab344
commit 79969dbfb0
6 changed files with 323 additions and 43 deletions

1
.gitignore vendored
View File

@ -121,3 +121,4 @@ package-lock.json
pnpm-lock.yaml pnpm-lock.yaml
.env .env
data/* data/*
ddnss/*

View File

@ -49,4 +49,4 @@ Server.use('/assets', express.static('static'))
const elapsed = Date.now() - start const elapsed = Date.now() - start
log(`Took ${elapsed/1000} seconds to start the server!`) log(`Took ${elapsed/1000} seconds to start the server!`)
Server.listen(process.env.PORT ?? 12345, () => log(`Server started and listening on port ${process.env.PORT}.`)) Server.listen(process.env.PORT ?? 12345, () => log(`Server started and listening on port ${process.env.PORT}.`))

View File

@ -166,13 +166,13 @@ export function generateDB() {
`CREATE INDEX IF NOT EXISTS "idx_maps_categoryMap" ON "maps" ("category", "map")` `CREATE INDEX IF NOT EXISTS "idx_maps_categoryMap" ON "maps" ("category", "map")`
]) ])
skinDB.exec(` skinDB.exec(`
CREATE TABLE IF NOT EXISTS "skindata" ( CREATE TABLE IF NOT EXISTS "skindata" (
"timestamp" INTEGER NOT NULL, "timestamp" INTEGER NOT NULL,
"player" varchar(16) NOT NULL, "player" varchar(16) NOT NULL,
"clan" varchar(12) NOT NULL, "clan" varchar(12) NOT NULL,
"flag" INTEGER NOT NULL, "flag" varchar(16) NOT NULL DEFAULT 'default',
"twFlag" INTEGER NOT NULL,
"skin" varchar(16) NOT NULL, "skin" varchar(16) NOT NULL,
"useColor" INTEGER NOT NULL, "useColor" INTEGER NOT NULL,
"colorBodyRaw" INTEGER NOT NULL, "colorBodyRaw" INTEGER NOT NULL,

View File

@ -0,0 +1,257 @@
{
"-1":"default",
"901":"XEN",
"902":"XNI",
"903":"XSC",
"904":"XWA",
"905":"XEU",
"906":"XCA",
"737":"SS",
"4":"AF",
"248":"AX",
"8":"AL",
"12":"DZ",
"16":"AS",
"20":"AD",
"24":"AO",
"660":"AI",
"28":"AG",
"32":"AR",
"51":"AM",
"533":"AW",
"36":"AU",
"40":"AT",
"31":"AZ",
"44":"BS",
"48":"BH",
"50":"BD",
"52":"BB",
"112":"BY",
"56":"BE",
"84":"BZ",
"204":"BJ",
"60":"BM",
"64":"BT",
"68":"BO",
"535":"BQ",
"70":"BA",
"72":"BW",
"74":"BV",
"76":"BR",
"86":"IO",
"96":"BN",
"100":"BG",
"854":"BF",
"108":"BI",
"116":"KH",
"120":"CM",
"124":"CA",
"132":"CV",
"136":"KY",
"140":"CF",
"148":"TD",
"152":"CL",
"156":"CN",
"162":"CX",
"166":"CC",
"170":"CO",
"174":"KM",
"178":"CG",
"180":"CD",
"184":"CK",
"188":"CR",
"384":"CI",
"191":"HR",
"192":"CU",
"531":"CW",
"196":"CY",
"203":"CZ",
"208":"DK",
"262":"DJ",
"212":"DM",
"214":"DO",
"218":"EC",
"818":"EG",
"222":"SV",
"226":"GQ",
"232":"ER",
"233":"EE",
"231":"ET",
"238":"FK",
"234":"FO",
"242":"FJ",
"246":"FI",
"250":"FR",
"254":"GF",
"258":"PF",
"260":"TF",
"266":"GA",
"270":"GM",
"268":"GE",
"276":"DE",
"288":"GH",
"292":"GI",
"300":"GR",
"304":"GL",
"308":"GD",
"312":"GP",
"316":"GU",
"320":"GT",
"831":"GG",
"324":"GN",
"624":"GW",
"328":"GY",
"332":"HT",
"334":"HM",
"336":"VA",
"340":"HN",
"344":"HK",
"348":"HU",
"352":"IS",
"356":"IN",
"360":"ID",
"364":"IR",
"368":"IQ",
"372":"IE",
"833":"IM",
"376":"IL",
"380":"IT",
"388":"JM",
"392":"JP",
"832":"JE",
"400":"JO",
"398":"KZ",
"404":"KE",
"296":"KI",
"408":"KP",
"410":"KR",
"414":"KW",
"417":"KG",
"418":"LA",
"428":"LV",
"422":"LB",
"426":"LS",
"430":"LR",
"434":"LY",
"438":"LI",
"440":"LT",
"442":"LU",
"446":"MO",
"807":"MK",
"450":"MG",
"454":"MW",
"458":"MY",
"462":"MV",
"466":"ML",
"470":"MT",
"584":"MH",
"474":"MQ",
"478":"MR",
"480":"MU",
"175":"YT",
"484":"MX",
"583":"FM",
"498":"MD",
"492":"MC",
"496":"MN",
"499":"ME",
"500":"MS",
"504":"MA",
"508":"MZ",
"104":"MM",
"516":"NA",
"520":"NR",
"524":"NP",
"528":"NL",
"540":"NC",
"554":"NZ",
"558":"NI",
"562":"NE",
"566":"NG",
"570":"NU",
"574":"NF",
"580":"MP",
"578":"NO",
"512":"OM",
"586":"PK",
"585":"PW",
"275":"PS",
"591":"PA",
"598":"PG",
"600":"PY",
"604":"PE",
"608":"PH",
"612":"PN",
"616":"PL",
"620":"PT",
"630":"PR",
"634":"QA",
"638":"RE",
"642":"RO",
"643":"RU",
"646":"RW",
"652":"BL",
"654":"SH",
"659":"KN",
"662":"LC",
"663":"MF",
"666":"PM",
"670":"VC",
"882":"WS",
"674":"SM",
"678":"ST",
"682":"SA",
"686":"SN",
"688":"RS",
"690":"SC",
"694":"SL",
"702":"SG",
"534":"SX",
"703":"SK",
"705":"SI",
"90":"SB",
"706":"SO",
"710":"ZA",
"239":"GS",
"724":"ES",
"144":"LK",
"736":"SD",
"740":"SR",
"744":"SJ",
"748":"SZ",
"752":"SE",
"756":"CH",
"760":"SY",
"158":"TW",
"762":"TJ",
"834":"TZ",
"764":"TH",
"626":"TL",
"768":"TG",
"772":"TK",
"776":"TO",
"780":"TT",
"788":"TN",
"792":"TR",
"795":"TM",
"796":"TC",
"798":"TV",
"800":"UG",
"804":"UA",
"784":"AE",
"826":"GB",
"840":"US",
"581":"UM",
"858":"UY",
"860":"UZ",
"548":"VU",
"862":"VE",
"704":"VN",
"92":"VG",
"850":"VI",
"876":"WF",
"732":"EH",
"887":"YE",
"894":"ZM",
"716":"ZW"
}

View File

@ -1,3 +1,5 @@
import fs from 'fs'
import { exec } from 'child_process' import { exec } from 'child_process'
import { skinDB } from '../database/init.js' import { skinDB } from '../database/init.js'
import initLog from '../utils/log.js' import initLog from '../utils/log.js'
@ -5,10 +7,30 @@ import { download } from '../download/dowload.js'
const log = initLog("DDNSS") const log = initLog("DDNSS")
/**
* This function takes a Teeworlds coutry code and
* maps it to a two letter country code instead
*
* @param number Teeworlds country code
*
* @returns Two letter country code
*/
export function mapCountryCode(code) {
const codes = fs.readFileSync('./libs/ddnss/countrycodes.json')
const json = JSON.parse(codes)
for (const country in json) {
if(country == code)
return json[country]
}
/* If none is found, just return default */
return "default"
}
export async function ddnssStart() { export async function ddnssStart() {
const getServers = await download('https://ddnet.tw/status/index.json', "_RETURN_VALUE_") const getServers = await download('https://ddnet.tw/status/index.json', "_RETURN_VALUE_")
const servers = await getServers.json() const servers = await JSON.parse(getServers)
log(`Found ${servers.length} online servers!`) log(`Found ${servers.length} online servers!`)
for (const server of servers) { for (const server of servers) {
@ -26,9 +48,6 @@ export async function ddnssStart() {
log(`Connecting to server >> ${connection}`) log(`Connecting to server >> ${connection}`)
await scrapeServer(`${connection}`) await scrapeServer(`${connection}`)
} }
// PLEASE!!
exec(`pkill -9 -f ddnss`)
} }
function scrapeServer(server) { function scrapeServer(server) {
@ -41,42 +60,43 @@ function scrapeServer(server) {
try { try {
const skinData = JSON.parse(stdout) const skinData = JSON.parse(stdout)
if (skinData === null) { if (skinData === null)
resolve() return resolve()
return
} const stmt = skinDB.prepare
(`
INSERT INTO "skindata" VALUES
(
$timestamp,
$player,
$clan,
$flag,
$twFlag,
$skin,
$useColor,
$colorBodyRaw,
$colorBodyHex,
$colorFeetRaw,
$colorFeetHex
)
`)
const currentTime = Date.now() const currentTime = Date.now()
// TODO: Store statement once and reuse same statment. (whatever that means)
for (const entry of skinData) for (const entry of skinData) {
skinDB.prepare(` stmt.run({
INSERT INTO "skindata"
(
$timestamp,
$player,
$clan,
$flag,
$skin,
$useColor,
$colorBodyRaw,
$colorBodyHex,
$colorFeetRaw,
$ColorFeetHex
)
`)
.run({
timestamp: currentTime, timestamp: currentTime,
player: entry.player, player: entry.player,
clan: entry.clan, clan: entry.clan,
flag: entry.flag, flag: mapCountryCode(entry.flag),
twFlag: entry.flag,
skin: entry.skindata.skin, skin: entry.skindata.skin,
useColor: entry.skindata.useColor, useColor: entry.skindata.useColor,
colorBodyRaw: entry.skindata.colorBody.raw, colorBodyRaw: entry.skindata.colorBody.raw,
colorBodyHex: entry.skindata.colorBody.hex, colorBodyHex: entry.skindata.colorBody.hex,
colorFeetRaw: entry.skindata.colorFeet.raw, colorFeetRaw: entry.skindata.colorFeet.raw,
colorFeetHex: entry.skindata.colorFeet.hex, colorFeetHex: entry.skindata.colorFeet.hex
}) })
}
} catch (e) { } catch (e) {
log(`Failed to handle ${server}!`) log(`Failed to handle ${server}!`)
} }

View File

@ -24,28 +24,30 @@ export function download(url, target) {
url, url,
data => { data => {
if (target === "_RETURN_VALUE_") { if (target === "_RETURN_VALUE_") {
let result let result = ""
data.on( data.on(
'data', 'data',
chunk => result += chunk chunk => result += chunk
) )
data.on( data.on(
'end', 'end',
() => resolve(result) () => resolve(result)
) )
} }
else {
const file = fs.createWriteStream(target) const file = fs.createWriteStream(target)
data.pipe(file)
data.pipe(file) }
data.on( data.on(
'end', 'end',
() => { () => {
log(`Done with a download >> ${url}`) log(`Done with a download >> ${url}`)
file.close()
if (!target === "_RETURN_VALUE_")
file.close()
resolve() resolve()
} }
) )