add distance to server weapons, fix async

This commit is contained in:
2023-03-13 19:32:16 +01:00
parent 08eccdf79c
commit 6822f30f87
+106 -18
View File
@@ -2,38 +2,77 @@ import { RequestHandler } from 'express'
import { param } from 'express-validator' import { param } from 'express-validator'
import { validateErrors } from '../common' import { validateErrors } from '../common'
import cache from '../cache/redis' import cache from '../cache/redis'
import { sql } from 'kysely'
import db from '../db/db' import db from '../db/db'
const { count, max } = db.fn const { count, max, avg } = db.fn
const middlewares: RequestHandler[] = [ const middlewares: RequestHandler[] = [
param('serverId').exists().toInt().isInt(), param(['serverId']).exists().toInt().isInt(),
validateErrors, validateErrors,
async (req, res) => { async (req, res) => {
const server = Number(req.params.serverId) const server = Number(req.params.serverId)
await processWeapons(server) await processServerWeapons(server)
const data = await cache.HGETALL(`servers:${server}:weapons`) const data = await getServerWeapons(server)
delete data.last_entry
res.status(200).send(data) res.status(200).send(data)
} }
] ]
async function processWeapons(server: number) { export async function getServerWeapons(server: number) {
const killsData = await cache.HGETALL(`servers:${server}:weapons:kills`)
const avg_distance = await cache.HGETALL(
`servers:${server}:weapons:avg_kill_distance`
)
const max_distance = await cache.HGETALL(
`servers:${server}:weapons:max_kill_distance`
)
const data: {
[x: string]: {
kills: string
avg_kill_distance: string
max_kill_distance: string
}
} = {}
Object.keys(killsData).forEach((key) => {
data[key] = {
kills: killsData[key],
avg_kill_distance: avg_distance[key],
max_kill_distance: max_distance[key]
}
})
return data
}
async function processServerWeapons(server: number) {
let last_entry = let last_entry =
Number(await cache.HGET(`servers:${server}:weapons`, 'last_entry')) || 0 Number(await cache.HGET(`servers:${server}:weapons`, 'last_entry')) || 0
const newData = await db const newData = await db
.selectFrom(['kill']) .with('killdata', () =>
db
.selectFrom('kill')
.select([
count('kill.id').as('num_kills'),
'kill.cause_of_death',
max('distance').as('max_kill_distance'),
avg('distance').as('avg_kill_distance')
])
.where('kill.id', '>', last_entry)
.where('kill.server', '=', server)
.whereRef('attacker_id', '!=', 'victim_id')
.groupBy('cause_of_death')
)
.selectFrom('killdata')
.select([ .select([
count<number>('kill.id').as('num_kills'), sql<number>`coalesce(killdata.num_kills, 0)`.as('kills'),
'kill.cause_of_death', 'killdata.cause_of_death',
'killdata.avg_kill_distance',
'killdata.max_kill_distance',
db db
.selectFrom('kill') .selectFrom('kill')
.select(max('kill.id').as('last_entry')) .select(max('kill.id').as('last_entry'))
.as('last_entry') .as('last_entry')
]) ])
.where('server', '=', server) .orderBy('kills', 'desc')
.where('kill.id', '>', last_entry)
.groupBy('cause_of_death')
.execute() .execute()
//if no new kills //if no new kills
if (newData.length == 0) { if (newData.length == 0) {
@@ -43,12 +82,61 @@ async function processWeapons(server: number) {
(acc, current) => (current.last_entry > acc ? current.last_entry : acc), (acc, current) => (current.last_entry > acc ? current.last_entry : acc),
0 0
) )
const promises: Promise<number>[] = [] const promises: Promise<any>[] = []
newData.forEach(({ num_kills, cause_of_death }) => { newData.forEach(
promises.push( ({ cause_of_death, kills, avg_kill_distance, max_kill_distance }) => {
cache.HINCRBY(`servers:${server}:weapons`, cause_of_death, num_kills) promises.push(
) (async () => {
}) const oldKills =
Number(
await cache.HGET(
`servers:${server}:weapons:kills`,
cause_of_death
)
) || 0
const oldaverage =
Number(
await cache.HGET(
`servers:${server}:weapons:avg_kill_distance`,
cause_of_death
)
) | 0
const totalkills = oldKills + kills
const newAverage =
(oldKills / totalkills) * oldaverage +
(kills / totalkills) * Number(avg_kill_distance)
const oldMaxDistance =
Number(
await cache.HGET(
`servers:${server}:weapons:max_kill_distance`,
cause_of_death
)
) | 0
promises.push(
cache.HINCRBY(
`servers:${server}:weapons:kills`,
cause_of_death,
kills
),
cache.HSET(
`servers:${server}:weapons:avg_kill_distance`,
cause_of_death,
newAverage | 0
),
cache.HSET(
`servers:${server}:weapons:max_kill_distance`,
cause_of_death,
oldMaxDistance < max_kill_distance
? max_kill_distance
: oldMaxDistance
)
)
})()
)
}
)
promises.push( promises.push(
cache.HSET(`servers:${server}:weapons`, 'last_entry', newData[0].last_entry) cache.HSET(`servers:${server}:weapons`, 'last_entry', newData[0].last_entry)
) )