38 lines
1.2 KiB
TypeScript
38 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()}`;
|
|
}
|