45 lines
1.2 KiB
TypeScript
45 lines
1.2 KiB
TypeScript
/**
|
|
* Centralized Habbo avatar imager utility.
|
|
* Points to the self-hosted imager API (`/api/imaging/avatar`) which handles
|
|
* disk + memory caching and (Phase 2) local rendering from .nitro bundles.
|
|
* Override with NEXT_PUBLIC_IMAGER_URL when needed (e.g. CDN in front).
|
|
*/
|
|
|
|
const IMAGER_URL = process.env.NEXT_PUBLIC_IMAGER_URL || '/api/imaging/avatar'
|
|
|
|
export type { AvatarOptions } from '@/types/admin'
|
|
|
|
import type { AvatarOptions } from '@/types/admin'
|
|
|
|
/**
|
|
* Build an avatar image URL served by the self-hosted imager.
|
|
*
|
|
* @example
|
|
* getAvatarUrl('hr-893-45.hd-180-1.ch-210-66.lg-270-82')
|
|
* getAvatarUrl(look, { size: 'l', headOnly: true })
|
|
* getAvatarUrl(look, { size: 'm', gesture: 'sml', direction: 2 })
|
|
*/
|
|
export function getAvatarUrl(figure: string, options: AvatarOptions = {}): string {
|
|
const {
|
|
size = 'm',
|
|
direction = 2,
|
|
headDirection = 3,
|
|
headOnly = false,
|
|
gesture,
|
|
action,
|
|
} = options
|
|
|
|
const params = new URLSearchParams({
|
|
figure,
|
|
direction: String(direction),
|
|
head_direction: String(headDirection),
|
|
size,
|
|
})
|
|
|
|
if (headOnly) params.set('headonly', '1')
|
|
if (gesture) params.set('gesture', gesture)
|
|
if (action) params.set('action', action)
|
|
|
|
return `${IMAGER_URL}?${params.toString()}`
|
|
}
|