feat : i have no idea what to commit
CI / Verify (push) Successful in 1m16s
CI / Build immutable images and deploy (push) Successful in 1m28s

This commit is contained in:
2026-09-01 22:02:32 +07:00 Unverified
parent 6021607677
commit d3de822366
10 changed files with 409 additions and 251 deletions
+36 -76
View File
@@ -1,99 +1,59 @@
import { connection } from "next/server";
import { getCachedPublicGuide } from "@/lib/cache/public";
import { publicSections } from "@/components/public/structured-guide";
import {
generateOgImage,
ogImageContentType,
ogImageSize,
} from "@/lib/og-image";
export const alt = "Buzz Guide section";
export const alt = "Buzz Guide character guide";
export const size = ogImageSize;
export const contentType = ogImageContentType;
function sectionTitle(slug: string, fallback: string): string {
if (slug === "weapon") return "อาวุธแนะนำ";
if (slug === "artifact") return "อาร์ติแฟกต์และค่าสถานะ";
if (slug === "constellations") return "กลุ่มดาว";
if (slug === "team") return "ทีมแนะนำ";
return fallback;
}
function sectionContent(
guide: Awaited<ReturnType<typeof getCachedPublicGuide>>,
slug: string,
) {
if (!guide) return { description: "คู่มือเกนชินอิมแพกต์", highlights: [] };
if (slug === "weapon") {
return {
description: "อาวุธที่เหมาะกับตัวละคร พร้อมอันดับและเปอร์เซ็นต์การใช้งาน",
highlights: guide.weapons.slice(0, 3).map((item, index) => {
const percent = item.overallPercent ? ` · ${item.overallPercent}%` : "";
return `${index + 1}. ${item.weapon.name}${percent}`;
}),
};
}
if (slug === "artifact") {
const artifactHighlights = guide.artifactGroups.flatMap((group) =>
group.rows.slice(0, 2).map((row) =>
`${group.name}: ${row.first.name}${row.second ? ` + ${row.second.name}` : ""}`,
),
);
const targetHighlights = guide.artifactProfile?.targets
.slice(0, 2)
.map((target) => `${target.stat}: ${target.value}`) ?? [];
return {
description: "เซ็ตอาร์ติแฟกต์ ค่าสถานะหลัก และเป้าหมายที่ควรจัด",
highlights: [...artifactHighlights, ...targetHighlights],
};
}
if (slug === "team") {
return {
description: "ทีมแนะนำพร้อมสมาชิกและเวลาหมุนคอมโบ",
highlights: guide.teams
.slice(0, 3)
.map((team) => `${team.title} · ${team.members.length} ตัวละคร`),
};
}
if (slug === "constellations") {
return {
description: "รายละเอียดกลุ่มดาวและพลังที่เพิ่มขึ้นในแต่ละระดับ",
highlights: guide.constellations
.slice(0, 3)
.map((constellation) => `C${constellation.level} ${constellation.name}`),
};
}
const extra = guide.extras.find((item) => item.slug === slug);
return {
description: extra?.title ?? "รายละเอียดเพิ่มเติมของคู่มือ",
highlights: extra?.rows.slice(0, 3).map((row) => row.heading || row.body) ?? [],
};
}
export default async function Image({
params,
}: {
params: Promise<{ character: string; page: string }>;
params: Promise<{ character: string }>;
}) {
await connection();
const { character, page } = await params;
const guide = await getCachedPublicGuide(character);
const section = guide
? publicSections(guide).find((item) => item.slug === page)
: null;
if (!guide || !section) return new Response("Not found", { status: 404 });
const content = sectionContent(guide, page);
const guide = await getCachedPublicGuide((await params).character);
if (!guide) return new Response("Not found", { status: 404 });
const recommendedWeapon = guide.weapons[0];
const recommendedArtifact = guide.artifactGroups.find(
(group) => group.rows.length > 0,
)?.rows[0];
return generateOgImage({
title: guide.name,
sub: `${sectionTitle(page, section.title)} · ${content.highlights.join(" · ") || content.description}`,
sub: guide.overview,
characterCard: true,
backgroundUrl: guide.character.nameCardImageUrl,
characterUrl: guide.character.splashImageUrl ?? guide.character.imageUrl,
recommendedWeapon: recommendedWeapon
? {
name: recommendedWeapon.weapon.name,
refinement: recommendedWeapon.refinement,
rarity: recommendedWeapon.weapon.rarity,
imageUrl: recommendedWeapon.weapon.imageUrl,
overallPercent: recommendedWeapon.overallPercent,
personalPercent: recommendedWeapon.personalPercent,
}
: null,
recommendedArtifact: recommendedArtifact
? {
first: {
name: recommendedArtifact.first.name,
rarity: recommendedArtifact.first.rarity,
imageUrl: recommendedArtifact.first.imageUrl,
},
second: recommendedArtifact.second
? {
name: recommendedArtifact.second.name,
rarity: recommendedArtifact.second.rarity,
imageUrl: recommendedArtifact.second.imageUrl,
}
: null,
percent: recommendedArtifact.percent,
}
: null,
});
}
+2 -2
View File
@@ -9,9 +9,9 @@ type Params = Promise<{ character: string; page: string }>;
export async function generateMetadata({ params }: { params: Params }): Promise<Metadata> {
await connection();
const { character, page } = await params;
const { character } = await params;
const guide = await getCachedPublicGuide(character);
return guide ? { title: `${page} - ${guide.name} - คู่มือ`, description: guide.overview } : { title: "ไม่พบไกด์" };
return guide ? { title: `${guide.name}`, description: guide.overview } : { title: "ไม่พบไกด์" };
}
export default async function GuideSectionPage({ params }: { params: Params }) {