Add get profile endpoint

This commit is contained in:
2026-01-19 15:41:49 -07:00
parent d3e6c3863b
commit 5648f813a2
3 changed files with 147 additions and 8 deletions

View File

@@ -9,6 +9,7 @@ import { handler as launcherLatestHandler } from './routes/launcher/latest'
import { handler as launcherLoaderLatestHandler } from './routes/launcher/loader/latest' import { handler as launcherLoaderLatestHandler } from './routes/launcher/loader/latest'
import { handler as launcherLoaderUpdateDataHandler } from './routes/launcher/loader/update-data' import { handler as launcherLoaderUpdateDataHandler } from './routes/launcher/loader/update-data'
import { handler as berrydashLeaderboardsHandler } from './routes/berrydash/leaderboards' import { handler as berrydashLeaderboardsHandler } from './routes/berrydash/leaderboards'
import { handler as berrydashProfileGetHandler } from './routes/berrydash/profile/get'
import { handler as berrydashProfilePostsGetHandler } from './routes/berrydash/profile/posts/get' import { handler as berrydashProfilePostsGetHandler } from './routes/berrydash/profile/posts/get'
import { handler as berrydashProfilePostsDeleteHandler } from './routes/berrydash/profile/posts/delete' import { handler as berrydashProfilePostsDeleteHandler } from './routes/berrydash/profile/posts/delete'
@@ -43,6 +44,7 @@ app.get('/berrydash/leaderboards/legacy', context =>
app.get('/berrydash/leaderboards/total', context => app.get('/berrydash/leaderboards/total', context =>
berrydashLeaderboardsHandler(context, 4) berrydashLeaderboardsHandler(context, 4)
) )
app.get('/berrydash/profile', context => berrydashProfileGetHandler(context))
app.get('/berrydash/profile/posts', context => app.get('/berrydash/profile/posts', context =>
berrydashProfilePostsGetHandler(context) berrydashProfilePostsGetHandler(context)
) )

View File

@@ -63,9 +63,9 @@ export const checkClientDatabaseVersion = (request: Request) => {
if (!allowedDatabaseVersions.includes(clientVersion)) return '-998' if (!allowedDatabaseVersions.includes(clientVersion)) return '-998'
} }
export const genTimestamp = (time: number): string => { export const genTimestamp = (time: number, extra = 0): string => {
time = Math.floor(Date.now() / 1000) - time let remaining = Math.floor(Date.now() / 1000) - time
time = time < 1 ? 1 : time remaining = remaining < 1 ? 1 : remaining
const tokens: [number, string][] = [ const tokens: [number, string][] = [
[31536000, 'year'], [31536000, 'year'],
@@ -77,12 +77,17 @@ export const genTimestamp = (time: number): string => {
[1, 'second'] [1, 'second']
] ]
const parts: string[] = []
for (const [unit, text] of tokens) { for (const [unit, text] of tokens) {
if (time < unit) continue if (remaining < unit) continue
if (parts.length > extra) break
const numberOfUnits = Math.floor(time / unit) const value = Math.floor(remaining / unit)
return numberOfUnits + ' ' + text + (numberOfUnits > 1 ? 's' : '') remaining -= value * unit
parts.push(value + ' ' + text + (value > 1 ? 's' : ''))
} }
return '1 second' return parts.length ? parts.join(' ') : '1 second'
} }

View File

@@ -0,0 +1,132 @@
import { Context } from 'elysia'
import {
genTimestamp,
getDatabaseConnection,
jsonResponse
} from '../../../lib/util'
import {
berryDashUserData,
berryDashUserPosts,
users
} from '../../../lib/tables'
import { and, desc, eq } from 'drizzle-orm'
export async function handler (context: Context) {
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 userIdQuery = context.query.userId
? parseInt(context.query.userId, 10)
: 0
if (!userIdQuery || userIdQuery < 1) {
connection0.end()
connection1.end()
return jsonResponse(
{ success: false, message: 'No valid user ID provided', data: null },
400
)
}
const user = await db0
.select({
id: users.id,
username: users.username,
registerTime: users.registerTime
})
.from(users)
.where(eq(users.id, userIdQuery))
.execute()
if (!user[0]) {
connection0.end()
connection1.end()
return jsonResponse(
{ success: false, message: 'User does not exist', data: null },
404
)
}
const userData = await db1
.select({
id: berryDashUserData.id,
saveData: berryDashUserData.saveData
})
.from(berryDashUserData)
.where(and(eq(berryDashUserData.id, user[0].id)))
.execute()
const savedata = userData[0].saveData
? JSON.parse(userData[0].saveData)
: null
if (!savedata)
return jsonResponse(
{ success: false, message: 'User save does not exist', data: null },
404
)
connection0.end()
connection1.end()
let custom = null
if (savedata['bird']['customIcon']['selected']) {
const selected = savedata['bird']['customIcon']['selected']
for (const entry of savedata['bird']['customIcon']['data']) {
if (entry['uuid'] && entry['uuid'] === selected) {
custom = entry['data']
break
}
}
}
return jsonResponse({
success: true,
message: null,
data: {
username: user[0].username,
memberFor: genTimestamp(user[0].registerTime, 2),
icon: custom ? null : savedata['bird']['icon'] ?? 1,
overlay: custom ? null : savedata['bird']['overlay'] ?? 0,
iconColor: custom
? null
: savedata['settings']['colors']['icon'] ?? [255, 255, 255],
overlayColor: custom
? null
: savedata['settings']['colors']['overlay'] ?? [255, 255, 255],
customIcon: custom,
stats: {
totalNormalBerries: parseInt(
savedata['gameStore']['totalNormalBerries'] ?? 0
),
totalPoisonBerries: parseInt(
savedata['gameStore']['totalPoisonBerries'] ?? 0
),
totalSlowBerries: parseInt(
savedata['gameStore']['totalSlowBerries'] ?? 0
),
totalUltraBerries: parseInt(
savedata['gameStore']['totalUltraBerries'] ?? 0
),
totalSpeedyBerries: parseInt(
savedata['gameStore']['totalSpeedyBerries'] ?? 0
),
totalCoinBerries: parseInt(
savedata['gameStore']['totalCoinBerries'] ?? 0
),
totalRandomBerries: parseInt(
savedata['gameStore']['totalRandomBerries'] ?? 0
),
totalAntiBerries: parseInt(
savedata['gameStore']['totalAntiBerries'] ?? 0
),
coins: parseInt(savedata['bird']['customIcon']['balance'] ?? 0)
}
}
})
}