add player report to server player list
This commit is contained in:
+26
-43
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user