Fix: badge API now reads from Gamedata/c_images/album1584
CI / check (push) Successful in 30s
Gitea Actions Runner Test / test-job (push) Successful in 2s
Gitea Runner Clean Test / test-job (push) Successful in 2s
CI / tests-unit (push) Successful in 1m46s
CI / tests-integration (push) Successful in 1m38s
CI / tests-ui (push) Successful in 2m26s
CI / preflight (push) Skipped
CI / deploy (push) Successful in 3m18s
CI / check (push) Successful in 30s
Gitea Actions Runner Test / test-job (push) Successful in 2s
Gitea Runner Clean Test / test-job (push) Successful in 2s
CI / tests-unit (push) Successful in 1m46s
CI / tests-integration (push) Successful in 1m38s
CI / tests-ui (push) Successful in 2m26s
CI / preflight (push) Skipped
CI / deploy (push) Successful in 3m18s
The badge GIF files exist at /var/www/Gamedata/c_images/album1584/ but the /api/imaging/badge endpoint only looked in /swf/c_images/album1584/ (relative to process.cwd()). Added GEDATA_IMAGES_BASE candidate and fetchCandidate handler so badges render correctly in the admin UI and on the site.
This commit is contained in:
1 parent
acbb833eca
commit
57529fd1ea
1 file changed
+18
-1
@@ -23,6 +23,7 @@ const CODE_RE = /^[A-Za-z0-9_+.-]+$/;
|
|||||||
const CODE_MAX_LEN = 50;
|
const CODE_MAX_LEN = 50;
|
||||||
const DEFAULT_BASE = "https://images.habbo.com/c_images/album1584";
|
const DEFAULT_BASE = "https://images.habbo.com/c_images/album1584";
|
||||||
const LOCAL_SWF_BASE = "/swf/c_images/album1584";
|
const LOCAL_SWF_BASE = "/swf/c_images/album1584";
|
||||||
|
const GEDATA_IMAGES_BASE = "/var/www/Gamedata/c_images/album1584";
|
||||||
const FETCH_TIMEOUT_MS = 5_000;
|
const FETCH_TIMEOUT_MS = 5_000;
|
||||||
|
|
||||||
// Neutral placeholder (grey rounded square) served as a 200 so broken badge
|
// Neutral placeholder (grey rounded square) served as a 200 so broken badge
|
||||||
@@ -45,10 +46,11 @@ export async function GET(request: NextRequest) {
|
|||||||
const sourceLocal = request.nextUrl.searchParams.get("source") === "local";
|
const sourceLocal = request.nextUrl.searchParams.get("source") === "local";
|
||||||
|
|
||||||
const candidates: string[] = sourceLocal
|
const candidates: string[] = sourceLocal
|
||||||
? [LOCAL_SWF_BASE, DEFAULT_BASE]
|
? [LOCAL_SWF_BASE, GEDATA_IMAGES_BASE, DEFAULT_BASE]
|
||||||
: [
|
: [
|
||||||
...((configured && [configured]) as string[]),
|
...((configured && [configured]) as string[]),
|
||||||
DEFAULT_BASE,
|
DEFAULT_BASE,
|
||||||
|
GEDATA_IMAGES_BASE,
|
||||||
LOCAL_SWF_BASE,
|
LOCAL_SWF_BASE,
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -105,6 +107,7 @@ async function fetchCandidate(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Local `/swf/...` path — read straight from the deployed public folder.
|
// Local `/swf/...` path — read straight from the deployed public folder.
|
||||||
|
if (normalized.startsWith("/swf")) {
|
||||||
try {
|
try {
|
||||||
const file = join(
|
const file = join(
|
||||||
process.cwd(),
|
process.cwd(),
|
||||||
@@ -117,6 +120,20 @@ async function fetchCandidate(
|
|||||||
} catch {
|
} catch {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Local Gamedata path — read from /var/www/Gamedata/c_images/album1584/
|
||||||
|
if (normalized.startsWith("/var/www/Gamedata")) {
|
||||||
|
try {
|
||||||
|
const file = join(normalized, `${code}.gif`);
|
||||||
|
const body = new Uint8Array(await readFile(file));
|
||||||
|
return { body, contentType: "image/gif", source: "local" };
|
||||||
|
} catch {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
function badgeResponse(
|
function badgeResponse(
|
||||||
|
|||||||
Reference in new issue
Block a user