add player report to server player list

This commit is contained in:
2023-03-13 19:23:34 +01:00
parent e67948abac
commit 3959e73597
+26 -43
View File
@@ -19,68 +19,51 @@ const middlewares: RequestHandler[] = [
]
async function getServerPlayers(server: number) {
const killsData = await cache.HGETALL(`servers:${server}:players:kills`)
const deathData = await cache.HGETALL(`servers:${server}:players:deaths`)
const data: { [x: string]: { kills: string; deaths: string } } = {}
Object.keys(killsData).forEach((key) => {
data[key] = { kills: killsData[key], deaths: deathData[key] }
})
const players = await cache.SMEMBERS(`servers:${server}:players`)
const data: {
[playerID: string]: {
[playerData: string]: string
}
} = {}
const promises: Promise<any>[] = []
players.forEach((playerID) =>
promises.push(
cache
.HGETALL(`servers:${server}:players:${playerID}`)
.then((playerData) => {
delete playerData.last_entry
data[playerID] = playerData
})
)
)
await Promise.all(promises)
return data
}
async function processServerPlayers(server: number) {
let last_entry =
Number(await cache.HGET(`servers:${server}:players`, 'last_entry')) || 0
Number(await cache.GET(`servers:${server}:players:last_entry`)) || 0
const newData = await db
.with('killdata', () =>
db
.selectFrom('kill')
.select([count('kill.id').as('num_kills'), 'kill.attacker_id'])
.where('kill.id', '>', last_entry)
.where('kill.server', '=', server)
.whereRef('attacker_id', '!=', 'victim_id')
.groupBy('attacker_id')
)
.with('deathdata', () =>
db
.selectFrom('kill')
.select([count('kill.id').as('num_deaths'), 'kill.victim_id'])
.where('kill.id', '>', last_entry)
.where('kill.server', '=', server)
.groupBy('victim_id')
)
.selectFrom('killdata')
.selectFrom('kill')
.select([
sql<number>`coalesce(killdata.num_kills, 0)`.as('kills'),
sql<number>`coalesce(deathdata.num_deaths, 0)`.as('deaths'),
sql<string>`COALESCE(killdata.attacker_id, deathdata.victim_id)`.as(
'player'
),
'attacker_id',
db
.selectFrom('kill')
.select(max('kill.id').as('last_entry'))
.as('last_entry')
])
.fullJoin('deathdata', 'deathdata.victim_id', 'killdata.attacker_id')
.orderBy('kills', 'desc')
.groupBy('attacker_id')
.execute()
//if no new kills
if (newData.length == 0) {
return
}
last_entry = newData.reduce(
(acc, current) => (current.last_entry > acc ? current.last_entry : acc),
0
)
const promises: Promise<number>[] = []
newData.forEach(({ kills, deaths, player }) => {
promises.push(
cache.HINCRBY(`servers:${server}:players:kills`, player, kills),
cache.HINCRBY(`servers:${server}:players:deaths`, player, deaths)
)
const promises: Promise<any>[] = []
newData.forEach(({ attacker_id }: { attacker_id: string }) => {
promises.push(cache.SADD(`servers:${server}:players`, attacker_id))
})
promises.push(
cache.HSET(`servers:${server}:players`, 'last_entry', newData[0].last_entry)
cache.SET(`servers:${server}:players:last_entry`, newData[0].last_entry)
)
await Promise.all(promises)
}