mirror of
https://github.com/ershisan99/www.git
synced 2025-12-17 05:19:23 +00:00
119 lines
2.7 KiB
TypeScript
119 lines
2.7 KiB
TypeScript
import { db } from '@/server/db'
|
|
import { player_games } from '@/server/db/schema'
|
|
import { desc, eq } from 'drizzle-orm'
|
|
import { Redis } from 'ioredis'
|
|
const redisClient = new Redis(process.env.REDIS_URL as string)
|
|
|
|
type PlayerState = {
|
|
status: string
|
|
currentMatch?: {
|
|
opponentId: string
|
|
startTime: number
|
|
}
|
|
}
|
|
|
|
type StatusCount = {
|
|
[key: string]: number
|
|
}
|
|
|
|
type QueueEntry = {
|
|
key: string
|
|
value: PlayerState
|
|
}
|
|
|
|
async function findQueueingPlayers(redis: Redis): Promise<QueueEntry[]> {
|
|
try {
|
|
const queueingPlayers: QueueEntry[] = []
|
|
let cursor = '0'
|
|
const pattern = 'player:*:state'
|
|
|
|
do {
|
|
const [newCursor, keys] = await redis.scan(
|
|
cursor,
|
|
'MATCH',
|
|
pattern,
|
|
'COUNT',
|
|
'1000'
|
|
)
|
|
|
|
cursor = newCursor
|
|
|
|
if (keys.length > 0) {
|
|
const values = await redis.mget(keys)
|
|
|
|
keys.forEach((key, index) => {
|
|
const value = values[index]
|
|
if (!value) return
|
|
|
|
try {
|
|
const state = JSON.parse(value) as PlayerState
|
|
if (state.status === 'queuing') {
|
|
queueingPlayers.push({
|
|
key,
|
|
value: state,
|
|
})
|
|
}
|
|
} catch (parseError) {
|
|
console.error('Failed to parse player state:', parseError)
|
|
console.error('Problematic value:', value)
|
|
}
|
|
})
|
|
}
|
|
} while (cursor !== '0')
|
|
|
|
return queueingPlayers
|
|
} catch (error) {
|
|
console.error('Failed to find queuing players:', error)
|
|
throw error
|
|
}
|
|
}
|
|
|
|
redisClient.on('connect', () => {
|
|
console.log('Redis client connected')
|
|
})
|
|
|
|
redisClient.on('error', (err) => {
|
|
console.error('Redis client error:', err)
|
|
})
|
|
|
|
async function logQueueingPlayers() {
|
|
try {
|
|
const queueingPlayers = await findQueueingPlayers(redisClient)
|
|
console.log('Found', queueingPlayers.length, 'queuing players:')
|
|
console.log(queueingPlayers)
|
|
|
|
return await Promise.all(
|
|
queueingPlayers.map(async (player) => {
|
|
const lastGame = await db
|
|
.select()
|
|
.from(player_games)
|
|
.where(
|
|
eq(
|
|
player_games.playerId,
|
|
player.key.replace('player:', '').replace(':state', '')
|
|
)
|
|
)
|
|
.orderBy(desc(player_games.gameTime))
|
|
.limit(1)
|
|
return lastGame[0]
|
|
})
|
|
)
|
|
} catch (error) {
|
|
console.error('Failed to log queuing players:', error)
|
|
throw error
|
|
} finally {
|
|
await redisClient.quit()
|
|
}
|
|
}
|
|
|
|
logQueueingPlayers()
|
|
.then((e) => {
|
|
for (const p of e)
|
|
console.log('--', p?.playerName, Math.round(p?.playerMmr ?? 0), 'MMR')
|
|
process.exit(0)
|
|
})
|
|
.catch((error) => {
|
|
console.error('Unhandled error in logQueueingPlayers:', error)
|
|
process.exit(1)
|
|
})
|