Files
api/src/routes/berrydash/leaderboard/get.ts

147 lines
4.0 KiB
TypeScript

import { Context } from 'elysia'
import { getDatabaseConnection, jsonResponse } from '../../../lib/util'
import {
berryDashMarketplaceIcons,
berryDashUserData,
users
} from '../../../lib/tables'
import { eq } from 'drizzle-orm'
export async function handler (context: Context, type: number) {
const dbInfo0 = getDatabaseConnection(0)
const dbInfo1 = getDatabaseConnection(1)
if (!dbInfo0 || !dbInfo1)
return jsonResponse(
{ success: false, message: 'Failed to connect to database', data: null },
500
)
const { connection: connection0, db: db0 } = dbInfo0
const { connection: connection1, db: db1 } = dbInfo1
let request_value = ''
if (type == 0) {
request_value = 'highScore'
} else if (type == 1) {
let berryQuery = context.query.berry ? parseInt(context.query.berry, 10) : 0
switch (berryQuery) {
case 1:
request_value = 'totalPoisonBerries'
break
case 2:
request_value = 'totalSlowBerries'
break
case 3:
request_value = 'totalUltraBerries'
break
case 4:
request_value = 'totalSpeedyBerries'
break
case 5:
request_value = 'totalCoinBerries'
break
case 6:
request_value = 'totalRandomBerries'
break
case 7:
request_value = 'totalAntiBerries'
break
default:
request_value = 'totalNormalBerries'
break
}
} else if (type != 2 && type != 3 && type != 4) {
connection0.end()
connection1.end()
return jsonResponse({ success: false, message: 'Invalid Type', data: null })
}
const userList = await db0
.select({
username: users.username,
id: users.id
})
.from(users)
.where(eq(users.leaderboardsBanned, false))
.execute()
const userDataList = await db1
.select({
id: berryDashUserData.id,
saveData: berryDashUserData.saveData,
legacyHighScore: berryDashUserData.legacyHighScore
})
.from(berryDashUserData)
.execute()
const completeUserList = userList.map(user => {
const data = userDataList.find(d => d.id === user.id)
return {
...user,
...(data ? data : {})
}
})
let mapped: Record<string, {}> = {}
let icons: Record<string, string> = {}
for (const row of completeUserList) {
const savedata = row.saveData ? JSON.parse(row.saveData) : null
if (!savedata) continue
let value = 0
if (type === 4) {
const berries = [
'totalNormalBerries',
'totalPoisonBerries',
'totalSlowBerries',
'totalUltraBerries',
'totalSpeedyBerries',
'totalCoinBerries',
'totalRandomBerries',
'totalAntiBerries'
]
value = berries.reduce(
(acc, b) => acc + parseInt(savedata.gameStore?.[b] ?? 0, 10),
0
)
} else if (type === 2) {
value = parseInt(savedata.bird?.customIcon?.balance ?? 0, 10)
} else if (type === 3) {
value = parseInt(String(row.legacyHighScore ?? 0), 10)
} else {
value = parseInt(savedata.gameStore?.[request_value] ?? 0, 10)
}
if (value <= 0) continue
const customIcon = savedata.bird?.customIcon?.selected ?? null
if (customIcon && customIcon.length === 36 && !icons[customIcon]) {
const [iconRow] = await db1
.select({ data: berryDashMarketplaceIcons.data })
.from(berryDashMarketplaceIcons)
.where(eq(berryDashMarketplaceIcons.uuid, customIcon))
.limit(1)
.execute()
if (iconRow) icons[customIcon] = iconRow.data
}
mapped[row.id] = {
username: row.username,
value,
icon: savedata.bird?.icon ?? 1,
overlay: savedata.bird?.overlay ?? 0,
birdColor: savedata.settings?.colors?.icon ?? [255, 255, 255],
overlayColor: savedata.settings?.colors?.overlay ?? [255, 255, 255],
customIcon
}
}
connection0.end()
connection1.end()
return jsonResponse({
success: true,
message: null,
data: { entries: mapped, customIcons: icons }
})
}