lineage analytics

This commit is contained in:
2026-07-13 13:26:08 -04:00
parent 7dc5166e90
commit 52174c94dc
2 changed files with 818 additions and 556 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
import { createTRPCRouter, publicProcedure } from "../../utils"; import { createTRPCRouter, publicProcedure, adminProcedure } from "../../utils";
import { z } from "zod"; import { z } from "zod";
import { LineageConnectionFactory } from "~/server/utils"; import { LineageConnectionFactory } from "~/server/utils";
import { env } from "~/env/server"; import { env } from "~/env/server";
@@ -92,4 +92,42 @@ export const lineageMiscRouter = createTRPCRouter({
offlineSecret: publicProcedure.query(() => { offlineSecret: publicProcedure.query(() => {
return { secret: env.LINEAGE_OFFLINE_SERIALIZATION_SECRET }; return { secret: env.LINEAGE_OFFLINE_SERIALIZATION_SECRET };
}), }),
getLineageStats: adminProcedure.query(async () => {
const conn = LineageConnectionFactory();
try {
const res = await conn.execute({
sql: `SELECT * FROM Analytics`,
args: [],
}); });
const rows = res.rows.map((row: any) => ({
playerID: row.playerID as string,
dungeonProgression: safeJsonParse(row.dungeonProgression),
playerClass: row.playerClass as string,
spellCount: row.spellCount as number,
proficiencies: safeJsonParse(row.proficiencies),
jobs: safeJsonParse(row.jobs),
resistanceTable: safeJsonParse(row.resistanceTable),
damageTable: safeJsonParse(row.damageTable),
}));
return { success: true, players: rows };
} catch (e) {
console.error("Failed to fetch lineage analytics:", e);
return { success: false, players: [] };
}
}),
});
function safeJsonParse(val: unknown): unknown {
if (typeof val === "string") {
try {
return JSON.parse(val);
} catch {
return val;
}
}
return val;
}