UPDATE: New data 4.1.5
All checks were successful
Gitea Auto Deploy / Deploy-Container (push) Successful in 40s
All checks were successful
Gitea Auto Deploy / Deploy-Container (push) Successful in 40s
This commit is contained in:
25
src/app/api/data/[name]/route.ts
Normal file
25
src/app/api/data/[name]/route.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
import { getDataCache } from "@/lib/cache/cache"
|
||||
|
||||
export async function GET(
|
||||
req: Request,
|
||||
{ params }: { params: Promise<{ name: string }> }
|
||||
) {
|
||||
const { name } = await params
|
||||
|
||||
const item = getDataCache(name)
|
||||
|
||||
if (!item) {
|
||||
return new Response("Not found", { status: 404 })
|
||||
}
|
||||
|
||||
const headers: Record<string, string> = {
|
||||
"Content-Type": "application/json",
|
||||
"Cache-Control": "public, max-age=3600"
|
||||
}
|
||||
|
||||
if (item.type === "br") {
|
||||
headers["Content-Encoding"] = "br"
|
||||
}
|
||||
|
||||
return new Response(new Uint8Array(item.buf), { headers })
|
||||
}
|
||||
@@ -5,6 +5,11 @@ import { useTranslations } from "next-intl";
|
||||
|
||||
type TFunc = ReturnType<typeof useTranslations>
|
||||
|
||||
function cleanText(text: string): string {
|
||||
if (!text) return ""
|
||||
return text.replace(/<unbreak>(.*?)<\/unbreak>/g, "$1")
|
||||
}
|
||||
|
||||
export function getNameChar(
|
||||
locale: string,
|
||||
t: TFunc,
|
||||
@@ -28,7 +33,7 @@ export function getNameChar(
|
||||
text = `${t("trailblazer")} • ${t(data?.baseType?.toLowerCase() ?? "")}`;
|
||||
}
|
||||
|
||||
return text;
|
||||
return cleanText(text);
|
||||
}
|
||||
|
||||
export function getNameEnemy(locale: string, data: MonsterBasic | undefined): string {
|
||||
|
||||
@@ -24,7 +24,7 @@ export async function checkConnectTcpApi(): Promise<boolean> {
|
||||
|
||||
export async function getCharacterListApi(): Promise<CharacterBasic[]> {
|
||||
try {
|
||||
const res = await axios.get<CharacterBasic[]>("/data/character.json");
|
||||
const res = await axios.get<CharacterBasic[]>("/api/data/avatar_basic");
|
||||
return res.data
|
||||
} catch (error: unknown) {
|
||||
if (axios.isAxiosError(error)) {
|
||||
@@ -38,7 +38,7 @@ export async function getCharacterListApi(): Promise<CharacterBasic[]> {
|
||||
|
||||
export async function getEnemyListApi(): Promise<MonsterBasic[]> {
|
||||
try {
|
||||
const res = await axios.get<MonsterBasic[]>("/data/monster.json");
|
||||
const res = await axios.get<MonsterBasic[]>("/api/data/monster_basic");
|
||||
return res.data
|
||||
} catch (error: unknown) {
|
||||
if (axios.isAxiosError(error)) {
|
||||
|
||||
38
src/lib/cache/cache.ts
vendored
Normal file
38
src/lib/cache/cache.ts
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
import { readFileSync, readdirSync } from "fs"
|
||||
import path from "path"
|
||||
|
||||
type CacheItem = {
|
||||
buf: Uint8Array
|
||||
type: "json" | "br"
|
||||
}
|
||||
|
||||
const cache = new Map<string, CacheItem>()
|
||||
|
||||
const dir = path.join(process.cwd(), "data")
|
||||
|
||||
for (const f of readdirSync(dir)) {
|
||||
const file = path.join(dir, f)
|
||||
|
||||
if (f.endsWith(".json.br")) {
|
||||
const name = f.replace(".json.br", "")
|
||||
const buf = new Uint8Array(readFileSync(file))
|
||||
cache.set(name, {
|
||||
buf,
|
||||
type: "br"
|
||||
})
|
||||
}
|
||||
|
||||
if (f.endsWith(".json")) {
|
||||
const name = f.replace(".json", "")
|
||||
const buf = new Uint8Array(readFileSync(file))
|
||||
|
||||
cache.set(name, {
|
||||
buf,
|
||||
type: "json"
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export function getDataCache(name: string) {
|
||||
return cache.get(name)
|
||||
}
|
||||
1
src/lib/cache/index.ts
vendored
Normal file
1
src/lib/cache/index.ts
vendored
Normal file
@@ -0,0 +1 @@
|
||||
export * from "./cache"
|
||||
Reference in New Issue
Block a user